Xóa các giá trị được mã hóa cứng và thiết kế phòng thủ so với YAGNI


10

Đầu tiên, một chút về lý lịch. Tôi đang mã hóa một tra cứu từ Tuổi -> Tỷ lệ. Có 7 dấu ngoặc tuổi nên bảng tra cứu có 3 cột (Từ | Đến | Tỷ lệ) với 7 hàng. Các giá trị hiếm khi thay đổi - chúng là tỷ lệ được luật hóa (cột thứ nhất và thứ ba) giữ nguyên trong 3 năm. Tôi đã hiểu rằng cách dễ nhất để lưu trữ bảng này mà không cần mã hóa cứng là trong cơ sở dữ liệu trong bảng cấu hình toàn cầu, vì một giá trị văn bản duy nhất chứa CSV (vì vậy "65,69,0,05,70,74,0,06" là cách các lớp 65-69 và 70-74 sẽ được lưu trữ). Tương đối dễ dàng để phân tích sau đó sử dụng.

Sau đó, tôi nhận ra rằng để thực hiện điều này, tôi sẽ phải tạo một bảng mới, một kho lưu trữ để bọc xung quanh nó, kiểm tra lớp dữ liệu cho repo, kiểm tra đơn vị xung quanh mã hủy kết nối CSV vào bảng và kiểm tra xung quanh việc tra cứu. Lợi ích duy nhất của tất cả công việc này là tránh mã hóa bảng tra cứu.

Khi nói chuyện với người dùng (những người hiện đang sử dụng bảng tra cứu trực tiếp - bằng cách nhìn vào một bản sao cứng), ý kiến ​​khá nhiều là "tỷ lệ không bao giờ thay đổi". Rõ ràng điều đó không thực sự chính xác - tỷ lệ chỉ được tạo ra ba năm trước và trong quá khứ những thứ "không bao giờ thay đổi" đã có thói quen thay đổi - vì vậy đối với tôi để lập trình phòng thủ này, tôi chắc chắn không nên lưu trữ bảng tra cứu ứng dụng.

Ngoại trừ khi tôi nghĩ YAGNI . Tính năng tôi đang triển khai không xác định rằng giá sẽ thay đổi. Nếu giá thay đổi, chúng vẫn sẽ thay đổi, hiếm khi bảo trì thậm chí không được xem xét và tính năng không thực sự đủ quan trọng để mọi thứ sẽ bị ảnh hưởng nếu có sự chậm trễ giữa thay đổi tốc độ và ứng dụng được cập nhật.

Tôi đã quyết định khá nhiều rằng sẽ không có gì có giá trị nếu tôi mã hóa việc tra cứu và tôi không quá quan tâm đến cách tiếp cận của tôi đối với tính năng đặc biệt này. Câu hỏi của tôi là, như một chuyên gia, tôi đã biện minh đúng đắn cho quyết định đó? Các giá trị mã hóa cứng là thiết kế xấu, nhưng sẽ gặp khó khăn trong việc loại bỏ các giá trị khỏi ứng dụng dường như vi phạm nguyên tắc YAGNI.

EDIT Để làm rõ câu hỏi, tôi không quan tâm đến việc thực hiện thực tế. Tôi lo ngại rằng tôi có thể làm điều nhanh, xấu và biện minh bằng cách nói YAGNI, hoặc tôi có thể thực hiện một cách tiếp cận phòng thủ, nỗ lực cao hơn, ngay cả trong trường hợp tốt nhất cuối cùng cũng có lợi ích thấp. Là một lập trình viên chuyên nghiệp, quyết định của tôi để thực hiện một thiết kế mà tôi biết là thiếu sót chỉ đơn giản là đi đến phân tích chi phí / lợi ích?

