2014-04-01 5 views
5

मैंने हाल ही में this एल्म में प्रतिक्रियाशील प्रोग्रामिंग के बारे में दिलचस्प प्रस्तुति देखी है।एल्म के उच्च स्तरीय अमूर्तता को संरक्षित करते हुए एएलएम से या तो शुद्ध जावाएफएक्स या जावाएफएक्स + आरएक्सजेवा में मारियो उदाहरण का अनुवाद करना संभव है?

यह मैं आश्चर्य है कि क्या भाषा निर्माणों मारियो खेल लागू करने के लिए प्रयोग किया जाता है (नहीं दिखाया गया प्रस्तुति में, और भी नीचे चित्र में) के लिए इसी तरह उच्च स्तर भाषा मैप किया जा सकता है या तो शुद्ध JavaFX में या JavaFX में संयुक्त निर्माण करती बनाया RxJava के साथ?

दूसरे शब्दों में, क्या अकेले जावाएफएक्स में या जावाएफएक्स + आरएक्सजेवा में एक ही वैचारिक अवशोषण (यानी समय निर्भर मूल्य) का उपयोग करके एल्म में लागू मारियो गेम को व्यक्त करना संभव होगा?

तो अगर एक अनुभवी 1) JavaFX प्रोग्रामर या एक अनुभवी 2) JavaFX + RxJava + कार्यात्मक प्रोग्रामर बंदरगाह के लिए मारियो खेल एल्म से या तो 1) JavaFX या करने के लिए 2) JavaFX + RxJava तो जो प्रोग्रामर इस कार्य को पूरा कर सकता है चाहता है द्वारा समान उच्च स्तरीय abstractions का उपयोग कर एल्म में उपयोग किया गया था?

जावाएफएक्स के लिए मेरे मन में दिमाग में बाधाएं हैं और जावाएफएक्स + आरएक्सजेवा के लिए बाइंडिंग + ऑब्जर्वेबल्स/विषय/सदस्यता हैं।

enter image description here

उत्तर

7

मुझे एल्म पर एक त्वरित रूप से देखा गया था और यह काफी प्रभावशाली (और अभिव्यक्तिपूर्ण) है।

एल्म में आप अपने दृश्य का निर्माण के रूप में

Signal Element 

जो JavaFX में मोटे तौर पर

ObservableValue<Node> 

के बराबर होगा मतलब होगा JavaFX के लिए अनुभवहीन अनुवाद है कि आप प्रत्येक अद्यतन, पर पूरे दृश्य स्वैप जो निषिद्ध रूप से महंगा है। एल्म में, Element एक दृश्य नोड का एक अपरिवर्तनीय अमूर्त प्रतिनिधित्व है, जिसने स्क्रीन (डीओएम से बाहर) का निर्माण किया है। यह हर अद्यतन पर पूरे दृश्य ग्राफ को फिर से बनाने के लिए पर्याप्त सस्ता है (अपरिवर्तनीयता के कारण, अपरिवर्तित शाखाओं का पुन: उपयोग करना सुरक्षित है)। रूट Element को डोम को प्रस्तुत किया जाता है, लेकिन, जैसा कि मैं इसे समझता हूं, केवल पहली बार पूर्ण डोम का निर्माण होता है। बाद के अपडेट पर, एल्म रनटाइम पुराने रूट तत्व की तुलना करने के लिए एक पुराने एल्गोरिदम चलाता है और केवल डीओएम के उन हिस्सों को संशोधित करता है जिन्हें अद्यतन करने की आवश्यकता होती है, जो पर्याप्त तेज़ है। उसी तकनीक का उपयोग React.js द्वारा किया जाता है। तो एल्म और React.js दोनों उच्च स्तरीय कार्यात्मक abstraction प्रदान करते हैं, लेकिन प्रदर्शन कारणों के लिए कवर के तहत mutability का उपयोग करें।

कुछ अतिरिक्त वाक्य रचनात्मक शोर के साथ, आप अधिकांश एल्म संरचनाओं का अनुवाद जावाएफएक्स (*) में कर सकते हैं। उदाहरण के लिए,

lift2 display Window.dimensions gameState 

