java - प्ले! ढांचे का एक<lot> statics का उपयोग करता है




playframework playframework-1.x (10)

वाह, प्ले! ढांचे में इतनी सारी स्थिर विधियां हैं। जहां मैं स्कूल जाता हूं, हमें कभी भी किसी भी स्टेटिक्स का उपयोग करने के लिए कहा नहीं जाता था , फिर भी चलाएं! इसका उपयोग करता है जैसे कल नहीं है। क्या यह किसी भी तरह ठीक है? यदि हां, तो क्यों?

हम (7 लोग और मैं) Play का उपयोग करने की योजना बना रहे हैं! एक वेब ऐप से जुड़े एक परियोजना के लिए ढांचा। हमने इसे खेलने के साथ करने का फैसला किया! क्योंकि यह करने में काफी मजा आता है, हम सभी पहले से ही जावा को जानते हैं और असाइनमेंट बहुत कठिन है इसलिए हम एक अलग भाषा में प्रोग्राम कैसे सीखना सीखने के बजाय वास्तविक असाइनमेंट पर ध्यान केंद्रित करना चाहते थे।

हमें हमेशा बताया गया था, हालांकि, हमने कभी भी विकसित किए गए किसी भी जावा प्रोग्राम में 'स्थिर' का उपयोग नहीं किया है, लेकिन जब मैं Play को देखता हूं! ... ठीक है ... लगभग आधा तरीकों स्थिर हैं। </ अतिशयोक्ति>

मुझे लगता है कि, कम से कम, हम अपने प्रोजेक्ट को प्रोग्राम करने के लिए सिंगलटन ऑब्जेक्ट्स (स्कैला का उपयोग करके, उदाहरण के लिए ^^) का उपयोग कर सकते हैं, लेकिन मैं काफी चिंतित हूं कि वास्तव में ढांचे में कितनी स्थिरताएं हैं।

तो, क्या मुझे इस बारे में चिंतित होना चाहिए? जिस तरह से खेलते थे! डेवलपर्स ने इसे प्रोग्राम किया है ताकि इन सभी statics में कोई समस्या न हो?

(उदाहरण के लिए, इस धागे के बारे में एक राग है कि क्यों स्थिर सदस्यों को हर कीमत से बचा जाना चाहिए।)


मुझे लगता है, कम से कम, हम सिंगलटन वस्तुओं का उपयोग कर सकते हैं

जावा में सिंगलटन सभी स्थिर का उपयोग करने से ज्यादा अंतर नहीं करता है। राज्य के रूप में भी स्टोर करने के लिए बहुत कुछ नहीं है। मुझे लगता है कि आपको इसके बारे में चिंता नहीं करनी चाहिए।

तो, क्या मुझे इस बारे में चिंतित होना चाहिए? जिस तरह से खेलते थे! डेवलपर्स ने इसे प्रोग्राम किया है ताकि इन सभी statics में कोई समस्या न हो?

यह नहीं होगा। वास्तव में, यह ठीक है।


Play उदाहरण के लिए node.js जैसे कार्यात्मक दृष्टिकोण लेता है, और तर्कसंगत रूप से जावा में स्केल में 'अधिक समझ' बनाता है, उदाहरण के लिए टाइपएफ़ स्टैक धक्का दे रहा है। जैसा कि अन्य पोस्टर्स ने इंगित किया है, जावा को बाइटकोड इंस्ट्रूमेंटेशन (ला ला आस्पेक्ट जे) का उपयोग करके एक और स्टेटलेस / कार्यात्मक तरीके से व्यवहार करने के लिए बढ़ाया जा रहा है; स्कैला डिफ़ॉल्ट रूप से ऐसा करता है।


अब आप प्ले के भीतर स्प्रिंग डी का उपयोग कर सकते हैं, https://.com/a/16552598/10433 । मैं इसका उपयोग कर रहा हूं और यह अभी तक ठीक काम करता है।