EDIT Mặc dù tất cả các câu trả lời đều rất thú vị vì tôi nghĩ rằng điều này thuộc về lựa chọn thiết kế của một cá nhân, tôi nghĩ rằng câu trả lời tốt nhất là của @ Corbin@EZ Hart khi họ đưa ra những điều mà tôi đã xem xét trong câu hỏi:

  • sự phân đôi sai của 'loại bỏ chính xác các giá trị được mã hóa cứng' bằng cách di chuyển nó vào cơ sở dữ liệu so với 'áp dụng hiệu quả YAGNI' bằng cách sử dụng mã hóa cứng. Có một tùy chọn thứ ba là đặt bảng tra cứu vào cấu hình ứng dụng, điều này không phát sinh chi phí chính xác và không có hiệu quả của YAGNI. Chúng tôi thường không giới hạn ở một trong hai hoặc quyết định, và sau đó đi đến quyết định chi phí / lợi ích.
  • việc tạo mã có thể giảm chi phí di chuyển các giá trị được mã hóa cứng vào cơ sở dữ liệu và theo cách đó cũng loại bỏ quyết định quá kỹ thuật của tôi để xử lý CSV vào bảng. Có khả năng điều này cũng thêm một vấn đề bảo trì dài hạn với mã được tạo nếu các yêu cầu cơ bản thay đổi cho phương thức tra cứu. Tất cả điều này chỉ ảnh hưởng đến phân tích chi phí / lợi ích và có khả năng là nếu tôi có sẵn sự tự động hóa đó, tôi thậm chí sẽ không xem xét việc mã hóa cứng như thế này.

Tôi đánh dấu câu trả lời của @ Corbin là chính xác vì nó thay đổi các giả định của tôi về chi phí phát triển và có lẽ tôi sẽ thêm một số công cụ tạo mã vào kho vũ khí của mình trong tương lai gần.


Đừng quên, nếu giá thay đổi và tất cả những gì bạn có là các giá trị được mã hóa cứng, bạn có thể làm xáo trộn các tính toán hồ sơ lịch sử khi giá thay đổi (và chúng sẽ, bất kể khách hàng của bạn đang nói gì với bạn).
Andy

Câu trả lời:


6

Bạn đã tìm thấy một lỗ hổng trong quá trình phát triển của bạn. Khi đó là một điều khó khăn để làm điều đúng đắn (tạo bảng, repo, kiểm tra repo, kiểm tra san phẳng ...), các nhà phát triển sẽ tìm ra cách xung quanh nó. Điều này thường liên quan đến việc làm sai. Trong trường hợp này, nó cám dỗ bạn coi dữ liệu ứng dụng là logic ứng dụng. Đừng làm điều đó. Thay vào đó, hãy thêm các tự động hữu ích vào quá trình phát triển của bạn. Chúng tôi sử dụng CodeSmith để tạo mã soạn sẵn, không có ai muốn viết. Sau khi chúng tôi tạo một bảng, chúng tôi chạy CodeSmith và nó tạo ra các DAO, DTO và khai thác các bài kiểm tra đơn vị cho mỗi bảng.

Tùy thuộc vào các công nghệ bạn đang sử dụng, bạn sẽ có các tùy chọn tương tự. Nhiều công cụ ORM sẽ tạo các mô hình từ một lược đồ hiện có. Di chuyển đường ray hoạt động theo hướng ngược lại - bảng từ mô hình. Lập trình meta trong các ngôn ngữ động đặc biệt mạnh trong việc loại bỏ mã soạn sẵn. Bạn sẽ phải làm việc chăm chỉ hơn một chút để tạo ra mọi thứ bạn cần nếu bạn có một ứng dụng đa tầng phức tạp, nhưng nó đáng giá. Đừng để cảm giác, "wow, đây là một cơn đau ở cổ" ngăn bạn làm điều đúng đắn.

Ồ, và đừng lưu trữ dữ liệu của bạn ở định dạng yêu cầu xử lý bổ sung (CSV). Điều đó chỉ cần thêm các bước bổ sung đòi hỏi sự chú ý và thử nghiệm của bạn.


Tôi sẽ không nói rằng di chuyển Rails tạo các bảng từ các mô hình ... Di chuyển Rails mô tả các thay đổi đối với các bảng. Thực hiện di chuyển thay đổi cơ sở dữ liệu. Các thuộc tính mô hình phù hợp với cấu trúc bảng được tạo ra trong thời gian chạy.
kevin cline

Điều này làm tôi thích thú, tôi đã không cân nhắc việc tự động hóa các phần của nỗ lực ban đầu đến mức đó. Và việc tự động hóa đó có nghĩa là tôi có thể thiết lập một bảng đầy đủ thay vì sử dụng CSV để tiết kiệm thời gian. Điều tôi quan tâm là việc duy trì lâu dài mã được tạo. Bằng cách tạo ra nó trước, tôi đã đưa ra một giả định sớm rằng phương pháp thực hiện tra cứu sẽ không bao giờ thay đổi. Tôi đoán nếu đó là một khả năng tôi chỉ nên xem xét điều đó như là một phần của chi phí / lợi ích, làm giảm chi phí của nồi hơi. +1
Rebecca Scott

