10

我正在使用Java Swing在Clojure中編寫桌面GUI應用程序。通常,在使用Java時,我會根據使用Observer模式的MVC設計模式來設計應用程序。通過這種方式,視圖與模型分離,兩者之間的更改不會相互影響,從而使更改更容易。Clojure模型 - 視圖 - 控制器(MVC)設計

我想知道Clojure是否比普通的MVC和Observer設計模式更好地解決了這個問題?我是功能性編程新手,所以我不確定如何讓模型與視圖分離。我需要這樣做,因爲應用程序將會迭代開發,並且可能會有更具挑戰性的要求進一步下行。

希望有任何幫助。

感謝,

亞當

+1

如果你用Clojure做了很多Swing,你可能會發現[seesaw](https://github.com/daveray/seesaw)有用。 – kotarak

+0

我是第二蹺蹺板。非常實用且一致的界面。 – MHOOO

回答

11

很多從Java MVC世界的設計模式變得有點傻,當你有一階的功能,macroes(代碼作爲數據),和併發持久性數據結構。例如「觀察者模式」基本上只是一些手錶設置的代理商。它從一個模式變成一個函數調用。

如果您將狀態(模型)存儲在引用或代理中並使您的視圖成爲顯示該狀態的函數(在該函數的編程意義上)同時讓你的控制器成爲一個函數(再一次在FP的意義上說),在給定舊狀態和一些新輸入的情況下產生一個新狀態,那麼MVC模型會非常好地發揮作用。

它有點過時,但斯圖爾特謝拉的grid bag layout post真的幫助我在這方面開始。

+0

謝謝,這有助於很多。 – adamjmarkham

8

在Clojure中,你當然可以做MVC,但我建議使用Clojure參考手錶來實現它。

代碼會是這樣的:

; 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)))) 

此外,如果你正在構建Clojure中的一個圖形用戶界面,它可能是值得考慮看看現有的一些Swing庫的包裝,例如:

+1

考慮將Seesaw(https://github.com/daveray/seesaw)添加到列出的庫中。 – ponzao

相關問題