10

Tôi đang viết một ứng dụng Desktop GUI trong Clojure bằng cách sử dụng Java Swing. Thông thường khi làm việc với Java, tôi sẽ thiết kế ứng dụng theo mẫu thiết kế MVC bằng cách sử dụng mẫu Observer. Bằng cách này, chế độ xem được tách ra khỏi mô hình và các thay đổi trong cả hai không ảnh hưởng lẫn nhau, làm cho các thay đổi dễ dàng hơn nữa.Thiết kế Clojure Model-View-Controller (MVC)

Tôi đã tự hỏi liệu Clojure có cách tiếp cận tốt hơn cho vấn đề này so với mẫu thiết kế MVC và Observer bình thường không? Tôi mới vào lập trình chức năng vì vậy tôi không chắc chắn làm thế nào tôi có thể làm cho các mô hình riêng biệt từ xem. Tôi yêu cầu điều này vì ứng dụng sẽ được phát triển lặp đi lặp lại và có thể có các yêu cầu thách thức đi kèm theo đường xuống.

Sẽ đánh giá cao bất kỳ trợ giúp nào.

Cảm ơn,

Adam

+1

Trong trường hợp bạn đang thực hiện rất nhiều Swing với Clojure, bạn có thể tìm thấy [seesaw] (https://github.com/daveray/seesaw) hữu ích. – kotarak

+0

Tôi bập bênh thứ hai. Giao diện rất tiện dụng và nhất quán. – MHOOO

Trả lời

11

Rất nhiều mẫu thiết kế từ MVC thế giới java nhận được một chút ngớ ngẩn khi bạn có chức năng đầu tiên trật tự, macroes (mã-as-data), và dữ liệu liên tục đồng thời cấu trúc. ví dụ, "quan sát mẫu" về cơ bản chỉ là một đại lý với một số đồng hồ thiết lập. Nó đi từ một mô hình cho một cuộc gọi hàm.

nếu bạn lưu trữ trạng thái (mô hình) trong một ref hoặc tác nhân và làm cho chế độ xem của bạn một hàm (theo ý nghĩa lập trình hàm của từ) hiển thị trạng thái đó; trong khi làm cho bộ điều khiển của bạn một hàm (một lần nữa trong ý nghĩa FP của từ) tạo ra một trạng thái mới cho trạng thái cũ và một số đầu vào mới thì mô hình MVC rơi ra rất độc đáo.

ngày bit, nhưng số grid bag layout post của Stuart Sierra thực sự đã giúp tôi bắt đầu ở khu vực này.

+0

Cảm ơn điều đó giúp ích rất nhiều. – adamjmarkham

8

Trong Clojure bạn chắc chắn có thể làm MVC, nhưng tôi khuyên bạn nên triển khai nó bằng cách sử dụng đồng hồ trên tài liệu tham khảo Clojure.

Mã sẽ là một cái gì đó như:

; define the model as an immutable structure stored in a ref 
(def model (ref (create-my-model))) 

; function to update the UI when the model changes 
(def update-function [old-model new-model] 
    (do-whatevever-updates old-model new-model)) 

; add a watch to the model to call update-function when a change happens 
(add-watch model :on-update 
    (fn [key reference old-state new-state] 
    (if (not= old-state new-state) 
     (update-function old-state new-state)))) 

Ngoài ra nếu bạn đang xây dựng một giao diện trong Clojure, nó cũng có thể có giá trị tham gia một cái nhìn tại một số các giấy gói thư viện Swing hiện có, ví dụ:

  • Clarity - có DSL tốt đẹp cho việc xác định các yếu tố giao diện người dùng
  • Seesaw - có thể là wrapper trưởng thành nhất đối với Swing
  • clj-swing
+1

Cân nhắc thêm Seesaw (https://github.com/daveray/seesaw) vào các thư viện được liệt kê. – ponzao