Câu hỏi là "tôi có nên mã cứng các giá trị khi khách hàng của tôi nói rằng họ sẽ không thay đổi?" và câu trả lời của bạn là "không, và trên thực tế, bạn nên ném ORM vào vấn đề." Tôi không đồng ý. Có những tùy chọn đơn giản hơn sẽ cho phép OP tránh mã hóa cứng. Việc bổ sung lớn vào kiến ​​trúc để hỗ trợ những thứ được chỉ định rõ ràng là không cần thiết là phi đạo đức. Thật không may khi nhiều nhà phát triển có xu hướng làm những việc như vậy. Và tôi phải nói rằng, tôi không đồng ý 100% với đề nghị của bạn là đừng "để cảm giác, 'wow, đây là một cơn đau ở cổ' ngăn bạn làm điều đúng đắn." Những cảm xúc quan trọng!
1172763

10

Để tắt và mở rộng câu trả lời của @ Thorbjørn Ravn Andersen: Giữ tính toán / tra cứu ở một nơi là một khởi đầu tốt.

Quá trình suy nghĩ của bạn về phòng thủ so với YAGNI là một vấn đề phổ biến. Trong trường hợp này, tôi sẽ đề nghị nó được thông báo bởi hai điều nữa.

Thứ nhất - yêu cầu của người dùng được trình bày như thế nào? Họ đã chỉ định khả năng chỉnh sửa của tỷ lệ? Nếu không, phần phức tạp thêm vào của một cái gì đó bạn có thể lập hóa đơn hay không? (hoặc nếu bạn là nhân viên, bạn có thể dành thời gian để làm việc khác không?) Nếu vậy, chắc chắn hãy tiếp tục và cung cấp những gì được yêu cầu hợp lý.

Thứ hai, và có lẽ quan trọng hơn, khả năng chỉnh sửa đơn thuần không có khả năng thực hiện một yêu cầu thực tế trước sự thay đổi được luật hóa. Nếu và khi giá thay đổi, có khả năng sẽ có ngày giới hạn và một số xử lý trước và sau phải xảy ra. Hơn nữa, nếu cùng một giao diện đó phải thực hiện bất kỳ loại xử lý khiếu nại nào, thì tỷ lệ chính xác có thể phải được tra cứu dựa trên ngày có hiệu lực của mục nhập, thay vì ngày thực tế.

Nói tóm lại, tôi lưu ý rằng một yêu cầu có thể chỉnh sửa thực tế thể khá phức tạp, vì vậy trừ khi hoặc cho đến khi nó được bổ sung, đơn giản có khả năng tốt hơn.

Chúc may mắn


1
+1 cho điểm thứ hai của bạn. Tôi không cố gắng đoán ra những gì các cơ quan lập pháp có thể làm trong tương lai.
David Thornley

Làm điều đó trong một chức năng thư viện. Chỉ có một người dùng. Khi và nếu yêu cầu thay đổi, bạn có một nơi để thay đổi. (Bạn có thể cần thêm một chức năng để tìm kiếm giá trị vào một ngày cụ thể.)
BillThor

Câu trả lời hay nhất và đầy đủ nhất, +1
Andy

7

Làm cho việc tra cứu thực tế là một chức năng thư viện. Sau đó, bạn có thể thấy tất cả mã sử dụng tra cứu đó trong kho lưu trữ nguồn của mình, vì vậy bạn biết chương trình nào cần được nâng cấp khi giá thay đổi.


Việc tra cứu sẽ chỉ được thực hiện ở một nơi duy nhất ( PensionRateLookupcó thể giống như một lớp học) sau đó được sử dụng trên toàn cầu. Tôi sẽ làm điều đó bất kể nó được lưu trữ bên ngoài ứng dụng hay được mã hóa cứng, theo cách đó chỉ PensionRateLookupcần duy trì việc thực hiện lớp. Vấn đề của tôi là làm thế nào tôi đã sử dụng YAGNI để đi đến kết luận rằng mã hóa cứng bảng tra cứu có thể chấp nhận được.
Rebecca Scott

