2014-05-14 6 views
11

मैं जावाएफएक्स का अध्ययन करने का प्रयास कर रहा हूं क्योंकि मैं इसे अपने कार्यक्रम के जीयूआई के रूप में उपयोग करना चाहता हूं। मेरा सवाल अनिवार्य रूप से एक वैचारिक है:क्या जावाएफएक्स में ऑब्जर्वेबललिस्ट का उपयोग मॉडल-व्यू-कंट्रोलर अलगाव के खिलाफ जाता है?

आज तक मेरा कार्यक्रम एमवीसी पैटर्न का "मॉडल" हिस्सा है; यानी, मेरे लगभग सभी कोड कक्षाओं के अर्थ में अवशोषण का ओओ-प्रतिनिधित्व है, और वह सभी कोड तार्किक कोड है।

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

मेरे "मॉडल" कक्षाओं में मैं स्पष्ट रूप से जावा संग्रह एपीआई से विभिन्न सूचियों, मानचित्रों और अन्य वर्गों का उपयोग करता हूं। मेरे कार्यक्रम के उपयोगकर्ताओं को इन अंतर्निहित सूचियों और मानचित्रों में हेरफेर करने के लिए मैं जावाएफएक्स में अवलोकन (सूची/मानचित्र) इंटरफेस का उपयोग करना चाहता हूं।

एक ठोस उदाहरण स्थिति के लिए स्पष्टता लाने के लिए:

कहते हैं कि मैं एक MachineMonitor वर्ग है कि हर 3 मिनट में इस तरह करता है, तो कनेक्शन अभी भी अच्छा है के रूप में एक मशीन के कुछ गुण, की जाँच करता है करते हैं, गति जो गियर मोड़ रहे हैं, इत्यादि। यदि कुछ असमानताओं को पूरा किया जाता है (कहें कि गियर की गति 1 मोड़/सेकंड की दर से गिर गई है) मशीन मॉनिटर एक रेस्टार्टमैचिनवेन्ट को आग लगती है।

वर्तमान में मैं एक ArrayList < MachineMonitor> का उपयोग 'व्यक्तिगत MachineMonitor रों के सभी का ट्रैक रखने के। अब एमवीसी के "व्यू" भाग में विस्तार करने के लिए, मैं चाहता हूं कि उपयोगकर्ता एक टेबल व्यू में हेरफेर करने में सक्षम हो जो मशीन मॉनिटर एस की सूची प्रदर्शित करता है ताकि उदाहरण के लिए, वे नए मशीन मॉनिटर की मॉनिटर करने के लिए बना और निकाल सकें विभिन्न मशीनें