एक बहुत ही संक्षिप्त रूप से, मैं कहूंगा कि यह समझ में आता है: वेब अनुरोध स्टेटलेस हैं, इसलिए अनुरोध प्राप्त करने के लिए कोई ऑब्जेक्ट नहीं है (= विधि)। इस प्रकार, एक यूआरआई जैसे मैपिंग (/ articles / archive? Date = 08/01/08 और पेज = 2 "को एक स्थिर विधि में archive() पर मैप करना, मुझे लगता है कि, आपकी एप्लिकेशन क्लास समझ में आता है।


प्रोग्रामिंग में कुछ भी के साथ, कभी भी सही जवाब कभी नहीं होता है। हमेशा की तरह। हमेशा अपवाद होते हैं और सही उत्तर हमेशा 'यह निर्भर करता है'।

यह सच है कि शुद्ध ओओ (जो मैं सभी के लिए हूं) में सांख्यिकी के लिए बहुत कम कमरा है। लेकिन यह भी सच है कि कभी-कभी वे सिर्फ समझ में आते हैं।

क्लासिक उदाहरण उपयोगिता विधियों है। निश्चित रूप से, यह बेहतर होगा अगर हम केवल हमारे abs() विधि को पूर्णांक में जोड़ सकें। लेकिन हम नहीं कर सकते; इसलिए हम Math.abs(int i) फंस गए हैं।

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

एक और चीज आंतरिक कक्षाएं है। यदि आप युक्त प्रकार के संबंध की आवश्यकता नहीं है तो आप अक्सर उन्हें स्थिर बनाना चाहते हैं।

मैंने कभी नहीं देखा है ! लेकिन यदि आप कहते हैं कि इसमें से 50% से अधिक स्थिर है, तो मुझे लगता है कि यह शायद बुरी तरह से डिजाइन किया गया था। यह कोई अपवाद नहीं है; बहुत सारे ढांचे हैं। इसे नीचे जाने मत दो। निश्चित रूप से इससे मत सीखो!
लेकिन अगर यह काम करता है तो भी आप इसका इस्तेमाल कर सकते हैं।


प्ले 2.4 में अब संपादित करें, इंजेक्शन स्वचालित रूप से किया जाता है। तो बस फ़ाइल routes में नियंत्रक पथ की शुरुआत में @ जोड़ना चाल बना देगा:

GET     /                  @controllers.Application.index()

पुराने संस्करणों (2.1 से 2.3) के लिए आपको ग्लोबल क्लास में getControllerInstance को ओवरराइड करना होगा, जैसे Documentantion में समझाया गया है।


मुख्य समस्या यह है कि स्थैतिक विधियों के पास केवल अन्य स्थैतिक विधियों और क्षेत्रों तक पहुंच है, जिसके परिणामस्वरूप 'स्थैतिक चिपकने वाला' होता है जिससे स्थिर विधियों को शेष स्थिर क्षेत्र (एस) के माध्यम से शेष अनुप्रयोग (जिसमें इसके सहयोगी शामिल होते हैं) के साथ मिलना पड़ता है। , जो लचीलापन की ओर जाता है।

अस्वीकरण: मुझे 'खेल' के बारे में ज्यादा जानकारी नहीं है!


मैं खेल में स्थिर तरीकों की संख्या से भी हैरान हूं, लेकिन अगर यह ठीक काम नहीं करता है ...

वास्तव में मैं आपके शिक्षक से सहमत नहीं हूं।

यदि किसी ऑब्जेक्ट में कोई राज्य नहीं है (यानी वैश्विक चर) लेकिन इसमें केवल उदाहरण के लिए विधियां हैं, तो यह आपको स्थिर तरीकों के बजाय ऑब्जेक्ट का उपयोग करने के लिए कोई लाभ नहीं देती है। सिवाय इसके कि यदि आप बाद में एक राज्य जोड़ने की योजना बना रहे हैं (राज्य जिसे साझा नहीं किया जाना चाहिए), या यदि आप इंटरफ़ेस का उपयोग कर रहे हैं और आसानी से कार्यान्वयन को स्विच करने में सक्षम होना चाहते हैं, तो स्थिर विधियों का उपयोग करना आसान है ...

जेडीके स्वयं, अपाचे कॉमन्स या कई ढांचे में स्थिर तरीके शामिल हैं:

  • StringUtils
  • Pattern.matches (regex, इनपुट)

----------

दरअसल मुझे लगता है कि आपको आश्चर्य है कि जेपीए.जावा जैसे वर्गों के बारे में क्या है: https://github.com/playframework/play/blob/master/framework/src/play/db/jpa/JPA.java

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

मुझे लगता है कि यह उपयोगिता के लिए इस तरह डिज़ाइन किया गया था, क्योंकि यह "getInstance" को कॉल करने के लिए उपयोगकर्ता के अनुकूल नहीं है और सत्र में इंजेक्शन करने के बजाय हर जगह आसानी से एक सत्र (थ्रेड से जुड़ा हुआ) आसानी से एक्सएमएल या ऑटोवॉयरिंग के साथ फैक्ट्री प्राप्त करने में सक्षम होता है। ..

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

इसलिए शायद नियमों का उपयोग करने से बचने के लिए एक नियम होना चाहिए, सिवाय इसके कि जब आप वास्तव में तंग युग्मन की परवाह नहीं करते हैं।

  • इस मामले पर, जब आप JPA.xxx () विधियों को कॉल करते हैं, तो आपका कोड कड़ाई से ढांचे के जेपीए कक्षा को खेलने के लिए जोड़ा जाता है। लेकिन मुझे नहीं लगता कि नाटक डिज़ाइन किया गया है ताकि आप कम से कम कुछ पुनर्विक्रय के बिना आसानी से एक ढांचे से दूसरे में स्विच कर सकें ...

  • यह ईजेबी 3 spec या उस तरह की चीजों के साथ एक बड़ा अंतर है: यदि ईजेबी 3 इकाई प्रबंधक के तरीके स्थिर हैं, तो आपको HibernateEntityManager.xxx () या ToplinkEntityManager.xxx () को कॉल करके कार्यान्वयन के लिए अपने कोड को कसकर जोड़ना होगा। इस मामले में, एक आम इंटरफेस है (और हम इंटरफेस पर स्थिर तरीकों को जोड़ नहीं सकते हैं)।

----------

  • वह वर्ग अन्य ढांचे पर उपयोग किए गए विनिर्देश का हिस्सा नहीं है।
  • जेपीए कक्षा में केवल एक कार्यान्वयन है: एक खेल द्वारा किया जाता है। और वे शायद एक दूसरा बनाने की योजना नहीं बना रहे हैं।
  • इस प्रकार आप Play Playwork का उपयोग कर रहे हैं, जबकि इस Play क्लास के लिए एक तंग युग्मन, मेरे लिए ठीक लगता है।

स्टेटिक नियंत्रक विधियां निश्चित रूप से Play के साथ चिंता का एक क्षेत्र हैं! ढांचा, और कुछ परीक्षण करने के बाद, मेरे लिए यह मुख्य कारण नहीं है कि खेल न करें! परियोजनाओं में आप वास्तव में यह देख सकते हैं कि एफओएसएस परियोजनाओं में जहां खेलें! प्रयोग किया जाता है। बहुत कम या कोई नियंत्रक परीक्षण नहीं है। स्थिर तरीकों के साथ कारण, डी मुश्किल हो जाता है। यह वह जगह है जहां उन्हें एएसपी.नेट एमवीसी के साथ और भी समय बिताया जाना चाहिए, जहां से खेलें! पहले ही प्रेरणा लेती है।

आम तौर पर आपके पास इस तरह का एक निर्माता है:

public HomeController( IService service ) {
   _service = service;
}
public Index() {
   var data = _service.getData();
   return View( data );
}

फिर आप नियंत्रक में IService कार्यान्वयन इंजेक्ट करने के लिए DI का उपयोग करते हैं। मुद्दा यह है कि आपके परीक्षणों में, आप नियंत्रक को चलाने से पहले IService को तुरंत चालू कर सकते हैं, और तब आपके द्वारा उत्पादित आईएस सेवा के आधार पर परिणाम का परीक्षण कर सकते हैं।

प्ले में यह बहुत मुश्किल हो जाता है। इस प्रकार नियंत्रक इकाई परीक्षण कठिन हो जाता है। यही है, मेरे लिए, एक महत्वपूर्ण समस्या है। इसलिए मैं प्ले से अन्य ढांचे की तलाश करता हूं! जावा दुनिया में। बिल्ली, मूल के साथ क्यों नहीं जाते और बस जरुबी का उपयोग करते हैं?


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

गैर-स्थैतिक नियंत्रक विधियों को अब नियंत्रक इंजेक्शन का उपयोग करके Play 2.1 में supported गया है, इसलिए यह बहुत स्पष्ट नहीं है कि वे शुरुआत से क्यों नहीं थे।





playframework-1.x