Cảm ơn câu trả lời của bạn mặc dù. Giữ việc thực hiện tra cứu ở một nơi chắc chắn là thiết kế tốt.
Rebecca Scott

YAGNI chỉ hợp lệ NẾU bạn có thể gửi các tệp nhị phân mới khi giá thay đổi. Nếu bạn không thể, nhưng bạn có thể thay đổi cấu hình, sau đó biến nó thành giá trị cấu hình được đọc khi bắt đầu với biểu diễn văn bản hiện tại làm mặc định.

Tôi gửi một phiên bản mới thường hàng tuần để thực sự cập nhật tra cứu không phải là vấn đề. Đặt nó vào cấu hình máy khách thực sự tệ hơn vì tôi không thể thay đổi cấu hình máy khách bằng tệp nhị phân mới. Sự thay thế như tôi thấy là việc đưa nó vào cơ sở dữ liệu có nghĩa là rất nhiều nỗ lực.
Rebecca Scott

Vậy thì vấn đề là gì? Khi giá thay đổi, bạn cập nhật mã và giao hàng cho tất cả khách hàng?

2

Hãy để tôi xem nếu tôi có câu hỏi của bạn đúng. Bạn có 2 tùy chọn để triển khai một tính năng: hoặc bạn mã hóa cứng một giá trị và tính năng của bạn rất dễ thực hiện (btu bạn không thích phần mã cứng) hoặc bạn có một nỗ lực rất lớn để "làm lại" rất nhiều việc đã được thực hiện vì vậy bạn có thể phát triển tính năng của bạn một cách sạch sẽ. Đúng không?

Điều đầu tiên xuất hiện trong đầu tôi là "Điều quan trọng nhất khi biết các thực hành tốt là biết khi nào bạn tốt hơn nếu không có chúng".

Trong trường hợp này, nỗ lực rất cao để bạn có thể thực hiện một cách sạch sẽ, cơ hội ảnh hưởng của sự thay đổi này là lớn và lợi nhuận bạn sẽ nhận được là nhỏ (như bạn đã giải thích, có vẻ như nó sẽ không thay đổi).

Tôi sẽ sử dụng cách tiếp cận mã cứng (nhưng chuẩn bị nó sẽ linh hoạt trong tương lai) và, trong trường hợp thay đổi tỷ lệ này trong tương lai, hãy sử dụng cơ hội để cấu trúc lại tất cả phần thiết kế xấu này của mã. Vì vậy, thời gian và chi phí có thể được ước tính chính xác và chi phí thay đổi giá trị mã hóa cứng của bạn sẽ là tối thiểu.

Đây sẽ là cách tiếp cận của tôi :)


Cảm ơn @Oscar. Phần kỹ thuật của nó là def. chính xác. Và tôi đồng ý với cách bạn sẽ tiếp cận vấn đề, bằng cách tái cấu trúc chỉ khi cần thiết. Vì vậy, bạn đang nói rằng là một chuyên gia, chúng ta có thể và nên chọn nguyên tắc thiết kế của mình, chỉ dựa trên chi phí / lợi ích? Có ý nghĩa.
Rebecca Scott

@Ben Scott: Bạn được chào đón :). Vâng, theo quan điểm của tôi, các nguyên tắc thiết kế đã được tạo / phân loại không phải vì chúng trông đẹp mà vì chúng mang lại lợi ích như mã "sạch", linh hoạt, mạnh mẽ, v.v. Nhưng luôn có 2 câu hỏi: 1- Tôi có cần điều đó không ? 2- Các hạn chế của tôi (thời gian, kỹ thuật, v.v.) có cho phép tôi thực hiện không? Đây thường là những gì dẫn tôi chọn nguyên tắc thiết kế của tôi. Kỹ thuật quá mức cũng rất tệ;) ps: nếu bạn nghĩ đó là một câu trả lời thú vị, vui lòng bỏ phiếu để người khác cũng đọc nó với xác suất cao hơn. Cảm ơn! :)
JSBach

nâng cấp ;-)
Rebecca Scott

2

Đây là một mục "sẽ không thay đổi" cho đến khi nó làm. Không thể tránh khỏi việc nó sẽ thay đổi, nhưng thời gian đó có thể hơi xa.

