2010-06-21 23 views
41

Có tập hợp các phương pháp hay nhất cho các ngôn ngữ như Scala không?Các mẫu thiết kế cho các ngôn ngữ lai-hàm OO?

Tôi đã tìm được tác phẩm trên các mẫu thiết kế cho các ngôn ngữ chức năng, Design patterns for functional strategic programming. Có GoF mẫu thiết kế cho các ngôn ngữ OO. Nhưng liệu có bất kỳ mô hình nào cho các giống lai OO chức năng? Tất cả những gì tôi thấy là danh sách this. Những gì được biết?

+0

Liên kết cuối cùng bị hỏng (gần "Tất cả những gì tôi đã thấy"). –

+1

Bạn có thể xem http://pavelfatin.com/design-patterns-in-scala/ –

Trả lời

19

Hai mẫu từ Bill Venners; Tôi nghĩ rằng cả hai đều được sử dụng nhiều trong ScalaTest:

Stackable Trait (tương tự cấu trúc cho mẫu trang trí, ngoại trừ việc trang trí cho mục đích của thành phần lớp thay vì thành phần đối tượng).

Selfless Trait (cho phép nhà thiết kế thư viện cung cấp dịch vụ mà khách hàng của họ có thể truy cập thông qua kết hợp hoặc nhập).

Type safe builder

Independently Extensible Solutions to the Expression Problem - giống như "Scalable phần trừu tượng", nó không phải là một cửa hàng mô hình, nhưng nó cũng thỏa thuận với vấn đề tương tự (ví dụ như mô hình của khách)

Deprecating the Observer Pattern - một thay thế cho Observer .

Chúng tôi cũng có thể xem xét mô phỏng Scala của Haskell loại lớp là mẫu thiết kế. Mô tả đầu tiên (mà tôi có thể tìm thấy ít nhất) là trong Poor Man's Type Classes. Khá nhiều mục blog cũng có sẵn với chủ đề này.

Và tôi nghĩ rằng tôi không hoàn toàn sai nếu tôi cũng đề cập đến các monads khác nhau. Bạn có thể tìm thấy rất nhiều tài nguyên giao dịch với họ.

12

Mặc dù không trực tiếp một cửa hàng mẫu thiết kế riêng của mình, các giấy "Scalable Component Abstractions" (Martin Odersky; Matthias Zenger) xem xét ba khối xây dựng cho các thành phần tái sử dụng:

  • thành viên loại trừu tượng,
  • selftypes rõ ràng, và
  • thành phần kết hợp mô-đun.

Và nó xem lại một số mẫu thiết kế (xuất bản/đăng ký, chủ đề/người quan sát, Ngữ cảnh/Thành phần) để minh họa và hiểu cấu trúc ngôn ngữ là cần thiết để đạt được hệ thống của các thành phần có thể mở rộng và năng động.

5

Một mẫu được quan sát thường xuyên, vốn rất cần tên, đang tạo ra các trừu tượng điều khiển với các danh sách tham số được curried và các tham số theo tên.

def command(expr: T)(block: => Unit) {...} 

năng suất

command (expr) { 
    block 
} 
+0

Cho một số tên "sắc sảo" khác, làm thế nào về mẫu "Do Me"? –

+2

Nhân tiện, tôi nghĩ chúng ta nên cẩn thận về thuật ngữ và trong trường hợp này, đây không phải là một hàm * curried *, mà là một phương thức * với nhiều danh sách đối số. –

+0

Điều đó có vẻ tương tự như những gì gọi là "vay" mẫu trên Scala wiik: http://scala.sygneca.com/patterns/loan –

4

Trong nhiều như bất kỳ ngôn ngữ Object-chức năng nhanh chóng sẽ có được một thư viện diễn viên, một số lượng lớn các mẫu diễn viên dựa trên lẽ đủ điều kiện cho câu hỏi này. Hầu như bất kỳ mẫu nào trong số Enterprise Integration Patterns của Bob Martin đều có thể tái diễn về mặt diễn viên, với các mẫu như Load Balancer, Message Filter, Content-Based Router và Content Enricher đặc biệt phổ biến trong các hệ thống được kiến ​​trúc xung quanh các diễn viên thô.

3

Có liên quan chặt chẽ, bạn có thể muốn khám phá các cấu trúc dữ liệu như được định nghĩa trong các ngôn ngữ purely functional (hoặc hàm hybrid). Đối với một, khả năng xử lý các hàm như các giá trị hạng nhất tạo ra một số mẫu (như visitor, template method hoặc decorator) không cần thiết trong một số ngữ cảnh (không phải tất cả). Thứ hai, cấu trúc dữ liệu (và các thuật toán hoạt động trên chúng) là đường ống dẫn cho các mẫu thiết kế, hoặc trình bày các vấn đề nhất định mà các mẫu thiết kế cố gắng giải quyết, xem bài viết trên trang Purely functional.

Tốt hơn, tôi muốn giới thiệu bạn đến Okasaki's thesis on purely functional data structures.

Các vấn đề liên quan