2010-05-07 44 views
6

Tôi đã nghiên cứu và triển khai các mẫu thiết kế trong vài năm nay và tôi tự hỏi. Một số mẫu thiết kế mới hơn (kể từ GOF) là gì? Ngoài ra, cái gì nên, tương tự như bản thân tôi, nghiên cứu [trong cách thiết kế phần mềm] tiếp theo?Các mẫu thiết kế/chiến lược thiết kế mới

Lưu ý: Tôi đã sử dụng TDD và UML một thời gian. Tôi tò mò về các thay đổi mô hình mới hơn và các mẫu thiết kế mới hơn.

Trả lời

2

Tôi ngạc nhiên khi không ai đề cập đến cuốn sách của Martin Fowler Patterns of Enterprise Application Architecture. Đây là một cuốn sách nổi bật với hàng chục mẫu, nhiều mẫu được sử dụng trong thiết kế ORM hiện đại (kho lưu trữ, bản ghi hoạt động), cùng với một số mẫu lớp giao diện người dùng. Rat khuyen khich.

+0

Một lần nữa, muốn chỉ ra rằng chúng không thực sự là mẫu thiết kế, chúng là các mẫu kiến ​​trúc. Tương tự, nhưng mức độ cao hơn nhiều. –

1

Một thay đổi lớn từ khía cạnh bảo trì là việc sử dụng DVCS. Nếu bạn không biết ai là những gì hoặc đã không sử dụng một, tôi rất khuyên bạn nên đọc lên trên hai đại gia cứng:

Mercurial (hg): https://www.mercurial-scm.org/
git: http://git-scm.com/

họ đã làm khá một chút để thay đổi quy trình làm việc của môi trường lập trình chung. Không thực sự là một mẫu/thiết kế mà tôi tạo ra, nhưng tôi không nghĩ TDD hoặc UML là các mẫu/thiết kế kỹ thuật ở một mức độ nào đó. Có lẽ nhiều hơn như thực hành phổ biến xung quanh lập trình.

+1

Tôi sẽ không xem xét các công nghệ liên quan đến VC để thay đổi luồng công việc rất nhiều. Tôi đã xem xét TDD và UML bởi vì nó thay đổi cách tiếp cận của bạn để thiết kế và làm việc ra một vấn đề. – monksy

+2

-1, không liên quan đến mẫu thiết kế – harto

2

Tôi là một tín đồ cuồng nhiệt và ủng hộ của PCMEF (now PCBMER) framework

Here's một tổng quan đơn giản của nó. Nó là loại hiểu rằng hệ thống doanh nghiệp là một phức tạp lớn, và bằng cách kết hợp một loạt các mẫu thiết kế khác với nhau vào khung PCMBER (Trình bày, Kiểm soát, Hòa giải, Thực thể và Tài nguyên), thậm chí hệ thống phức tạp nhất vẫn dễ dàng có thể sử dụng và quản lý.

+0

Thú vị .. Tôi sẽ phải xem xét nó. – monksy

4

Có khoảng một số mẫu thiết kế vô hạn. Các mẫu thiết kế chỉ là: một sự tái diễn của các lập trình viên thủ thuật sử dụng để hoàn thành công việc. Điều hữu ích nhất về các mô hình GoF là chúng nổi tiếng như thế nào. Trong đó, họ đã trở thành một ngôn ngữ - chính xác là những gì mà GoF hy vọng đạt được.

Nhiều mẫu khác bạn sẽ tìm thấy trên web và trong văn học là "chỉ" các thủ thuật hữu ích, không quá nhiều ngôn ngữ bạn có thể sử dụng khi nói chuyện với các lập trình viên khác. Điều đó nói rằng, có một số mô hình phát sinh trong mười năm qua, đặc biệt là trong lĩnh vực phát triển web. Xem các mẫu được liệt kê trong số patterns book của Martin Fowler.

+0

Tôi sẽ không nói rằng mô hình là "sự tái diễn các thủ thuật". Tôi nghĩ rằng có khá nhiều hơn một chút so với điều đó. Việc tạo ra một thiết kế tốt đòi hỏi phải có suy nghĩ và hiểu biết về cách thức hoạt động của hệ thống, nó sẽ phát triển như thế nào, ở đâu đòi hỏi sự linh hoạt và không cần đến nó. Có rất nhiều thủ thuật mà các lập trình viên sử dụng để làm cho cuộc sống của họ dễ dàng hơn, nhưng các thủ thuật không nhất thiết phải chuyển tiếp suy nghĩ vào thiết kế của hệ thống. Những người khác có thể không đồng ý, nhưng khi tôi nghe "thủ thuật", tôi nghĩ rằng "phím tắt" và không vững chắc, thiết kế phần mềm. – JasCav

+0

@ Jason điều này phải làm gì với các mẫu thiết kế? Khi bạn giải quyết một vấn đề thiết kế và sau đó sử dụng cùng một ý tưởng về một giải pháp để giải quyết cùng một vấn đề ở nơi khác, bạn sử dụng một mẫu thiết kế. Nó không quảng bá kế hoạch, đó là sự tái diễn của một ý tưởng để giải quyết một vấn đề thiết kế. Phải mất kinh nghiệm để sử dụng các mẫu thiết kế một cách hiệu quả, và giống như chọn một ngôn ngữ nếu bạn làm điều đó ra khỏi quan điểm tôn giáo bạn sẽ thất bại thảm hại. Bạn không _have_ sử dụng các mẫu thiết kế để làm điều gì đó đúng, và rất thường xuyên bạn sử dụng các mẫu thiết kế mà không hề chú ý đến nó. – wilhelmtell

+0