Lời biện minh của bạn là chính xác. Tại thời điểm này, khách hàng không yêu cầu khả năng dễ dàng thay đổi các mức giá đó. Như vậy, YAGNI.

Tuy nhiên, điều bạn không muốn là mã truy cập vào giá của bạn và diễn giải các kết quả nằm rải rác trong cơ sở mã. Thiết kế OO tốt sẽ giúp bạn gói gọn biểu diễn bên trong của tỷ lệ của bạn trong một lớp và chỉ hiển thị một hoặc hai phương thức cần thiết để sử dụng dữ liệu.

Bạn sẽ cần đóng gói đó để ngăn chặn các lỗi sao chép và dán hoặc phải thực hiện tái cấu trúc trên tất cả các mã sử dụng tỷ lệ khi bạn cần thay đổi biểu diễn bên trong. Khi bạn thực hiện biện pháp phòng ngừa ban đầu đó, cách tiếp cận phức tạp hơn có thể là một trao đổi đơn giản và thay thế cho phiên bản nổi bật hơn.

Ngoài ra, gọi ra giới hạn của thiết kế hiện tại cho khách hàng. Nói với họ rằng vì lợi ích của việc duy trì lịch trình, bạn khó mã hóa các giá trị - đòi hỏi phải thay đổi mã hóa để cập nhật chúng. Theo cách đó, khi họ nhận thức được các thay đổi về tỷ lệ chờ xử lý do luật mới, họ có thể chọn chỉ cập nhật bảng tra cứu hoặc thực hiện thay đổi phức tạp hơn tại thời điểm đó. Nhưng đặt quyết định đó trong lòng họ.


Cảm ơn @berin, tôi đã không đề cập đến SRP trong câu hỏi nhưng nó nằm trong kế hoạch. Điểm tốt là trao lại quyền sở hữu của vấn đề cho khách hàng.
Rebecca Scott

Việc đổ lỗi cho sự cố xảy ra trong tương lai không có vẻ chuyên nghiệp đối với tôi.
Andy

@Andy, phần nào trong đó là gán lỗi? Trình bày các giới hạn thiết kế cho khách hàng cho phép họ có cơ hội ưu tiên công việc phức tạp ngay bây giờ và loại bỏ các công việc khác khỏi bàn, đẩy lùi thời hạn hoặc chấp nhận thiết kế hạn chế ngay bây giờ vì những thứ khác trên bàn quan trọng hơn với họ. Bạn đang trao quyền cho khách hàng của bạn với sự lựa chọn về sản phẩm của họ. Làm cho khách hàng của bạn nhận thức được rủi ro / phần thưởng của các lựa chọn bạn muốn thực hiện vì lợi ích của họ sẽ giúp dự án chạy trơn tru hơn.
Berin Loritsch 29/07/2015

@BerinLoritsch Nhưng quyết định thiết kế đặc biệt này gần giống với việc sử dụng các bộ phận không đạt tiêu chuẩn với nội dung "Tôi có thể sử dụng putty thợ ống nước để cắm ống bị rò rỉ này, đó là lựa chọn rẻ nhất của bạn!" Tỷ lệ S change thay đổi. Đó là một sự nhất định và vô trách nhiệm đối với một chuyên gia để xây dựng một hệ thống không cho phép nó. Và các khoản tiết kiệm có lẽ không đáng kể trong sơ đồ lớn về chi phí của dự án. Đặt dữ liệu vào một bảng; mã nhận được dữ liệu tra cứu hơi khác nhau, logic tìm ra tốc độ sử dụng là như nhau. Quyết định duy nhất khác là làm thế nào để xử lý dữ liệu lịch sử sau ...
Andy

tỷ lệ thay đổi, thường được xử lý bằng cách chỉ sao chép tỷ lệ vào hồ sơ liên quan. Không cần màn hình quản trị tại thời điểm này, hệ thống có thể xử lý khi giá thay đổi và sẽ là tập lệnh đơn giản để thay đổi chúng. Không ai trong số này nên nhiều hơn một vài giờ, nhưng sẽ ngăn tầng hầm bị ngập lụt vào năm tới khi putty thất bại.
Andy

2

