Các mẫu chỉ nên được sử dụng khi chúng có thể là giải pháp tốt nhất hoặc trợ giúp trong việc tạo ra một giải pháp tốt (bạn có đồng ý không?).
Tôi thấy các mẫu thiết kế đúng như chi tiết thực hiện. Nếu bạn ghi lại các API công khai và lập trình cho tài liệu đó, nói chung, nó sẽ không thành vấn đề (hoặc ảnh hưởng đến bạn nhiều) khi bạn có các mẫu thiết kế. Đó là, bạn không đi "Tôi có một mẫu cầu ở đây và tôi sẽ triển khai một khách truy cập trên đầu trang". Thay vào đó, "lớp này sẽ có các triển khai khác nhau trên các hệ điều hành khác nhau nên nó sẽ được thực hiện bằng cách sử dụng một mẫu cầu". Sau đó, khi bạn sử dụng nó, bạn thờ ơ với việc nó được triển khai như một cây cầu - bởi vì bạn nhìn vào API công khai, không phải là một mẫu cầu nối.
người ta thực sự nên đầu tư bao nhiêu vào việc tạo ra các thiết kế linh hoạt, kết hợp lỏng lẻo?
Khớp nối lỏng lẻo có thể đạt được bằng cách tuân theo một bộ quy tắc đơn giản. Nếu bạn tôn trọng những điều này, mã của bạn sẽ được kết nối một cách lỏng lẻo, khi bạn viết nó (tức là bất kỳ nỗ lực nào đã là một phần của quá trình phát triển).
Trong số các quy tắc (không phải là một danh sách đầy đủ):
- xác định giao diện của bạn bằng cách suy nghĩ (hoặc viết) mã máy khách (cách lớp sẽ được sử dụng), chứ không phải lớp sẽ làm gì (nghĩa là mong muốn giao diện, không phải thực hiện)
- "nói, đừng hỏi"
- xây dựng các đối tượng từ các phần đã được tạo
- truyền vào hàm tạo các đối tượng thực tế bạn sẽ sử dụng (không phải nhà máy cho các thành viên, tham số cho nhà máy của tham số hoặc bất cứ thứ gì tương tự).
- DRY (nếu bạn có hai dòng xuất hiện theo cùng một thứ tự ở hai nơi, hãy trích xuất chúng thành một hàm riêng biệt, v.v.).
- Nếu việc tạo một đối tượng là một hoạt động phức tạp hơn, hãy thực hiện việc tạo các phần trung gian như một phương thức / lớp của nhà máy (tức là không có trong phần thân của hàm tạo).
- YAGNI (tạo ra những thứ bạn cần, không phải trước đây).
Các quy tắc này được tuân theo khác nhau, tùy thuộc vào ngôn ngữ, phương pháp phát triển được theo sau bởi nhóm của bạn (ví dụ TDD), các ràng buộc về ngân sách thời gian, v.v.
Ví dụ, trong Java, cách tốt nhất là xác định giao diện của bạn là một interface
và viết mã máy khách trên đó (sau đó, khởi tạo giao diện với một lớp triển khai).
Mặt khác, trong C ++, bạn không có giao diện, vì vậy bạn chỉ có thể viết giao diện dưới dạng một lớp cơ sở trừu tượng; Vì trong C ++, bạn chỉ sử dụng tính kế thừa khi bạn có yêu cầu cao đối với nó (và do đó tránh được các chức năng ảo không cần thiết), nên có thể bạn sẽ không xác định giao diện riêng, chỉ là tiêu đề lớp).
Những người phản đối các mẫu thiết kế nói rằng chi phí cho việc sử dụng các mẫu này thường vượt trội hơn lợi ích.
Tôi nghĩ họ đang làm sai. Nếu bạn viết mã được ghép lỏng lẻo (và DRY), việc tích hợp các mẫu thiết kế vào nó đi kèm với nỗ lực tối thiểu. Nếu không, bạn sẽ phải điều chỉnh mã của mình để thực hiện một mẫu thiết kế.
Nếu bạn phải thực hiện nhiều thay đổi để triển khai một mẫu thiết kế, thì vấn đề của bạn không phải là mẫu thiết kế - đó là cơ sở mã của bạn là nguyên khối và được liên kết chặt chẽ. Đây là một vấn đề thiết kế xấu / tối ưu, không phải là một vấn đề mẫu thiết kế.
Những gì tôi muốn biết, là tôi thực sự cần bao nhiêu nỗ lực để tạo ra các mức độ trừu tượng và thiết kế bổ sung, chỉ cho phép ứng dụng của tôi tuân theo các nguyên tắc OO như khớp nối lỏng lẻo, lập trình cho giao diện, v.v. nó không Bao nhiêu nỗ lực tôi nên đặt trong này?
Các câu hỏi của bạn đưa ra giả định (không nói) rằng lợi ích duy nhất của khớp nối lỏng lẻo là khả năng dễ dàng thực hiện các mẫu thiết kế. Không phải vậy.
Trong số những lợi ích của khớp nối lỏng lẻo là:
- tái cấu trúc và thiết kế lại linh hoạt
- nỗ lực ít lãng phí
- khả năng kiểm tra
- tăng khả năng sử dụng lại mã
- thiết kế đơn giản
- dành ít thời gian hơn cho trình gỡ lỗi
... và một vài người khác không nghĩ đến tôi ngay bây giờ.