Lý do tôi nói những gì tôi đã làm là do làm thế nào bạn phrased câu trả lời của bạn. Để nói rằng các mẫu thiết kế là "thủ thuật" và GoF chỉ hữu ích vì "chúng trở nên nổi tiếng" là hoàn toàn bỏ qua thực tế là thiết kế tốt yêu cầu lập kế hoạch và hiểu cách xây dựng thiết kế đó với sự hiểu biết TẠI SAO bạn bằng cách sử dụng một thiết kế. Chắc chắn, tôi có thể vô tình vấp ngã vào một thiết kế tốt, giống như một kiến ​​trúc sư có thể vấp phải một cấu trúc tốt cho một tòa nhà. Không có nghĩa là phần mềm hay tòa nhà được thiết kế tốt. Các mẫu thiết kế không chỉ là "thủ thuật". – JasCav

2

Một trong những cái mới hơn mà tôi thấy đặc biệt hữu ích là Domain Driven Design. Không phải là quá nhiều mẫu theo đúng nghĩa của nó, nhưng nhiều hơn là một suy nghĩ - để tập trung vào các đối tượng miền - tức là những thứ bạn mô hình hóa và xây dựng phần còn lại của ứng dụng xung quanh nó.

Tôi thấy rằng nó mang ý nghĩa cho các nguyên tắc mà tất cả chúng ta đã biết trước đây nhưng quá lười biếng để giải quyết - như Nguyên tắc về trách nhiệm duy nhất và Tách mối quan tâm. Bây giờ tôi đặc biệt quan tâm đến hai người đó.

Một trục cải tiến khác cho tôi là TDD và Dependency Injection. Tôi đã khám phá ra rằng với rất nhiều giao diện và lớp học đang triển khai chúng, tôi đã có thể buông bỏ nỗi sợ này chỉ định nghĩa một cái gì đó một lần. Đó không phải là để nói rằng nó là mâu thuẫn với DRY (Đừng lặp lại chính mình) nhiều. Bạn có thể có hai lớp với cùng thuộc tính nếu mục đích của chúng khác nhau. Đóng gói và SRP quan trọng hơn nhiều so với việc chỉ định nghĩa một thuộc tính một lần.

+0

Thats kinda những gì tôi đã nhìn. Từ những thứ kết quả từ OMG ... Tôi thấy rằng không có nhiều thay đổi từ GOF. – monksy

+0

DDD không phải là mẫu thiết kế. Đó là một phong cách kiến ​​trúc kết hợp với một phong cách quản lý khách hàng. –

2

Umm ... không có thứ nào mà mọi người đề cập là mẫu thiết kế.

GOF được viết hoàn toàn bằng Java. Nó khám phá không gian đó khá tốt.Tuy nhiên một khi bạn đi vào các ngôn ngữ khác, một số mẫu không còn cần thiết nữa (Observer hiếm khi được sử dụng trong một ngôn ngữ như C# hỗ trợ sự kiện) và một số mẫu mới xuất hiện. Chọn cho mình những cuốn sách Pro JavaScript Design Patterns hoặc Design Patterns In Ruby và xem điều gì sẽ xảy ra với những con cá mập đứng trong những mô hình rất khác nhau này.

Mục yêu thích của tôi gần đây đã đến từ việc dựa vào chức năng trôi dạt của ngôn ngữ hiện đại. Tôi là một fan hâm mộ lớn của nested closures và các cách chức năng của việc giải quyết một số vấn đề tương tự mà GoF thực hiện (một lần nữa, hãy xem cuốn sách Ruby để biết các ví dụ tuyệt vời). Tôi cũng đang trong tình yêu với ý tưởng của nội bộ domain-specific languages mà mở ra thành một loạt toàn bộ các mẫu thiết kế của riêng mình (bao gồm cả đóng cửa lồng nhau). Ngoài ra sự kiện tập hợp dường như đã sẵn sàng để đạt được nó lớn trong thế giới .Net trong tương lai gần.

Một số khác lớn đã nhấn cảnh nhưng không được thảo luận nhiều trong GoF - có lẽ vì chúng cao cấp hơn sau đó những gì những kẻ đã đi - là Inversion Of Control Containers, Message Bussing, Aspect-Oriented -Chương trình, Model-View-Controller, Model-View-Presenter, Model-View-ViewModel, và ilk của họ.

Nhân tiện, đây không phải là các mẫu thiết kế, nhưng nếu bạn đang muốn tiến bộ vượt ra ngoài TDD, hãy bắt đầu xem xét Phát triển theo hành vi và bối cảnh/đặc điểm kỹ thuật.

+1

+1: các mẫu GoF là Java-esque, ngôn ngữ khác nhau có thành ngữ khác nhau. –

+1

Tôi ngạc nhiên bởi nhận xét của bạn rằng Observer hiếm khi được sử dụng trong C#. Nó được tích hợp vào ngôn ngữ (loại "sự kiện") và khả năng thêm nhiều người đăng ký vào các sự kiện với toán tử + =. Các .NET framework cung cấp các định nghĩa giao diện cho thông báo thay đổi thuộc tính và bộ sưu tập; đây là rất quan trọng cho databinding trong WPF và Silverlight. Nếu mẫu "Observer" không được gọi ra nhiều, đó là vì nó trở thành một khái niệm cốt lõi. –

+0

@Cyclon chính xác là quan điểm của tôi. Sự cần thiết cho các quan sát vẫn còn đó, nhưng việc thực hiện đặt ra trong GoF hiếm khi được sử dụng (tôi chưa xem IObservableCollection nhưng nó có thể làm một cái gì đó tương tự), nó đã được thay thế bởi một tính năng ngôn ngữ. –