Phân chia sự khác biệt và đặt dữ liệu tốc độ trong một cài đặt cấu hình. Bạn có thể sử dụng định dạng CSV mà bạn đã có, bạn tránh được chi phí cơ sở dữ liệu không cần thiết và nếu cần thay đổi, đó sẽ là thay đổi mà khách hàng có thể thực hiện mà không phải biên dịch lại / cài đặt lại và không gây rối xung quanh trong cơ sở dữ liệu - họ chỉ có thể chỉnh sửa tệp cấu hình.

Thông thường khi bạn đang xem xét lựa chọn giữa hai thái cực (vi phạm dữ liệu động YAGNI so với dữ liệu động mã hóa cứng), câu trả lời tốt nhất là ở đâu đó ở giữa. Coi chừng sự phân đôi giả.

Điều này giả định tất cả các cấu hình của bạn là trong các tập tin; Nếu nó ở đâu đó khó khăn như registry, có lẽ bạn nên bỏ qua lời khuyên này :)


Tôi đã cân nhắc việc đặt nó trong cài đặt cấu hình nhưng đặt nó sang một bên vì người dùng không chuyên về kỹ thuật chỉnh sửa chuỗi CSV, vì vậy tôi sẽ là người cập nhật cấu hình cho người dùng N (vì tôi hỗ trợ tất cả về CNTT org cũng vậy), về mặt nỗ lực, việc thực hiện công việc trả trước sẽ dễ dàng hơn để đưa nó vào cơ sở dữ liệu mà tôi có thể quản lý từ một nơi. Tôi cho rằng nếu đó không phải là một sự cân nhắc (nếu người dùng có khả năng quản lý cấu hình cá nhân của họ) thì tôi sẽ không gặp vấn đề này. Vì vậy, một điểm rất tốt, cảm ơn bạn.
Rebecca Scott

Nếu bạn kết hợp điều này với các đề xuất khác về logic tập trung thì đó là một câu trả lời tuyệt vời. Thật là xấu xa khi thực sự tìm kiếm khó khăn hơn là đưa vào một cách cho phép nó được thay đổi thông qua cấu hình. Bất cứ khi nào bất kỳ nhà phát triển khác đi qua nó, họ sẽ ghét bạn vì điều đó. Ngay cả một cửa hàng phát triển một người đàn ông cũng nên xem xét điều gì xảy ra nếu họ bị xe buýt đâm và sẽ giúp nhà phát triển tiếp theo dễ dàng thay đổi các giá trị mà không cần phát hành phần mềm đầy đủ. Chỉ khi bạn ghét khách hàng và ghét tất cả các nhà phát triển khác thì bạn mới nên làm điều đó. Vì vậy, về cơ bản không bao giờ.
simbo1905

2

Tôi đã hiểu rằng cách dễ nhất để lưu trữ bảng này mà không cần mã hóa cứng là trong cơ sở dữ liệu trong bảng cấu hình toàn cầu, vì một giá trị văn bản duy nhất chứa CSV (vì vậy "65,69,0,05,70,74,0,06" là cách các tầng 65-69 và 70-74 sẽ được lưu trữ.

Chỉ cần tạo Bảng DB. (Bạn nghĩ đến việc lưu trữ toàn bộ một bảng trong một lần nộp, bạn đã phát điên chưa?)

Bảng cần 2 trường KHÔNG 3. Tuổi và Tỷ lệ. Hàng tiếp theo này chứa giá trị trên! Bạn đang bình thường hóa mà không hề biết điều đó!

Đây là Sql để có được tỷ lệ cho một người ở tuổi 67.

Select * from RateTable where Age in (Select max(age) from RateTable where age <=67) 

Đừng bận tâm để làm một màn hình bảo trì vì nó nằm ngoài phạm vi. Nếu họ yêu cầu sau, hãy đưa ra yêu cầu thay đổi và thực hiện.

EDIT: Như những người khác đã nói giữ mã, lấy tỷ lệ tập trung, trong trường hợp toàn bộ cấu trúc tỷ lệ chage.


Xin chào @Morons, cảm ơn câu trả lời của bạn. Bảng thực sự sẽ cần 3 cột. Đó là một tỷ lệ duy nhất cho mỗi phạm vi của lứa tuổi, min tuổi đến tuổi max (65-69 tuổi đang trên 5%). Và tôi chỉ lưu trữ một lượng nhỏ dữ liệu cho mục đích hạn chế, vậy có gì sai khi đưa ra giả định cấu trúc lại và sử dụng CSV thay vì toàn bộ bảng chuyên dụng? Tôi có thể sẽ thêm một dấu phân cách hàng và phân chia theo hàng sau đó cột và kéo các cột vào các trường bắt buộc. Điều này sẽ luôn được đọc nhiều hơn viết ra để tôi không quá lo lắng về một bảng đầy đủ.
Rebecca Scott

Hàng tiếp theo Chứa giá trị trên của phạm vi ... Đây là sự trùng lặp dữ liệu. Nói <69 và> 7 là như nhau. Lý do duy nhất để có cả hai giá trị là nếu phạm vi có thể có Lỗ. ... Tôi đang nói sử dụng bảng vì điều đó dễ dàng hơn (và thiết kế tốt hơn). Tôi không hiểu tại sao bạn nghĩ lưu trữ csv trong bảng sẽ giúp bạn tiết kiệm thời gian hoặc công sức, Bạn vẫn cần một cuộc gọi DB chỉ để có được chuỗi đó, sau đó bạn phải phân tích cú pháp. Như tôi đã chỉ ra ở trên, bạn có thể nhận được tốc độ chỉ bằng một cuộc gọi DB.
Morons

À đúng rồi. Tôi đã giữ bảng tương tự như tài liệu nguồn ... và tôi đã bỏ lỡ rằng tuổi là giới hạn trên trong câu trả lời của bạn bởi vì tôi có những nỗi buồn mà tôi đã cho bạn những nỗi buồn.
Rebecca Scott

1
"Bạn đang làm mất tinh thần mà không hề biết điều đó!" - lúc đầu tôi nghĩ đây là một lỗi đánh máy và ý bạn là 'không chuẩn hóa', nhưng tôi càng nghĩ về nó thì dường như bạn cũng có thể đúng :)
EZ Hart

