2008-09-18 48 views
21

Tôi quen thuộc với kiến ​​trúc hướng đối tượng, bao gồm việc sử dụng các mẫu thiết kế và sơ đồ lớp để trực quan hóa, và tôi biết kiến ​​trúc hướng dịch vụ với các hợp đồng và giao thức ràng buộc của nó, nhưng kiến trúc phần mềm cho một hệ thống được viết bằng ngôn ngữ lập trình hàm?Kiến trúc lập trình chức năng

Tôi biết rằng FP đã được sử dụng cho các dự án có quy mô vừa và lớn. Paul Graham đã viết hóa thân đầu tiên của Yahoo! Lưu trữ trong Common Lisp. Một số hệ thống phát triển lisp rất phức tạp. Trí tuệ nhân tạo và hệ thống tài chính được viết bằng ngôn ngữ chức năng có thể trở nên khá lớn. Tất cả họ đều có ít nhất một loại kiến ​​trúc vốn có, mặc dù, tôi tự hỏi nếu họ có bất cứ điều gì chung?

Kiến trúc dựa trên đánh giá biểu thức như thế nào? Các kiến ​​trúc FP có khả năng tổng hợp hơn không?

Cập nhật: Kyle nhắc tôi rằng SICP là tài nguyên tốt cho chủ đề này.

Cập nhật 2: Tôi tìm thấy một bài tốt về đề tài này: How does functional programming affect the structure of your code?

Trả lời

10

Chủ đề chung trong "kiến trúc" của các dự án sử dụng ngôn ngữ chức năng là chúng có xu hướng tách thành lớp đại số thay vì hệ thống phụ theo nghĩa kiến ​​trúc hệ thống truyền thống.

Để có ví dụ tuyệt vời về các dự án như vậy, hãy xem XMonad, YiHappS. Nếu bạn kiểm tra cách chúng được cấu trúc, bạn sẽ thấy rằng chúng bao gồm các lớp cấu trúc đơn nguyên với một số keo kết hợp ở giữa.

Ngoài ra, hãy xem The Scala Experiment giấy phác thảo kiến ​​trúc trong đó hệ thống bao gồm các thành phần trừu tượng hóa về phụ thuộc của chúng.

+0

