2013-10-03 12 views
5

Là nhà phát triển Ruby on Rails, khi thiết kế/triển khai ứng dụng web, tôi lấy các khái niệm/thực thể quan trọng từ miền vấn đề và triển khai chúng làm mô hình. Thông thường, đó là các lớp bắt nguồn từ lớp ORM cơ sở (ví dụ: ActiveRecord::Base), chúng ánh xạ các bản ghi từ bảng cơ sở dữ liệu và thêm chứa các phương thức bổ sung triển khai logic nghiệp vụ liên quan đến mô hình. Ưu điểm của phương pháp này là bạn có thể nhanh chóng tìm thấy tất cả logic nghiệp vụ liên quan đến đối tượng từ miền vấn đề, để nếu lớp mô hình không lớn, bạn có thể hiểu được cách thức hoạt động của ứng dụng. Nó cũng tách biệt với tất cả logic trình bày. Bên cạnh đó, nhờ vào ORM các phương thức logic nghiệp vụ chứa ít mã đặc thù DB và do đó khá sạch sẽ và dễ đọc.Mô hình MVC ở Clojure

Bất lợi là các lớp như vậy thường phát triển đến một kích thước rất lớn và do đó khó hiểu như một toàn thể.

Vì vậy, câu hỏi của tôi là:

  • Đỗ Clojure hệ sinh thái cung cấp một số thư viện mà thực hiện một chức năng tương tự như ORMs OOP không?
  • Cách "Clojure" để tổ chức mã như thế nào?
  • Những ưu điểm và nhược điểm của phương pháp này là gì?
  • Một số bài báo/sách/cuộc thảo luận giải thích và biện minh cho cách tiếp cận này?
  • Có một số ứng dụng nguồn mở (ví dụ) giới thiệu cách tiếp cận này không?

Trả lời

8

Một trong những triết lý đằng sau sự phát triển của Clojure là separate complex things đến mức độ lớn nhất đó là hợp lý, và để xử lý dữ liệu như dữ liệu và do đó để tránh kết hợp dữ liệu và riêng biệt value state and identity.

  • Hệ sinh thái Clojure có cung cấp một số thư viện có chức năng tương tự như ORM của OOP không? Mong muốn xử lý dữ liệu với các chức năng thuần túy biến đổi một cấu trúc dữ liệu thành một nguyên nhân khác khiến một số lập trình viên bị lột bỏ khỏi ORM mặc dù có không có lý do gì bạn không thể sử dụng Hibernate trong Clojure nếu bạn thực sự muốn.

  • Cách "Clojure" để tổ chức mã như vậy là gì? Tôi thích Amit Rathore's presentation of the topic

  • Ưu điểm và nhược điểm của phương pháp này là gì? Rich Hickey đưa ra một cuộc thảo luận tuyệt vời về những ý tưởng này trong classic video
  • Một số bài viết/sách/cuộc hội thoại giải thích và biện minh cho cách tiếp cận này? Cá nhân tôi đề nghị The Joy of Clojure,
8

Để đơn giản, bạn không quấn đồ vật vào đối tượng, bạn trực tiếp lập trình với cấu trúc dữ liệu như danh sách, bộ và bản đồ. Vì vậy, công việc đã được thực hiện ORM bị giảm để chuyển đổi cấu trúc dữ liệu sang cấu trúc dữ liệu khác: ví dụ: chức năng user-row->user-record có thể chuyển đổi danh sách giá trị mà bạn bật từ cơ sở dữ liệu SQL sang bản đồ đại diện cho người dùng trong logic nghiệp vụ của ứng dụng. Khi bạn lưu người dùng, bạn phải gọi một hàm đảo ngược.

Tôi phải nói rằng nó thực sự là khó khăn cho một lập trình viên có kinh nghiệm OOP để kinda "có được" thực tế là có ít lễ hơn xung quanh công cụ.Bộ não của chúng ta dường như chống lại ý tưởng này - IMHO vì nó có vẻ quá đơn giản và chưa trưởng thành đối với một kiến ​​trúc sư phát triển/phần mềm có kinh nghiệm. :-) Tôi ước tôi có thể viết những câu trả lời phức tạp hơn với những thuật ngữ kỳ lạ để nghe như một chuyên gia thực sự, nhưng tôi thực sự không thể, bởi vì không có nhiều thứ để thêm vào. :-)

Nhân tiện, một điểm nhỏ nhưng thú vị - việc sử dụng phổ biến cấu trúc dữ liệu là một thực tiễn được coi là sai trong thế giới OOP. Ví dụ bạn không nên lưu trữ tiền trong một tuple đơn giản [10, "USD"] nhưng thay vì viết đầy đủ public class Money mà sẽ đóng gói tất cả các loại tiền tệ, so sánh, làm tròn vv Nhưng viết tuples là chính xác những gì chúng tôi làm trong FP. Tôi nhớ tôi có một số cảm giác kỳ lạ về điều này đến từ thế giới OOP.

Khi nói đến tổ chức mã của bạn nhiều hơn hoặc ít hơn các quy tắc tương tự như trong OOP áp dụng về không gian tên. Bạn tổ chức mã dựa trên chủ đề như bạn sẽ làm trong các gói java, ngoại trừ tất cả các hàm (mà bạn đã sử dụng để gọi các phương thức) hiện không trạng thái và thường lấy những thứ như hồ sơ người dùng được đề cập ở trên làm đối số. Vì vậy, thay vì foo.barChange(), bạn sẽ có (bar foo) trong đó chức năng thuần túy bar sẽ trả lại cấu trúc dữ liệu mới foo2 thay vì sửa đổi trạng thái foo.

Điều đó được cho là một trong những lợi ích của OOP là không chỉ có nhiều ứng dụng được viết bằng mô hình này, mà quan trọng hơn là đã có nhiều thế hệ thế hệ thử nghiệm. todays phổ biến của DI container vv ...). Lập trình chức năng chưa có tính năng này. Về cơ bản không ai có một hướng dẫn cuối cùng đã được chứng minh về cách làm kiến ​​trúc của một ứng dụng trong FP. Và bằng cách này, đây là lý do tại sao mọi người thường không được khuyến khích viết các khuôn khổ lớn và được khuyến khích ở lại với các chức năng chuyển đổi dữ liệu. Bằng cách đó bạn luôn có thể kết nối nó theo cách bạn muốn và tránh những cạm bẫy kiến ​​trúc.