Đâu là tất cả các mẫu thiết kế lập trình chức năng? [đóng cửa]


75

Tài liệu lập trình OO có đầy đủ các mẫu thiết kế. Hầu hết các cuốn sách về lập trình hướng đối tượng dành một hoặc hai chương để thiết kế các mẫu như nhà máy và nhà trang trí. Vậy các mẫu tương đương trong các ngôn ngữ chức năng là gì và tại sao chưa có ai viết một cuốn sách về chúng? Có điều gì đặc biệt về các ngôn ngữ chức năng làm giảm nhu cầu về các mẫu thiết kế không?


6
Chắc chắn có các mẫu thiết kế chức năng - lấy ví dụ về sự phân biệt hoặc đơn vị - tôi cũng tự hỏi liệu có ai đã tập hợp chúng ở một nơi không ...
FinnNk

2
FinnNk Monad thuộc loại lớp hơn là mẫu thiết kế ^ _ ^
thay thế

Đối với haskell, Gabriel Gonzalez có một số bài đăng trên blog, ví dụ haskellforall.com/2012/08/the-carget-design-potype.html
bennofs


1
Bản đồ giảm là một. Tôi thất vọng vì không có một danh sách các mẫu tốt
Sridhar Sarnobat

Câu trả lời:


47

OO và lập trình chức năng là hai mô hình lập trình rất khác nhau và các mẫu thiết kế (DP) là một phần quan trọng của thiết kế và lập trình OO. DP không có vai trò như vậy trong lập trình chức năng.

Người ta thậm chí có thể nói rằng DP không cần thiết trong lập trình chức năng - không có ngứa mà DP đang chữa.


41
Tôi không chắc chắn tôi sẽ đồng ý rằng các mẫu thiết kế không áp dụng cho FP. FP vẫn trình bày các vấn đề phổ biến được giải quyết cụ thể, các cách phổ biến. Các vấn đề khác nhau đối với những vấn đề được giải quyết trong OO, tuy nhiên vẫn còn các vấn đề. Tôi nghĩ rằng nó có lẽ chỉ là thứ gì đó được chú ý ít hơn nhiều so với trong OO, vì hiện tại FP ít phổ biến hơn trong thế giới thương mại.
d11wtq

22
Để khẳng định rằng mẫu thiết kế không tồn tại trong lập trình chức năng là thông tin sai lệch. Ví dụ phản tác dụng dễ nhất là đơn nguyên. Bạn không cần phải sử dụng đơn nguyên trong lập trình chức năng, nhưng đó là một mô hình rất phổ biến mà mọi người tuân theo để tạo điều kiện cho việc áp dụng lập trình hàm thuần túy. Đó thực chất là định nghĩa của mẫu thiết kế.
voidvector 7/07/14

3
Các mẫu thiết kế áp dụng cho tất cả các hoạt động thiết kế, cho dù lập trình hay thiết kế nhà. Trong thực tế, chính các khái niệm về ngôn ngữ mẫu xuất phát từ kiến ​​trúc: en.wikipedia.org/wiki/A_Potype_L Language .
BobDalgleish

2
Hừm. Các luồng quan sát, Xác thực đường sắt và địa ngục, hầu hết mọi đơn vị đều là một mẫu thiết kế, phải không?
Chet

2
@voidvector Monads không chỉ đơn giản là một mẫu thiết kế. Trong FP, các đơn nguyên được sử dụng như các hàm tử giữa các hệ thống loại và bản thân khái niệm này xuất phát từ Lý thuyết Danh mục, một nhánh của toán học. Chúng được sử dụng để mô tả một loại mối quan hệ cụ thể giữa các cấu trúc đại số nói chung. Sẽ chính xác hơn khi nói lập trình chức năng là một mô hình thiết kế để tạo thuận lợi cho việc sử dụng toán học trong lập trình.
John Cramerus

67

Jeremy Gibbons đang viết cuốn sách. Cho đến khi nó kết thúc, bạn có thể đọc blog của mình, Các mẫu trong Lập trình chức năng . Ông khuyên nên đọc bài viết của mình từ cũ nhất đến mới nhất.

Duyệt các ấn phẩm của ông là tốt. Ông bao quát các mô hình Gang of Four trong các mẫu thiết kế dưới dạng các chương trình kiểu dữ liệu chung cấp bậc cao hơn và mô tả các mô hình lập trình với các phương trình đệ quy trong Lập trình Origami (gấp và mở ra).


13

