Chọn mẫu thiết kế phù hợp


32

Tôi đã luôn nhận ra tầm quan trọng của việc sử dụng các mẫu thiết kế. Tôi tò mò về cách các nhà phát triển khác đi về việc chọn một cái phù hợp nhất. Bạn có sử dụng một loạt các đặc điểm (như sơ đồ) để giúp bạn quyết định không?

Ví dụ:

Nếu các đối tượng có liên quan, nhưng chúng tôi không muốn chỉ định lớp cụ thể, hãy xem xét Tóm tắt

Khi khởi tạo được để lại các lớp dẫn xuất, hãy xem xét Factory

Cần truy cập các phần tử của một đối tượng tổng hợp một cách tuần tự, hãy thử Iterator

hoặc một cái gì đó tương tự?


8
Bạn nghĩ tầm quan trọng là gì? lập trình
viên.stackexchange.com/questions / 70877 / Google

Tôi nghĩ tầm quan trọng nằm ở khả năng nhận ra mô hình phù hợp và toàn diện nhất, để cuối cùng có thể truyền đạt điều đó đến các nhà phát triển khác. Nếu điều đó hợp lý?
Carl Sagan

Tôi đồng ý với @pdr. Tôi nghĩ về những gì tôi cần làm và việc nhớ tên của mẫu giúp tôi đặt tên cho Class để những người khác biết nó cũng làm gì.
Amy Blankenship

4
Thật. Điều này có thể chỉ đơn giản là được đun sôi thành "Làm thế nào để bạn chọn đúng thiết kế?". Đầu tiên, không có thiết kế đúng , chỉ có nhiều cái sai. Ngoài ra, nó đi kèm với kinh nghiệm cọc (chọn sai).
Telastyn

Câu trả lời:


109

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 Singletonkia 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ó).


11
+1 cho "giải pháp tìm kiếm một vấn đề." Biết các mẫu sẽ cho phép bạn bỏ qua khám phá tự nhiên về chúng khi hóa ra bạn cần giải quyết một vấn đề chúng xảy ra để giải quyết. Tìm hiểu về họ có thể sẽ giúp cải thiện kỹ năng mã hóa và thiết kế của bạn, giống như cách đọc mã của người khác hoặc học ngôn ngữ lập trình khác. Nhưng bạn chắc chắn không nên chủ động cố gắng "khớp mẫu" với mã của mình.
gregmac

1
Tôi luôn khuyên các nhà phát triển bắt đầu xem xét các mẫu để trước tiên làm quen với các nguyên tắc thiết kế. Mỗi mẫu là một minh họa cho một số nguyên tắc thiết kế (Bộ nguyên tắc 'RẮN' chỉ là một ví dụ).
ryscl

2
Có thể bạn thêm một trang trí và mặt tiền bạn có một ứng dụng ;-) Nói một cách khác, quan điểm của các mẫu thiết kế là đặt cho chúng tôi một tên, một ngôn ngữ phổ biến khi thảo luận về những gì chúng ta đang xây dựng. Đó là viết tắt của một đống kiến ​​thức phát triển khó giành được.
EBarr

2
Đọc giữa các dòng ở đây, các bước để chọn mẫu thiết kế: 1. Luôn luôn suy nghĩ nghiêm túc về bất kỳ mã nào bạn đang làm việc. 2. Tóm tắt mã cụ thể vào một vấn đề cơ bản 3. Vấn đề đó có giải pháp đã biết không (mẫu thiết kế )? 4. Có, làm thế nào để tôi áp dụng giải pháp đó vào chi tiết cụ thể của mình? 5. Thích ứng giải pháp chung cho vấn đề trừu tượng, để tạo ra giải pháp cho vấn đề cụ thể của bạn.
Chris

@Chris mà thực sự tổng hợp nó. Cũng không có gì sai khi viết nó mà không có các mẫu và sau đó tái cấu trúc mã thành mẫu phù hợp nếu thiết kế cần nó.

18

Tôi tự hỏi:

  1. Vấn đề gì tôi đang cố gắng giải quyết?
  2. Mẫu thiết kế phần mềm nào (nếu có) giải quyết chặt chẽ nhất cùng một vấn đề hoặc cung cấp một đường dẫn hợp lý để giải quyết vấn đề của tôi?
  3. Tôi có cần sự trừu tượng hóa bổ sung (và độ phức tạp) mà mẫu cung cấp không, hay nó có quá kỹ thuật cho vấn đề cụ thể của tôi không? Vấn đề có thể được giải quyết một cách đơn giản, hiệu quả hơn mà không cần mô hình không?

Quá trình chọn mẫu phần mềm không giống như quy trình chọn cấu trúc dữ liệu, ngoại trừ khi chọn cấu trúc dữ liệu, bạn sẽ đánh giá hiệu suất và đặc điểm bộ nhớ của vấn đề của mình và chọn cấu trúc dữ liệu phù hợp nhất với các đặc điểm đó.


Tất nhiên, đó là một số điều về kinh nghiệm và chuyên gia, thay vì một kế hoạch chi tiết hoặc biểu đồ dòng chảy, và tôi đồng ý với bạn. Nhưng phải có một số sử dụng toàn bộ tài nguyên như một bảng cheat nâng cao trong đó nó đã được phân loại, ít nhất là trong trường hợp với các mẫu quan trọng nhất và thường xuyên như nhà máy, v.v. mà bạn nên sử dụng một mô hình. Bạn có biết một nguồn tài nguyên như vậy trên internet không?!
Pmpr

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.