Một quan niệm sai lầm quan trọng trong thế giới mã hóa ngày nay là các mẫu đang xây dựng các khối. Bạn lấy một cái AbstractFactory
ở đây và Flyweight
ở đó và có thể ở đằng Singleton
kia và kết nối chúng lại với nhau bằng XML và thế là bạn đã có một ứng dụng hoạt động.
Họ không phải.
Hmm, nó không đủ lớn.
Mô hình không phải là khối xây dựng
Cái đó tốt hơn.
Mẫu là thứ bạn sử dụng khi bạn thấy có vấn đề - bạn cần một sự linh hoạt mà mẫu đó cung cấp hoặc bạn đã vấp ngã khi bạn tạo một ngôn ngữ nhỏ trong tệp cấu hình và bạn nói "chờ đã một lát, dừng lại, đây là trình thông dịch riêng mà tôi đang viết - đây là một vấn đề đã biết và đã được giải quyết, hãy sử dụng mẫu Phiên dịch . "
Nhưng lưu ý ở đây, đó là thứ bạn khám phá trong mã của mình, không phải thứ bạn bắt đầu. Những người tạo ra Java đã không nói "Ồ, chúng ta sẽ đặt một Flykg trong Integer" khi bắt đầu, nhưng thay vào đó nhận ra một vấn đề hiệu năng có thể được giải quyết bằng một con ruồi .
Và do đó, không có "biểu đồ dòng chảy" mà bạn sử dụng để tìm đúng mẫu. Mẫu này là một giải pháp cho một loại vấn đề cụ thể đã gặp phải nhiều lần và các phần chính của nó được chưng cất thành Mẫu.
Bắt đầu với Mô hình giống như có một giải pháp và tìm kiếm một vấn đề. Đây là một điều xấu: nó dẫn đến kỹ thuật quá mức và cuối cùng là không linh hoạt trong thiết kế.
Khi bạn đang viết mã, khi bạn nhận ra rằng bạn đang viết Factory, bạn có thể nói "ah ha! Đó là một nhà máy tôi sắp viết" và sử dụng kiến thức của bạn về việc biết mẫu Factory để viết nhanh bit tiếp theo mã mà không cố gắng khám phá lại mẫu Factory. Nhưng bạn không bắt đầu với "Tôi đã có một lớp học ở đây, tôi sẽ viết một nhà máy cho nó để nó có thể linh hoạt" - bởi vì nó sẽ không.
Đây là một đoạn trích từ một cuộc phỏng vấn với Erich Gamma (của Gamma, Helm, Johnson và Vissides ): Cách sử dụng các mẫu thiết kế :
Cố gắng sử dụng tất cả các mẫu là một điều xấu, bởi vì bạn sẽ kết thúc với các thiết kế tổng hợp Các thiết kế đầu cơ có tính linh hoạt mà không ai cần. Ngày nay phần mềm quá phức tạp. Chúng tôi không thể đủ khả năng để suy đoán những gì nó nên làm. Chúng ta cần thực sự tập trung vào những gì nó cần. Đó là lý do tại sao tôi thích tái cấu trúc các mẫu. Mọi người nên biết rằng khi họ có một loại vấn đề hoặc mùi mã đặc biệt, như mọi người gọi nó ngày nay, họ có thể đi đến hộp công cụ mẫu của họ để tìm giải pháp.
Sự trợ giúp tốt nhất cho "sử dụng cái gì, khi nào" có lẽ là trang Wikipedia cho mẫu thiết kế phần mềm - phần "Phân loại và danh sách" mô tả danh mục mà mỗi mẫu nằm trong và những gì nó làm. Không có sơ đồ; mô tả có lẽ là tốt nhất bạn sẽ tìm thấy như một đoạn ngắn cho "sử dụng cái gì, khi nào."
Lưu ý rằng bạn sẽ tìm thấy các mẫu khác nhau trong các lĩnh vực lập trình khác nhau. Thiết kế web có bộ mẫu riêng trong khi JEE (không phải thiết kế web) có bộ mẫu khác. Các mẫu cho lập trình tài chính hoàn toàn khác với các mẫu cho thiết kế UI ứng dụng độc lập.
Vì vậy, bất kỳ nỗ lực để liệt kê tất cả chúng là không đầy đủ. Bạn tìm thấy một, tìm ra cách sử dụng nó và rồi cuối cùng nó trở thành bản chất thứ hai và bạn không cần phải suy nghĩ về cách thức hoặc thời điểm sử dụng nó một lần nữa (cho đến khi ai đó yêu cầu bạn giải thích nó).