Một thực tế đơn giản là nhiều Mẫu OO sẽ được coi là Thành ngữ trong các ngôn ngữ chức năng (đặc biệt là các mẫu GoF gốc). Ví dụ, mẫu Iterator (tích hợp sẵn cho các ngôn ngữ như C # bây giờ) không cần thiết trong Lisp hoặc ML có toán tử trình tự.

Có rất nhiều mẫu chúng ta sử dụng trong các hệ thống OO để giúp chúng ta loại bỏ những thứ "không cần thiết" để chúng ta có thể tập trung vào các đối tượng mã hóa. Nói cách khác, các mẫu là giải pháp cho các phần không thú vị của ứng dụng. Chúng ta nên tận dụng các mẫu để giải quyết các nhu cầu chung đã được giải quyết trước đó (như các mẫu trong Fowlers Mẫu của Kiến trúc ứng dụng doanh nghiệp để xử lý các việc như truyền cơ sở dữ liệu hoặc xUnit mẫu để tăng cường kiểm tra đơn vị của bạn) để chúng tôi có thể tập trung vào việc thêm giá trị doanh nghiệp cho các ứng dụng.

Tôi chắc chắn rằng ngoài các chi tiết cụ thể của các mẫu GoF, còn có các mẫu thiết kế sẽ được áp dụng cho lập trình chức năng. Có điều là OO là mô hình chi phối. Viết một cuốn sách mẫu nhắm vào các nhà phát triển chức năng ... thật lòng sẽ không nhận được đèn xanh từ nhà xuất bản. Đó là những gì nó sôi lên. Không có đủ thị trường cho các Mẫu chức năng để có một số lượng đáng kể sách dành riêng cho chủ đề này.


9

Một cuộc nói chuyện hay (~ 45 phút) về chủ đề này của Stuart Sierra:

http://www.infoq.com/presentations/Clojure-Design-Potypes

Không nhất thiết phải ràng buộc và có thẩm quyền, nhưng tôi đã nhận ra một số ví dụ của anh ấy từ kinh nghiệm của bản thân tôi khi sử dụng FP để phân tích dữ liệu.

Các ví dụ được viết bằng Clojure, nhưng có thể áp dụng cho bất kỳ ngôn ngữ FP nào. Những cái tên anh đặt cho các mẫu anh bao gồm:

  • Bang / Sự kiện
  • Hậu quả
  • Tích lũy
  • Giảm / Kết hợp
  • Mở rộng đệ quy
  • Đường ống
  • Vỏ bánh
  • Mã thông báo
  • Người quan sát
  • Chiến lược

6

Nếu bạn thực sự quan tâm đến việc học các mẫu thiết kế thì không có gì khác ngoài Haskell. Nếu bạn dành thời gian để học ngôn ngữ một cách khó khăn, bạn sẽ gặp phải và trở nên ấm cúng với hầu hết các mô hình nền tảng - chúng được đưa vào ngôn ngữ.

Đừng bỏ qua các đơn nguyên. Có rất nhiều lời giải thích dài dòng ngoài kia và cần phải có một số ý tưởng để thực hiện, nhưng nếu bạn tiếp tục cắm đầu, cuối cùng nó sẽ bình minh lên và bạn sẽ ngạc nhiên về số lượng mẫu thiết kế có thể xây dựng trên đầu trang của một trừu tượng / giao diện này.

Khi bạn mò mẫm Haskell, bạn sẽ có đủ kho vũ khí của FP để xử lý nguy hiểm. Điểm là, giữ ở đó cho đến khi bạn nhận được nó. Không có vết cắt ngắn.


-3

Trong chừng mực các phương pháp thiết kế cho FP là thiết kế các loại của bạn để phản ánh chính xác không gian vấn đề và thực hiện, nếu làm theo cách tự động, tương đương với FP của một cuốn sách về các mẫu thiết kế là một cái gì đó giống như Chris Okasaki của Cấu trúc dữ liệu thuần túy chức năng .


1
Cuốn sách của Okasaki tương đương với phần cấu trúc dữ liệu của nhiều sách cấu trúc dữ liệu và thuật toán thường chỉ xem xét cấu trúc dữ liệu có thể thay đổi.
AProgrammer

1
Tôi không nghĩ việc đánh đồng các cấu trúc dữ liệu để thiết kế các mẫu phù hợp với dự luật. Nó không giống như các lập trình viên OO chỉ cần vẫy tay cho đến khi các định nghĩa lớp thích hợp bật lên.
davidk01

Vâng, cuốn sách của Okasaki ở cấp độ thấp hơn các mẫu thiết kế.
FinnNk
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.