@ez hart LOL thật.
Rebecca Scott

1

Tôi đồng ý với hầu hết các câu trả lời được đưa ra. Tôi cũng thêm rằng tính nhất quán với phần còn lại của ứng dụng là quan trọng. Nếu đây là nơi duy nhất trong mã có các giá trị được mã hóa cứng, nó có thể sẽ gây bất ngờ cho các nhà bảo trì. Điều này đặc biệt đúng nếu đó là một cơ sở mã lớn, ổn định. Nếu đó là một chương trình nhỏ do bạn duy trì thì quyết định sẽ ít quan trọng hơn.

Tôi có một ký ức xa xôi khi đọc một anh chàng nhanh nhẹn / OOP nổi tiếng (như Dave Thomas hoặc Kent Beck hoặc ai đó) nói rằng quy tắc ngón tay cái của họ để sao chép mã là hai lần và chỉ hai lần: không tái cấu trúc lần đầu tiên bạn sao chép bạn chỉ có thể viết nó hai lần trong đời. Nhưng lần thứ ba ...

Điều đó không giải quyết chính xác câu hỏi, vì bạn đang đặt câu hỏi cho YAGNI nhưng tôi nghĩ nó nói lên tính linh hoạt chung của các quy tắc nhanh. Điểm nhanh nhẹn là thích nghi với hoàn cảnh và tiến về phía trước.


Cảm ơn @Dave, điều đó hữu ích. Tôi là người duy trì duy nhất, từ khi thành lập, nhưng nó là một cơ sở mã lớn, tương đối ổn định (hàng ngàn tệp, hơn 100 bảng, v.v.) và tôi vẫn không ngừng ngạc nhiên (và mất tinh thần). Kiên định chắc chắn là một trong những mục tiêu của tôi trong tương lai.
Rebecca Scott

0

Mã cứng trong một chức năng.

  • Khi giá trị thay đổi, bạn có thể lập hóa đơn cho khách hàng một lần nữa
  • Khi các giá trị thay đổi, rất có thể định dạng bảng sẽ phải thay đổi, làm CSV sẽ lãng phí thời gian
  • Thực hiện dễ dàng hơn, cơ hội ngân sách cao hơn với hợp đồng hiện tại
  • Có thể dễ dàng tìm thấy khi cần cập nhật

Hãy để tôi cài đặt giá trị không đạt tiêu chuẩn này để khi nó chắc chắn phá vỡ trong một năm tôi sẽ kinh doanh lặp lại. Nghe có vẻ mờ ám, bởi vì nó là.
Andy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.