Khi nào thích một giải pháp tổng quát hơn là giải quyết các trường hợp cụ thể


18

Trong lập trình, chúng ta thường phải đối mặt với một lựa chọn: bao gồm từng trường hợp sử dụng có thể hiểu được hoặc giải quyết vấn đề chung:

XKCD - Vấn đề chung

Rõ ràng là giải quyết vấn đề trước mắt là nhanh hơn, tuy nhiên việc tạo ra một giải pháp tổng quát sẽ tiết kiệm thời gian trong tương lai.

Làm thế nào để tôi biết khi nào tốt nhất để thử và bao gồm một danh sách các trường hợp hữu hạn, hoặc tạo một hệ thống chung để bao quát tất cả các khả năng?


4
Tại sao rất nhiều downvote?
Pureferret

3
Có vẻ như một câu hỏi hợp lý với tôi. Dường như bạn có một bản chỉnh sửa chưa hoàn thành; bạn có thể muốn chăm sóc điều đó.
Stuart Marks


@gnat đó là giữa các chương trình / dự án khác nhau. Tôi đang hỏi về cùng một dự án / kịch bản.
Pureferret

Quá mơ hồ. Bao gồm tất cả các trường hợp giải quyết vấn đề chung. Sau đó, vấn đề là bạn viết mã như thế nào.
Caleb

Câu trả lời:


29

Đầu tiên, bạn vượt qua muối. Sau đó, bạn vượt qua hạt tiêu. Sau đó, bạn vượt qua phô mai parmesan bào. Tại thời điểm này, bạn có đủ kinh nghiệm để bắt đầu phát triển một hệ thống truyền gia vị chung.

Nó hoạt động trong các dự án phần mềm theo cùng một cách: sử dụng các hệ thống mục đích đặc biệt mà bạn phát triển như các bước học tập của mình để tổng quát hóa, vì vậy khi đến lúc bắt đầu hệ thống mục đích chung của bạn, bạn có niềm tin tốt hơn vào những gì bạn đang xây dựng, bởi vì bạn có một số hệ thống mục đích đặc biệt dưới vành đai của bạn.


4
Đây là một câu trả lời tuyệt vời!
Pureferret

Và đây là lý do tại sao đá Agile.
Euphoric


9

Làm thế nào để tôi biết khi nào tốt nhất để thử và bao gồm một danh sách các trường hợp hữu hạn, hoặc tạo một hệ thống chung để bao quát tất cả các khả năng?

Kinh nghiệm.

Cách duy nhất để biết là đã thử một con đường trước đó, xem cách nó cắn vào mông bạn (hoặc bạn đã lãng phí rất nhiều thời gian). Lặp lại cho đến khi bạn nhận được bit trong ass ít hơn.

Ngay cả sau đó, bạn không thực sự biết ; bạn chỉ cần đoán tốt hơn


3

Để xây dựng các câu trả lời từ dasblinkenlightPaddy3118 , nếu bạn không có nhiều trường hợp để thực hiện, thì bạn không cần phải khái quát! Lý do phim hoạt hình XKCD hài hước là vì nó chiếu phim sớm . Khi được yêu cầu chuyển muối, nhân vật vô hình lập tức nhảy vào "phát triển một hệ thống để vượt qua các gia vị tùy ý" khi tất cả các nhân vật đầu tiên được yêu cầu là muối. Đây là một trò đùa tốt cho các nhà phát triển, vì tôi nghĩ rằng tất cả chúng ta đều đã thấy các trường hợp khái quát hóa sớm.

Nguyên tắc trái ngược với khái quát hóa sớm là YAGNI (You Ain't Gonna Need It). Có rất nhiều tài liệu về điều này có sẵn trên web, nhưng về cơ bản YAGNI chỉ ra một số rủi ro trong việc khái quát hóa mà không có lợi ích của một số trường hợp sử dụng thực tế trong tay, bao gồm cả khả năng nhiều trường hợp sử dụng có thể không thực sự xuất hiện. Hay nói một cách tinh tế hơn, việc thiếu các trường hợp sử dụng thực tế đòi hỏi người ta phải đưa ra các giả định về những gì cần thiết trong tương lai. Những giả định này có thể, và thường là, không chính xác.


2

Có vẻ như chung chung nhỏ hơn, nghĩa là không tạo một lớp để xử lý bảng tra cứu ánh xạ các số nguyên thành chuỗi khi bạn có thể tạo một lớp từ điển hợp lý xử lý bất kỳ cặp loại nào (trong đó loại đầu tiên hỗ trợ một số loại so sánh).

Ở kiếp trước, tôi đã làm rất nhiều dự án tự động hóa công nghiệp cho máy móc xử lý một mạng lưới vật liệu liên tục. Thép, nhôm, giấy, nhựa, .... Bạn hủy bỏ nó ở một đầu và cuộn lại ở đầu kia sau khi làm một cái gì đó hữu ích ở giữa. Trong một ngành, bạn bắt đầu ở "guồng xuất chi", không phải là "không mong muốn". Nếu bạn sử dụng thuật ngữ sai thì bạn là một thằng ngốc trong con mắt hàng triệu đô la của khách hàng. Bạn sẽ ngạc nhiên về việc ít có thể được trừu tượng hóa để tái sử dụng từ dự án này sang dự án tiếp theo. OTOH, người ta thường có thể tạo một khung hoặc mẫu làm điểm bắt đầu. Nó sẽ được tùy chỉnh cho công việc trong tay, nhưng ít nhất nó có lợi ích của việc học hỏi từ các dự án trước đó. Và mọi người trong đội đều biết chúng tôi bắt đầu từ đâu.


2

Làm một lần, làm hai lần, làm ba lần, khái quát hóa.


1

Một, hai, nhiều!

Trong trường hợp thứ hai, bạn nên suy nghĩ về khái quát. Khi được yêu cầu thứ ba, bạn nên cung cấp nó từ mã tổng quát và sử dụng trường hợp thứ nhất và thứ hai được giải quyết riêng lẻ như các trường hợp thử nghiệm.

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.