गायब टुकड़ा अपरिवर्तनीय सार विजेट अभ्यावेदन के पुस्तकालय और उनके JavaFX दृश्य ग्राफ में कुशल प्रतिपादन है

import static org.fxmisc.EasyBind.*; 

combine(Window.dimensions, gameState, display) 

के बराबर है।

तुम क्या कर सकता है:

  • JavaFX के लिए इस तरह के एक विजेट पुस्तकालय बनाने के;
  • या यहां तक ​​कि एएमएम को जावाएफएक्स (एचटीएमएल + जावास्क्रिप्ट के बजाय) संकलित करें।

मुझे इनमें से किसी एक को देखना अच्छा लगेगा।


(*) मुझे लगता है कि एल्म records बहुत शक्तिशाली होते हैं और एक जावा (या स्काला) में बॉयलरप्लेट के बहुत की आवश्यकता होगी।

एल्म:

type Point = { x:Float, y:Float } 

p = { 0.0, 0.0 } 
q = { p | x <- 5.0 } 

जावा:

class Point { 
    public final float x; 
    public final float y; 

    public Point(float x, float y) { 
     this.x = x; 
     this.y = y; 
    } 

    public Point updateX(float x) { 
     return new Point(x, y); 
    } 

    public Point updateY(float y) { 
     return new Point(x, y); 
    } 
} 

Point p = new Point(0.0, 0.0); 
Point q = p.updateX(5.0); 

स्काला:

case class Point(x: Float, y: Float) 

val p = Point(0.0, 0.0) 
val q = p.copy(x = 5.0f) 
+0