Cảm ơn câu trả lời của bạn. Tôi đang học về ngữ nghĩa denotational ((trong Haskell) [http://en.wikibooks.org/wiki/Haskell/Denotational_semantics] và (nói chung) [https://www.scss.tcd.ie/Andrew.Butterfield /Teaching/CS4003/DenSem-full-book.pdf]) và câu trả lời của bạn vang dội với những gì tôi đang học. Phân tích một vấn đề thành các cấu trúc toán học (ví dụ: đại số bạn đang nói) theo cách sao cho chúng có thể được tạo thành một hệ thống lớn hơn. –

+0

Không nói "các thành phần trừu tượng hóa các phụ thuộc của chúng" trong FP như nói "Tạo cấp độ cao hơn về thủ tục và cấu trúc dữ liệu" trong mệnh lệnh/OOP? Câu hỏi cụ thể của tôi là - Bạn mô tả những trừu tượng bậc cao này như thế nào? OOP có UML, với sơ đồ lớp đóng vai trò chính. FP có gì? –

3

Các tương đồng lớn nhất bạn sẽ tìm thấy trong các ngôn ngữ chức năng đang sử dụng chức năng để lưu trữ dữ liệu. Nó giống như sử dụng các hàm truy cập trên một đối tượng không có đối tượng. Thay vào đó, hàm được tạo ra trong một môi trường mà nó có quyền truy cập vào dữ liệu mà nó cần. Bây giờ chức năng này có thể được truyền và sử dụng ở bất cứ đâu và vẫn giữ được khả năng sử dụng dữ liệu.

Đây là một ví dụ rất đơn giản. Đây không phải là hoàn toàn chức năng như nó thay đổi trạng thái, nhưng nó phổ biến đủ:

(define (make-counter) 
    (let ((count 0)) 
    (lambda() 
     (set! count (+ count 1)) 
     count))) 

(define x (make-counter)) 

(x) returns 1 

(x) returns 2 

...etc... 

Vì vậy, chúng tôi có một chức năng, make-quầy, trả về một chức năng mà có trạng thái của bộ đếm bên trong. Chúng ta có thể gọi bộ đếm mới được tạo ra và quan sát sự thay đổi bên trong.

Đây là cách các chương trình chức năng được cấu trúc. Bạn có các hàm có chức năng như các đối số, bạn có các hàm trả về các hàm với trạng thái ẩn, v.v. Nó sạch hơn rất nhiều so với việc quản lý bộ nhớ của bạn.

+0

Tôi quen thuộc với việc sử dụng bao đóng để duy trì trạng thái nhưng tôi không quan tâm đến những ngôn ngữ chức năng có điểm chung như tôi đang có những chương trình chức năng lớn, có kiến ​​trúc chung. –

+1

Xin lỗi, tôi đoán đã đánh giá thấp sự quen thuộc của bạn với lĩnh vực này. Một điều rất nhiều người mới đến lập trình chức năng cố gắng làm là tiếp tục sử dụng các biến để đóng gói trạng thái, vì vậy tôi đã cố gắng cung cấp một cách hướng theo chức năng hơn để làm điều đó. –

+0

Tôi thích phương pháp thay thế thế giới thay thế-không thay đổi của Haskell để thay đổi trạng thái:) –

2

Tôi đã làm việc với một số dự án khá lớn. Chúng thường rơi vào hai trại (ít nhất, những cái mà tôi đã sử dụng):

  • Khả năng mở rộng/độ tin cậy cao/đồng thời. Các mô hình giao dịch có thể được xây dựng rất chặt chẽ vào ngôn ngữ. Đồng thời ML là một ví dụ tuyệt vời về điều này, và các dự án sử dụng nó là rất khó để có được sai khi nói đến tính chính xác đồng thời.
  • Phân tích cú pháp/sửa đổi khung. Nhiều mẫu thiết kế mà các khung công tác này dựa trên là cực kỳ dễ dàng để xây dựng/xây dựng/sửa đổi trong các ngôn ngữ chức năng. Mẫu khách truy cập là một ví dụ tuyệt vời về điều này.
+0

Vâng, tôi tưởng tượng rằng các thiết kế chức năng sẽ mạnh mẽ hơn cho việc thực thi đồng thời. Các trình kết hợp bộ phân tích cú pháp phân tích cú pháp, như trong Haskell, là một ví dụ tốt về tính tương hợp dễ dàng hơn mà bạn nhận được từ một mô hình chức năng. –

2

Tôi đã in ra và xem qua Design Patterns in Ocaml và họ sử dụng mô-đun và functors (và các đối tượng) để tạo lại các mẫu thiết kế thông thường mà chúng tôi thường sử dụng. Thật thú vị, nhưng tôi nghĩ rằng họ sử dụng các đối tượng quá nhiều để thực sự thấy được lợi ích của các ngôn ngữ chức năng. FP là rất composable, một phần của nó là thiên nhiên. Tôi đoán câu trả lời ngắn của tôi là sử dụng các mô-đun functors.

Dự án hiện tại của tôi khá lớn và chúng tôi tách riêng từng mô-đun theo tệp - xác định trong ocaml. Tôi đã săn tìm một nguồn tài nguyên toàn diện cũng có thể có một số quan điểm thay thế hoặc một số suy nghĩ về một thiết kế thực sự thành công xuất phát từ một dự án.

1

Tôi nghĩ điều này có thể hữu ích;

Một số mô hình biến mất - đó là, họ được hỗ trợ trực tiếp bởi tính năng ngôn ngữ, một số mẫu là đơn giản hoặc có mối quan tâm khác nhau, và một số cơ bản là không thay đổi.

[AIM-2002-005] Gregory T. Sullivan, Advanced Programming Language Features for Executable Design Patterns "Better Patterns Through Reflection

ngày 22 tháng 3 năm 2002

Design Patterns cuốn sách [GOF95] trình bày 24 mẫu thời gian thử nghiệm mà liên tục xuất hiện trong các hệ thống phần mềm được thiết kế tốt. Mỗi mẫu là được trình bày với mô tả về vấn đề thiết kế địa chỉ mẫu, cũng như mã thực hiện mẫu và các cân nhắc về thiết kế. Bài báo này khám phá cách các mẫu từ "Gang of Four", hoặc "GOF" cuốn sách, vì nó thường được gọi, xuất hiện khi tương tự vấn đề được giải quyết bằng cách sử dụng động, cao hơn, hướng đối tượng ngôn ngữ lập trình. Một số mẫu biến mất - tức là, chúng được hỗ trợ trực tiếp theo ngôn ngữ đối tượng địa lý, một số mẫu đơn giản hơn hoặc có trọng tâm khác nhau và một số là về cơ bản không thay đổi.

+0

Tôi mong đợi nhiều hơn từ một kiến ​​trúc chức năng, đặc biệt là dựa trên ngôn ngữ với một loại cơ sở macro hoặc metaprogramming, rằng nó sẽ được vắng mặt sạch sẽ của bất kỳ cái gọi là mẫu thiết kế (tức là, cấu trúc tấm nồi hơi). –

2

Hy vọng rằng không phải là quá tiếp tuyến, nhưng có lẽ thú vị cho bất cứ ai duyệt câu trả lời cho câu hỏi này là bài trình bày này Design Patterns in Dynamic Programming bởi Peter Norvig.

2

Tôi hiện đang làm việc trên cuốn sách "Thiết kế và Kiến trúc trong Lập trình chức năng". Nó mô tả nhiều mẫu thiết kế và cách tiếp cận tồn tại trong thế giới FP thuần túy (ngôn ngữ chính là Haskell), nhưng không chỉ. Cuốn sách dạy bạn làm thế nào để xây dựng ứng dụng lớn từ đầu với trạng thái tinh khiết và không tinh khiết, đa luồng, mạng, cơ sở dữ liệu, GUI, cách chia nó thành các lớp và có được sự đơn giản. Nó cũng cho thấy làm thế nào để mô hình tên miền và ngôn ngữ, làm thế nào để tổ chức và mô tả kiến ​​trúc của ứng dụng như thế nào để kiểm tra nó, và thậm chí nhiều hơn nữa.

Danh sách các chủ đề bao gồm:

  • phương pháp tiếp cận để xây dựng mô hình kiến ​​trúc sử dụng sơ đồ;
  • Phân tích yêu cầu;
  • Mô hình miền DSL nhúng;
  • Thiết kế và triển khai DSL bên ngoài;
  • Monads dưới dạng hệ thống phụ có hiệu ứng;
  • Monads miễn phí làm giao diện chức năng;
  • eDSL bị bỏ qua;
  • Đảo ngược kiểm soát bằng cách sử dụng eDSL đơn nguyên miễn phí;
  • Bộ nhớ giao dịch phần mềm;
  • Ống kính;
  • Nhà nước, Reader, Writer, RWS, ST monads;
  • Trạng thái không tinh khiết: IORef, MVar, STM;
  • Tạo mô hình đa luồng và đồng thời;
  • GUI;
  • Khả năng áp dụng các kỹ thuật và phương pháp chính thống như UML, SOLID, GRASP;
  • Tương tác với hệ thống con không tinh khiết.

Sách được dựa trên các dự án Haskell mà tôi đang nghiên cứu, đặc biệt là ứng dụng SCADA Andromeda. Mã cho sách này có sẵn here. Trong khi cuốn sách đang được phát triển (nó sẽ được thực hiện cho đến lúc 2017), tôi có thể khuyên bạn làm quen với bài viết của tôi "Thiết kế và Kiến trúc trong FP" here (Rus).

CẬP NHẬT

tôi chia sẻ cuốn sách trực tuyến của tôi (5 chương đầu tiên). See post on Reddit

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