10

Java Swing kullanarak Clojure'da bir Masaüstü GUI uygulaması yazıyorum. Normalde Java ile çalışırken, uygulamayı bir MVC tasarım desenine göre Observer desenini kullanarak tasarlayacağım. Bu şekilde görünüm modelden ayrıştırılır ve her ikisinde de değişiklikler birbirini etkilemez ve değişikliklerin daha da kolaylaştırılmasını sağlar.Clojure Model-Denetleyici (MVC) tasarımı

Clojure'in bu problem için normal MVC ve Observer tasarım modellerinden daha iyi bir yaklaşımı olup olmadığını mı merak ediyordum? Fonksiyonel programlamada yeniyim, bu yüzden modeli nasıl görüntüden ayrı yapabileceğimi bilmiyorum. Uygulama iteratif olarak geliştirilecek ve hatta daha ileride ortaya çıkan zorlu gereklilikler olabileceğinden buna ihtiyacım var.

Herhangi bir yardım için teşekkür ederiz.

sayesinde

Adam

+1

Eğer Clojure ile çok fazla Swing yapıyorsanız [tahterevalli] (https://github.com/daveray/seesaw) yararlı bulabilirsiniz. – kotarak

+0

İkinci tahterevalliyim. Çok fonksiyonel ve tutarlı bir arayüz. – MHOOO

cevap

11

Eğer birinci dereceden fonksiyonlar, macroes (kod-as-veri) ve eşzamanlı kalıcı veriler olduğunda java MVC dünyadan tasarım desenleri bir sürü biraz saçma olsun yapıları. örneğin "gözlemci deseni" temelde sadece bazı saatler ayarlanmış bir ajandır. Bir işlev çağrısından bir şablon olmaktan geçer. Durumu (model) bir ref veya aracıda saklar ve görünümünüzü, bu durumu görüntüleyen bir işlev (sözcüğün işlevsel programlama anlamında) yaparsanız, kontrolcünüzün eski hal ve yeni bir girdi verildiğinde yeni bir durum üreten bir fonksiyon (tekrar FP kelimesinde) yaparken, MVC modeli çok güzel gözüküyor.

Biraz tarihli, ama Stuart Sierra'nın grid bag layout post gerçekten bu alana başlamasına yardımcı oldu.

+0

Teşekkürler çok yardımcı olur. – adamjmarkham

8

Clojure'da kesinlikle MVC yapabilirsiniz, ancak Clojure referanslarındaki saatleri kullanarak uygulamayı öneririm.

Kod olurdu gibi bir şey: Ayrıca

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

Eğer Clojure bir GUI inşa ediyorsanız, iyi, mevcut Salıncak kütüphane sarmalayıcıları bazılarına bir göz atmaya değer olabilir mesela:

  • Clarity - tanımlayan kullanıcı arayüzü öğeleri
  • Seesaw için güzel DSL var - Swing için muhtemelen en olgun sarmalayıcı
+1

Listelenen kitaplıklara Tahterevalli (https://github.com/daveray/seesaw) eklemeyi düşünün. – ponzao