एल्म और जावाएफएक्स के बीच एक पत्राचार दिखाते हुए बहुत सटीक उत्तर! यह जवाब मेरी थीसिस में भी मेरी मदद करेगा। (बीटीडब्ल्यू, रिएक्टएफएक्स पर अच्छा काम। आपके [ब्लॉग] (http://tomasmikula.github.io/blog/2014/04/25/combining-reactfx-and-asynchronous-processing.html) पर इसके उदाहरण प्रभावशाली हैं I मेरे थीसिस fyi में ReactFX पर एक अनुभाग की योजना बनाई है।) – Eugen

+0

विस्तृत उत्तर के लिए धन्यवाद। जावाएफएक्स + आरएक्सजेवा में एल्म संरचनाओं का अनुवाद करने के बारे में कैसे? क्या यह एएमएम संरचनाओं को जावाएफएक्स में अनुवाद करने की तुलना में आसान (कम बॉयलरप्लेट) होगा? – jhegedus

+0

मुझे ऐसा नहीं लगता है। बॉयलरप्लेट जावा से गायब Elm _language_ सुविधाओं के कारण है, जैसे मजबूत प्रकार अनुमान, प्रकार उपनाम, रिकॉर्ड प्रकार ... कोई जावा पुस्तकालय भाषा में जोड़ने जा रहे हैं। शुद्ध (दुष्प्रभाव मुक्त) कार्यों और अपरिवर्तनीय वस्तुओं को जावा में लागू नहीं किया जा सकता है, लेकिन आपके स्वयं के अनुशासन द्वारा हासिल किया जा सकता है। जावाएफएक्स नोड्स डिज़ाइन द्वारा उत्परिवर्तनीय हैं, इसलिए आपको उल्लिखित अपरिवर्तनीय विजेट लाइब्रेरी की आवश्यकता है। जावा 8 लैम्बडास के साथ फंक्शन संरचना काफी आसान है। –

4

मैं कहना है कि यह संभव है, वास्तव में :-)

यह केवल एक अनुमान है के रूप में मैं बिल्कुल एल्म साथ इस क्षेत्र में थोड़ा अनुभव और कोई नहीं है यह कर के बिना।

मुझे लगता है कि आप ReactFX के लिए स्कैलाफ़ैक्स रैपर बनाकर एल्म के निकटतम हो जाएंगे, हालांकि आप शायद जावा 8 लैम्बडास को स्कैला के बजाय रेक्टएफएक्स के साथ संयोजन में भी इस्तेमाल कर सकते हैं। आपको संभावित रूप से अनावश्यकता और लालित्य प्राप्त करने के लिए ReactFX के साथ-साथ कई अन्य सुविधाओं के लिए कुछ एक्सटेंशन लागू करना होगा।

चेकआउट Deprecating the Observer Pattern यदि आपने पहले से ऐसा नहीं किया है। मुझे लगता है कि यह इस विषय के लिए काफी प्रासंगिक है, विशेष रूप से एक प्रतिक्रियाशील प्रोग्रामिंग मॉडल के बारे में सोचने के संबंध में, जो एक अवलोकन मॉडल (जो जावाएफएक्स ChangeListeners है) के विपरीत है। उस ने कहा, मुझे लगता है कि यदि आप रीएक्टएफएक्स जैसे लाइब्रेरीज़ का उपयोग करते हैं जो जावाएफएक्स प्रॉपर्टी और श्रोता फ्रेमवर्क पर बनाए जाते हैं, तो आप संभावित स्ट्रीमिंग प्रोग्रामिंग के लिए उपयोगी ईवेंट स्ट्रीम के उच्च स्तर के अबास्ट्रक्शन के साथ समाप्त हो सकते हैं।

निश्चित रूप से, आप ReactFX का उपयोग किए बिना जावाएफएक्स में मारियो गेम बना सकते हैं, लेकिन कोड काफी अलग होगा और आप एक अलग स्तर के अमूर्तता पर काम करेंगे जो आप ReactFX के साथ उपयोग करेंगे। तो शुद्ध JavaFX, ReactFX के बिना कम एल्म की तरह होगा।

नेटवर्क परत के लिए, akka का उपयोग मल्टी-प्लेयर गेम के लिए एक प्रतिक्रियाशील ढांचा प्रदान करने के लिए किया जा सकता है, इससे आप अपने यूआई और आपके संचार प्रणाली दोनों में प्रतिक्रियाशील प्रोग्रामिंग शीर्ष से नीचे का उपयोग कर सकते हैं।

मारियो नमूने में स्प्राइट एनिमेशन के लिए, Creating a Sprite Animation with JavaFX के लिए नेटपीर कोड अपनाने।

भौतिकी गणना के लिए आप JBox2D लाइब्रेरी का उपयोग कर सकते हैं। जावाएफएक्स गुणों और रीएक्टएफएक्स इवेंट स्ट्रीम और सब्सक्रिप्शन जैसी चीजों के बारे में जागरूक करने के लिए आपको जेबीओक्स 2 डी के आसपास किसी प्रकार का प्रतिक्रियाशील रैपर बनाना होगा। सरल मारियो नमूना के लिए, बाहरी पुस्तकालय का उपयोग शायद इसके लायक से अधिक परेशानी होगी। इसके बजाय आप एक मूल घर उगाए भौतिकी मॉडल (उदा।इस ball animation experiment की तरह कुछ) और इसे अपने प्रतिक्रियाशील ढांचे में लगाओ।

मैं टॉमस मिकुला के संपर्क में रहने की सलाह देता हूं, जिन्होंने ReactFX बनाया है, और उसे जावाएफएक्स प्रश्नों के लिए आपके प्रतिक्रियाशील प्रोग्रामिंग से पूछना है। Robert Ladstätter ने स्कैलाफ़एक्स के साथ कुछ अच्छी चीजें भी की हैं और आपको कुछ और सलाह देने में सक्षम हो सकती है, हालांकि मुझे नहीं पता कि वह प्रतिक्रियाशील प्रोग्रामिंग के साथ बिल्कुल काम कर रहा है या नहीं। मैं ScalaFX users forums को पिंग करने का भी सुझाव दूंगा, लेकिन मुझे लगता है कि आप पहले ही ऐसा कर चुके हैं :-)

Elm Mario sample बहुत आसान है, इसलिए मैं खुद को रेक्टएफएक्स में अनुवाद करने की सलाह देता हूं। तब मुझे लगता है कि आपके प्रश्न का उत्तर स्वयं स्पष्ट हो जाएगा। अब जब मैंने यह लिखा है => यदि आप वास्तव में इसे लागू नहीं करते हैं और अपने समाधान को सही उत्तर के रूप में प्रकाशित करते हैं, तो मुझे आपको शिकार करना पड़ सकता है और आप यह नहीं चाहते हैं :-)

