10

मैं जावा स्विंग का उपयोग करके क्लोजर में डेस्कटॉप जीयूआई एप्लीकेशन लिख रहा हूं। आम तौर पर जावा के साथ काम करते समय मैं ऑब्जर्वर पैटर्न का उपयोग करके एक एमवीसी डिजाइन पैटर्न के अनुसार आवेदन तैयार करता हूं। इस तरह से दृश्य मॉडल से decoupled है और या तो परिवर्तन एक-दूसरे को प्रभावित नहीं करते हैं, जिससे बदलावों को और आसान बना दिया जाता है।क्लोजर मॉडल-व्यू-कंट्रोलर (एमवीसी) डिज़ाइन

मैं सोच रहा था कि क्लोजर के पास सामान्य एमवीसी और ऑब्जर्वर डिज़ाइन पैटर्न की तुलना में इस समस्या का बेहतर दृष्टिकोण है या नहीं? मैं कार्यात्मक प्रोग्रामिंग के लिए नया हूं इसलिए मुझे यकीन नहीं है कि मैं मॉडल को दृश्य से कैसे अलग कर सकता हूं। मुझे इसकी आवश्यकता है क्योंकि एप्लिकेशन को तत्काल विकसित किया जाएगा और लाइन के आगे आने वाली चुनौतीपूर्ण आवश्यकताएं हो सकती हैं।

किसी भी मदद की सराहना करेंगे।

धन्यवाद,

एडम

+1

यदि आप क्लोजर के साथ बहुत से स्विंग कर रहे हैं तो आपको [seeaw] (https://github.com/daveray/seesaw) उपयोगी मिल सकता है। – kotarak

+0

मैं दूसरी बार देखता हूं। बहुत कार्यात्मक और लगातार इंटरफ़ेस। – MHOOO

उत्तर

11

आप पहले के आदेश काम करता है, macroes (कोड के रूप में डेटा), और समवर्ती लगातार डेटा है जब जावा MVC दुनिया से डिजाइन पैटर्न का एक बहुत थोड़ा पागल मिल संरचनाओं। उदाहरण के लिए "पर्यवेक्षक पैटर्न" मूल रूप से कुछ घड़ियों सेट के साथ एक एजेंट है। यह एक समारोह कॉल के लिए एक पैटर्न होने से चला जाता है।

यदि आप राज्य (मॉडल) को एक रेफरी या एजेंट में संग्रहीत करते हैं और अपना दृश्य एक कार्य (शब्द की कार्यात्मक प्रोग्रामिंग भावना में) करते हैं जो उस राज्य को प्रदर्शित करता है; अपने नियंत्रक को एक फ़ंक्शन (फिर से शब्द की एफपी भावना में) बनाते हुए, जो एक नया राज्य बनाता है जो पुराना राज्य और कुछ नया इनपुट देता है तो एमवीसी मॉडल बहुत अच्छी तरह से गिर जाता है।

यह थोड़ा दिनांकित है, लेकिन स्टुअर्ट सिएरा के grid bag layout post ने वास्तव में मुझे इस क्षेत्र में शुरू करने में मदद की।

+0

धन्यवाद जो बहुत मदद करता है। – adamjmarkham

8

क्लोजर में आप निश्चित रूप से एमवीसी कर सकते हैं, लेकिन मैं क्लोजर संदर्भों पर घड़ियों का उपयोग करके इसे कार्यान्वित करने का सुझाव दूंगा। कुछ

कोड होगा जैसे:

; 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 में एक जीयूआई निर्माण कर रहे हैं, यह अच्छी तरह से मौजूदा स्विंग पुस्तकालय रैपर में से कुछ पर एक नज़र लेने लायक हो सकता है, उदाहरण के लिए:

  • Clarity - परिभाषित करने UI तत्व
  • Seesaw के लिए एक अच्छी डीएसएल है - स्विंग के लिए संभवतः सबसे परिपक्व आवरण
  • clj-swing
+1

सूचीबद्ध पुस्तकालयों में सेसो (https://github.com/daveray/seesaw) जोड़ने पर विचार करें। – ponzao