ताकि मैं ट्रैक कर सकूं कि मेरे प्रोग्राम का उपयोगकर्ता क्या करना चाहता है (कहें, मशीन मॉनिटर मशीन # 5 के लिए बनाएं जो यह देखने के लिए जांचता है कि गियर का बारी/सेकंड 0.5 से नीचे आता है) एक ObservableList < MachineMonitor> तालिका दृश्य के लिए अंतर्निहित सूची के रूप में।

"मॉडल" और "देखें" लिंक करने के लिए सबसे आसान तरीका है मेरे कार्यक्रम बस एक ObservableList < MachineMonitor> और नहीं एक ArrayList के लिए "मॉडल" वर्ग बदलने के लिए होगा की < MachineMonitor> लेकिन (प्रश्न के विषय में आना) मुझे लगता है कि यह बहुत गन्दा है क्योंकि यह "मॉडल" और "व्यू" कोड मिश्रण करता है।

एक भोली दृष्टिकोण tableview के लिए एक ObservableList < MachineMonitor> का उपयोग करें और मेरी ArrayList < MachineMonitor> के उपयोग बनाए रखने के लिए किया जाएगा। हालांकि, ObservableList < मशीन मॉनिटर> में किए गए परिवर्तन जावाएफएक्स विनिर्देशों के अनुसार अंतर्निहित सूची को प्रभावित नहीं करते हैं।

इस को देखते हुए, ObservableList < MachineMonitor> कि "प्रसारित" ObservableList < MachineMonitor> अंतर्निहित "मॉडल" ArrayList < करने में किए गए परिवर्तनों के लिए एक ChangeListener बनाने के लिए इस पहेली को हल करने के लिए सबसे अच्छा तरीका है मशीन मॉनिटर>? शायद इसे मशीन मॉनिटर कंट्रोलर नामक कक्षा में रखें?

यह विज्ञापन-समाधान बहुत गन्दा और गैर-आदर्श लगता है।

मेरा प्रश्न है: इस परिदृश्य में "मॉडल" और "व्यू" के बीच लगभग पूर्ण अलगाव को बनाए रखने का सबसे अच्छा तरीका क्या है?

+1

हालांकि मैं एमवीसी अवधारणा के महत्व का सम्मान और समझता हूं, लेकिन मैं यह कहना चाहूंगा कि आपको हमेशा मूल्यांकन करना चाहिए यदि आपको वास्तव में इसकी आवश्यकता है। आम तौर पर, वी और सी एक साथ आते हैं क्योंकि इन दो कुछ हद तक बिना उपयोगी ढांचे को खोजना दुर्लभ होता है। असली एमवीसी स्वतंत्रता प्राप्त करना मुश्किल है और बहुत सारे संकेत कोड की मांग करता है। असली एमवीसी के बीच वास्तव में एक मीठा स्थान है और कुछ अच्छे ढांचे का चयन करना और लंबे समय तक आईएमओ में चिपकना है। – Leo

+0

मुझे लगता है कि जावाएफएक्स 'टेबल व्यू' का एपीआई वास्तव में कष्टप्रद है। मुझे समझ में नहीं आता कि क्यों कोई आसान तरीका नहीं है, जैसे 'table.getModel()। सेट (पंक्ति, कॉल, डेटा) '। और मैं सहमत हूं और "महसूस करता हूं" कि यह एमवीसी के खिलाफ है। मैं चाहता हूं कि डेटा को अपडेट होने पर अपडेट किया जाए, और जीयूआई को मेरे लिए यह स्वचालित रूप से न करने दें। अगर मैं इसे स्वचालित रूप से अपडेट करना चाहता था, तो मैं माइक्रोसॉफ्ट टूल्स का उपयोग करता हूं, जावा नहीं (और मैं वास्तव में ऐसा नहीं करना चाहता) ... ऐसा लगता है कि डब्ल्यूपीएफ – SomethingSomething

उत्तर

10

मैं इस बात से असहमत हूं कि आपके "मॉडल" वर्ग में ObservableList का उपयोग एमवीसी अलगाव का उल्लंघन करता है। एक ObservableList पूरी तरह से डेटा प्रतिनिधित्व है; यह मॉडल का हिस्सा है और दृश्य का हिस्सा नहीं है। मैं (andothers) use JavaFX properties and collections in model representations in all tiers of my applications। वहां अन्य चीजों के अलावा, मैं इंगित करता हूं कि मैं जावाएफएक्स गुणों का उपयोग कैसे करता हूं जो कि (या कम से कम हो सकता है) जेएसएफ से बंधे हैं। (मुझे यह उल्लेख करना चाहिए कि सर्वर सर्वर पर एफएक्स गुणों का उपयोग करने के दृष्टिकोण से सभी सहमत नहीं हैं, हालांकि मुझे वास्तव में तर्क देने का कोई तरीका नहीं दिखता है कि वे किसी भी तरह से दृश्य का हिस्सा हैं।)

चूंकि जावाएफएक्स है अब जावा मानक संस्करण का एक पूरी तरह से भाग लिया हिस्सा है, आप या तो कोई अतिरिक्त निर्भरता नहीं जोड़ते हैं। इसके अलावा (एक ObservableList कम नहीं की तुलना में एक ArrayList जावा SE का एक हिस्सा है।)

, यदि आप

List<MachineMonitor> myNonObservableList = ... ; 

ObservableList<MachineMonitor> myObservableList = FXCollections.observableList(myNonObservableList); 
myObservableList.add(new MachineMonitor()); 

नमूदार सूची गैर नमूदार सूची के द्वारा समर्थित है करते हैं, तो परिवर्तन myNonObservableList में होता है भी। तो यदि आप चाहें तो आप इस दृष्टिकोण का उपयोग कर सकते हैं।

+0

के साथ प्रोग्रामिंग की तरह मैं आपके साथ एक निश्चित डिग्री से सहमत हूं क्योंकि javaFX पैकेज जैसे javafx.scene.control। * यूआई वाले हैं (असली "देखें" यहां) और इसलिए ऑब्जर्जेबललिस्ट "मॉडल" और "कंट्रोल" (मॉडल की तरह, मुझे लगता है) के बीच कुछ है। दूसरी तरफ, यदि आप प्रेजेंटेशन लाइब्रेरी के रूप में जावाएफएक्स पर सोचते हैं, तो मुझे यकीन नहीं है कि डेवलपर किसी अन्य "व्यू" (उदाहरण के लिए जेएसएफ कहें) पर स्विच करने का फैसला करता है, अगर जावाएफएक्स पुस्तकालयों की यह निर्भरता किसी भी तरह से एमवीसी नहीं है मुसीबत। दूसरी ओर, अपने स्वयं के "नियंत्रक" के बिना वास्तविक उपयोगी "दृश्य" ढूंढना बहुत दुर्लभ है। – Leo

+0

इस टिप्पणी को संबोधित करने के लिए अपडेट किया गया। –

+0

दूसरा लिंक अब उपलब्ध नहीं है। – ndm13

10

संक्षेप में, मुझे नहीं लगता कि ObservableList का उपयोग एमवीसी अनुबंध तोड़ता है।

शेष, आप पढ़ सकते हैं या नहीं चाहें, क्योंकि यह काफी परेशान है।

वास्तुकला पैटर्न पृष्ठभूमि क्योंकि वे खिला डेटा का एक तरीका आगे पीछे ढीला कपलिंग्स के माध्यम से MVC घटकों जहां मॉडल और देखने वर्गों का उल्लेख करने की जरूरत नहीं है के बीच प्रदान करते हैं

Observables MVC शैली आर्किटेक्चर में उपयोगी होते हैं सीधे एक दूसरे के लिए, लेकिन इसके बजाय कुछ साझा डेटा मॉडल के साथ काम कर सकते हैं जो डेटा प्रवाह को संचारित करता है। यह एक संयोग नहीं है कि पर्यवेक्षण पैटर्न और एमवीसी शैली वास्तुकला अवधारणा दोनों जेरोक्स पीआरसी में एक ही समय में उत्पन्न हुई - चीजें जुड़े हुए हैं।

जैसा कि Martin Fowler's GUI architectures में उल्लेख किया गया है, जीयूआई बनाने के लिए कई अलग-अलग दृष्टिकोण हैं। एमवीसी इनमें से सिर्फ एक है, उन सभी के दादाजी। एमवीसी अच्छी तरह से समझना अच्छा होता है (इसे अक्सर गलत समझा जाता है) और कई जगहों पर एमवीसी अवधारणाएं लागू होती हैं। आपके आवेदन के लिए आपको उस प्रणाली का उपयोग करना चाहिए जो किसी दिए गए पैटर्न का कठोर रूप से पालन करने के बजाय आपके लिए सबसे अच्छा महसूस करता है (जब तक कि आप किसी विशेष रूपरेखा का उपयोग नहीं कर रहे हैं जो किसी दिए गए पैटर्न को लागू करता है) और शूहोर्न की कोशिश करने के बजाए एप्लिकेशन के भीतर विभिन्न पैटर्न को अपनाने के लिए भी खुले रहें सब कुछ एक वैचारिक ढांचे में।

जावा बीन्स लगभग सभी जावा कार्यक्रमों का एक मौलिक हिस्सा हैं। यद्यपि परंपरागत रूप से अक्सर क्लाइंट ऐप्स में उपयोग किया जाता है, पर्यवेक्षक पैटर्न, PropertyChangeListeners के माध्यम से, Java Bean specification का एक हिस्सा बनाया गया था, क्योंकि यह बनाया गया था।जावाएफएक्स के अवलोकन और बाध्यकारी तत्व उस पहले के काम का एक पुनर्विक्रय है, जो इसे सीखने के लिए सीखने के लिए और अधिक आसान है और समझने में आसान है। शायद, यदि जावाएफएक्स देखने योग्य और बाध्यकारी तत्व जेडीके के हिस्से के रूप में दस या बारह साल पहले अस्तित्व में थे, तो ऐसी अवधारणाओं का उपयोग आम तौर पर पुस्तकालयों और ढांचे के कुछ शुद्ध जीयूआई ढांचे की तुलना में किया जाएगा।

सलाह

मैं MVVM model और अन्य जीयूआई आर्किटेक्चर पर विचार सुझाव देते हैं।

यदि आप एक मॉडल, दृश्य, प्रस्तुतकर्ता शैली का अनुसरण करते हुए एक मृत-आसान ढांचा चाहते हैं, तो निश्चित रूप से afterburner.fx एक स्पिन दें।

मुझे लगता है कि वास्तुकला की सही पसंद आपके आवेदन, आपके अनुभव और उन समस्याओं की जटिलता और जटिलता पर निर्भर करती है जिन्हें आप हल करने की कोशिश कर रहे हैं। उदाहरण के लिए, यदि आपके पास एक वितरित सिस्टम है, तो आप एमवीसी (या इसके अतिरिक्त) के बजाय REST principles का पालन कर सकते हैं। जो भी आप चुनते हैं, आर्किटेक्चर को हाथ में समस्या को हल करने में आपकी सहायता करनी चाहिए (और संभवतः भविष्य की समस्याओं) और विपरीत नहीं। समाधान को ओवर-आर्किटेक्ट करना एक आम जाल है और ऐसा करना बहुत आसान है, इसलिए इसे टालने का प्रयास करें।

चेतावनी

एक चेतावनी पर विचार करना है कि observables जरूरी दुष्प्रभाव के बारे में जो तर्क करने मुश्किल हो सकता है और अलगाव की अवधारणा को विरोधात्मक हो सकता है के माध्यम से काम करते हैं। JavaFX में कुछ अच्छे उपकरण हैं, जैसे कि ReadOnlyObjectWrapper और ReadOnlyListWrapper, अवलोकनों पर प्रभाव (क्षति नियंत्रण यदि आप चाहें) को सीमित करने में सहायता के लिए, इसलिए वे आपके सिस्टम में अमोक नहीं चलाते हैं। बेकार त्याग के साथ ऐसे उपकरण (और immutable objects) का उपयोग करें।

उदाहरण

एक सरल JavaFX आवेदन जो, observables का उपयोग कर tic-tac-toe का उल्लेख बनाया गया है के लिए से जानें।

FXML आधारित घटकों के साथ एक बड़े और जटिल जावाएफएक्स अनुप्रयोग को ढूढ़ने के एक अच्छे तरीके के लिए, SceneBuilder and SceneBuilderKit के लिए स्रोत कोड देखें। स्रोत कोड JavaFX mercurial source tree में उपलब्ध है, बस इसे जांचें और start learning पर देखें।

JavaFX UI controls architecture पर पढ़ें। JavaFX नियंत्रण स्रोत कोड की जांच करें (उदा। Button और ButtonSkin या ListView और ListViewSkin) यह देखने के लिए कि एमवीसी जैसी अवधारणाओं को जावाएफएक्स संरचनाओं का उपयोग करके कैसे लागू किया जा सकता है। उस सीखने के आधार पर, जावाएफएक्स नियंत्रण ढांचे प्रदान करता है कि आर्किटेक्चर का उपयोग कर अपने कुछ कस्टम नियंत्रण बनाने का प्रयास करें। अक्सर, जब आप अपना स्वयं का एप्लिकेशन बना रहे हैं तो आपको अपने नियंत्रण बनाने की आवश्यकता नहीं है (कम से कम वे जो जावाफैक्स Control फॉर्म प्राप्त करते हैं)। जावाएफएक्स नियंत्रण वास्तुकला विशेष रूप से पुन: प्रयोज्य नियंत्रण के निर्माण पुस्तकालयों का समर्थन करने के लिए तैयार की जाती है, इसलिए यह आमतौर पर सभी उद्देश्यों के लिए उपयुक्त नहीं है; इसके बजाय यह कुछ चीजों को पूरा करने के लिए एक सिद्ध तरीके का एक ठोस प्रदर्शन प्रदान करता है। साबित समाधानों को अपनाने और अनुकूलित करने से यह सुनिश्चित करने का एक लंबा सफर तय होता है कि आप सामानों को बिना किसी चीज को पुन: पेश नहीं करते हैं और आपको ठोस आधार पर निर्माण करने और दूसरों के परीक्षणों से सीखने की अनुमति देते हैं।

अपने कंक्रीट उदाहरण

के बारे में मैं सलाह देने के लिए आप के साथ जाने के लिए:

सबसे आसान तरीका से जोड़ने के लिए "मॉडल" और "देखें" मेरा कार्यक्रम बस बदलने के लिए होगा की " मॉडल "वर्ग एक ObservableList और नहीं एक ArrayList

हो सकता है कि बाहर की दुनिया के MachineMonitor से ObservableList बेनकाब करने के लिए एक ReadOnlyListWrapper का उपयोग किया है, ताकि कुछ भी नहीं कर सकते हैं इसे अनावश्यक रूप से संशोधित करें।

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

ऐसी संरचना का उपयोग मॉडल से आपके विचार को प्रभावी ढंग से अलग करता है। मॉडल वास्तव में यूआई के बारे में कुछ भी नहीं जानता है और ControlPanelSkin कार्यान्वयन को कोर मशीन मॉनिटर सिस्टम को बदले बिना पूरी तरह से अलग दृश्य प्रतिनिधित्व या तकनीक में बदला जा सकता है।

उपर्युक्त सामान्य दृष्टिकोण को रेखांकित करता है, तो आपको इसे अपने विशिष्ट उदाहरण के लिए ट्विक करने की आवश्यकता होगी।

संबंधित मुद्दे