+0

मैं आपका बिंदु देखता हूं :) बहुत धन्यवाद। प्रोत्साहन के लिए धन्यवाद। – jhegedus

+0

वर्तमान में मैं हास्केल स्कूल ऑफ एक्सप्रेशन पढ़ रहा हूं जिसमें हास्केल में प्रतिक्रियाशील गेम बनाने के लिए एक बहुत ही रोचक और बहुत प्रारंभिक अध्याय है। मैं अभी भी इस दिलचस्प क्षेत्र में काफी शुरुआत कर रहा हूं लेकिन उम्मीद है कि मैं जल्द ही गति प्राप्त करूंगा :) – jhegedus

4

मैं हूं वर्तमान में मेरे मास्टर की थीसिस के लिए कार्यात्मक जीयूआई प्रोग्रामिंग के साथ पारंपरिक ऑब्जेक्ट उन्मुख जीयूआई प्रोग्रामिंग की तुलना। असल में, एक हिस्सा जिसे मैं लंबे समय से शुरू करने वाला हूं, एएमएम का उपयोग जावाएफएक्स/स्कैलाएफ़एक्स में कई पारंपरिक जीयूआई कार्यक्रमों को फिर से बनाने के लिए कर रहा है। जब मैं इसके साथ समाप्त हो जाता हूं तो मैं शायद अधिक सटीक उत्तर देने में सक्षम हूं लेकिन मैं अभी भी कुछ आम तौर पर उपयोगी पॉइंटर्स प्रदान करना चाहता हूं।


सबसे पहले, वहाँ दो अच्छा कागजात कि एफआरपी परिदृश्य, अर्थात् “A Survey on Reactive Programming“ और “Towards Reactive Programming for Object-oriented Applications” के एक सिंहावलोकन प्रदान कर रहे हैं। पूर्व में, विशेष रूप से, एफआरपी प्रणालियों की वर्गीकरण प्रदान करता है जो "एफआरपी के भाई बहन" और "एफआरपी के चचेरे भाई" को अलग करता है (Fran के विचारों के प्रति अपने संबंधों की ओर इशारा करता है)। पर एफआरपी फोकस के भाई बहन, एफआरपी फोकस के चचेरे भाई घटना धाराओं, देखने योग्य संग्रह और एसिंक्रोनि पर ध्यान केंद्रित करते हैं और समय-भिन्न मूल्यों के प्रतिनिधित्व के लिए आदिम अवशेष नहीं हैं। दिमाग में उस भेद के साथ, एल्म एफआरपी और का एक भाई है RxJava/ReactFX FRP का चचेरा भाई है। मुझे लगता है कि आप कह सकते हैं कि वे विभिन्न जानवर हैं, भले ही दोनों एफआरपी सिस्टम हैं और स्वाभाविक रूप से ओवरलैप हैं। ,

OO राज्य स्पष्ट करता है, लेकिन यह समाहित जबकि:

दूसरा, कागज “Crossing State Lines: Adapting Object-Oriented Frameworks to Functional Reactive Languages” एल्म में के रूप में एफ आर पी दृष्टिकोण के बीच मतभेद और JavaFX में के रूप में पारंपरिक OOP दृष्टिकोण का एक बहुत ही अच्छा और संक्षिप्त सारांश प्रदान एफआरपी में राज्य प्रोग्रामर से भाषा के अस्थायी abstractions द्वारा छिपा हुआ है।

तो प्रोग्राम डिज़ाइन के लिए मूल रूप से अलग दृष्टिकोण है। इसलिए, मेरे लिए यह अभी तक स्पष्ट नहीं है कि आप एएमएम के साथ जावाएफएक्स (+ आरएक्सजेवा/रीएक्टएफएक्स) के साथ "समान" उच्च स्तरीय अबास्ट्रक्शंस कैसे प्राप्त कर सकते हैं। इसका मतलब यह नहीं है कि यह संभव नहीं है लेकिन यह पहली नज़र में स्पष्ट नहीं है।

अंत में

, मेरी थीसिस से परंपरागत OOP दृष्टिकोण JavaFX में एक ही परिणाम प्राप्त करने में बाधाएं बनाने के लिए की तुलना में एल्म और अपने चरम "alienness" के बारे में एक सामान्य अवलोकन साफ:

जीयूआई पुस्तकालयों का एक बहुत यहां तक ​​कि शुद्ध कार्यात्मक भाषाओं में भी एक एक (अनिवार्य) ऑब्जेक्ट उन्मुख जीयूआई टूलकिट पर पतली शिम होती है। इसका मतलब है, उदाहरण के लिए, विजेट्स शुद्ध कार्य नहीं हैं। विजेट्स में राज्य है और इसलिए एक पहचान है।यदि हम एक जीयूआई टूलकिट के नियंत्रण बोर्ड पर अपने अधिकतम मूल्य पर कार्यात्मक घुंडी को रूपांतरित करते हैं तो हमें एक ऐसी स्थिति में पहुंचना चाहिए जहां विजेट भी शुद्ध कार्यों के अलावा कुछ भी नहीं हैं। एल्म एक ही समय में अधिकतम कार्यात्मक भाषा और जीयूआई टूलकिट का ऐसा उदाहरण है। कॉलबैक सभी दुष्प्रभावों के बारे में हैं एल्म स्वाभाविक रूप से व्यवहार-संबंधित कोड के लिए कॉलबैक का उपयोग नहीं करता है बल्कि इसके बजाय FRP। जहां एक OOP भाषा में अनुकूलन सबसे अधिक बार विरासत के साथ हासिल की है, एल्म में वहाँ केवल समारोह रचना की तरीका है ...

प्रमुख मुद्दा है कि एल्म में देखा गया शुद्ध कार्य हैं और, मूल रूप से, एल्म आपको इस तरह से कोड बनाने के लिए मजबूर करता है। जावाएफएक्स में आपको मजबूर नहीं किया जाता है, इसलिए आपको जानबूझकर इसे करने के लिए सावधानी बरतनी चाहिए।

वैसे, मारियो जैसे एल्म गेम्स के लिए game skeleton है। आप इसका अध्ययन कर सकते हैं और इस कंकाल के बाद अपने जावाएफएक्स प्रोग्राम को कैसे डिजाइन करेंगे इस बारे में सोच सकते हैं। शायद आप अपने अध्ययन के बाद जावाएफएक्स के लिए ऐसा कंकाल भी बना सकते हैं? मुझे इसमें दिलचस्पी होगी।

+1

बहुत दिलचस्प लगता है, विस्तृत उत्तर के लिए धन्यवाद! कृपया अपने थीसिस के लिए एक लिंक पोस्ट करें, इसे समाप्त होने के बाद मुझे इसे पढ़ना अच्छा लगेगा। – jhegedus

+1

हां, ReactFX ईवेंट स्ट्रीम के बारे में है, लेकिन सादे जावाएफएक्स में पहले से ही समय-भिन्न मूल्य हैं, अर्थात् ObservableValue। ReactFX दोनों को कनवर्ट करने का एक आसान तरीका प्रदान करता है: 'EventStreams.valuesOf (observableValue)' एक अवलोकन योग्य मान से एक ईवेंट स्ट्रीम बनाता है, जबकि 'stream.to बाइंडिंग (प्रारंभिक वैल्यू)' एक ईवेंट स्ट्रीम को एक अवलोकन योग्य मान में बदल देता है। –

2

मैं इस सवाल उठाया गया है एक साल पहले। तब से मैंने एफआरपी के बारे में एक या दो बातें सीखी हैं। मुझे लगता है कि आरएक्स के साथ कम से कम आसानी से जवाब नहीं है, जावाफ़ैक्स + Sodium FRP लाइब्रेरी का उपयोग करना बेहतर होगा।

क्यों आरएक्स के साथ (बहुत आसानी से) संभव नहीं है? चूंकि ईएलएम एफआरपी है, जबकि आरएक्स एफआरपी शून्य लेनदेन (अस्पष्ट बोलने वाला) है। तो व्यावहारिक रूप से, अगर कोई ईएलएम में मारियो गेम को कार्यान्वित करना चाहेगा तो उसे आरएक्स में लेनदेन जोड़ना होगा (glitches से बचने के लिए)।

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