ऑब्जेक्ट-ओरिएंटेड क्लास डिज़ाइन


12

मैं अच्छे ऑब्जेक्ट ओरिएंटेड क्लास डिज़ाइन के बारे में सोच रहा था। विशेष रूप से, मेरे पास इन विकल्पों के बीच एक कठिन समय है:

  1. स्थिर बनाम उदाहरण विधि
  2. कोई पैरामीटर या वापसी मूल्य बनाम विधि, मापदंडों और वापसी मूल्य के साथ विधि
  3. ओवरलैपिंग बनाम अलग-अलग विधि कार्यक्षमता
  4. निजी बनाम सार्वजनिक विधि

उदाहरण 1:

यह कार्यान्वयन आवृत्ति विधियों का उपयोग करता है, जिसमें कोई वापसी मूल्य या पैरामीटर नहीं है, जिसमें कोई अतिव्यापी कार्यक्षमता नहीं है, और सभी विधियां सार्वजनिक हैं

XmlReader reader = new XmlReader(url);
reader.openUrl();
reader.readXml();
Document result = reader.getDocument();

उदाहरण 2:

यह कार्यान्वयन अतिव्यापी कार्यक्षमता और निजी तरीकों के साथ, वापसी मूल्यों और मापदंडों के साथ स्थैतिक तरीकों का उपयोग करता है

Document result = XmlReader.readXml(url); 

उदाहरण के लिए, सभी विधियाँ सार्वजनिक उदाहरण हैं, जो उन्हें इकाई परीक्षण में आसान बनाती हैं। हालाँकि सभी विधियाँ अलग-अलग हैं, फिर भी readXml () उस ओपनयूआरएल () पर निर्भर है, जिसे पहले कहा जाना चाहिए। सभी डेटा उदाहरण क्षेत्रों में घोषित किए जाते हैं, इसलिए किसी भी तरीके में कोई वापसी मान या पैरामीटर नहीं है, सिवाय निर्माणकर्ता और एक्सेसर्स के।

उदाहरण दो में, केवल एक विधि सार्वजनिक है, बाकी निजी स्थैतिक हैं, जो उन्हें इकाई परीक्षण के लिए कठिन बनाता है। मेथड्स उस रीडएक्सएमएल () कॉल ओपेनअर्ल () में ओवरलैप हो रहे हैं। कोई फ़ील्ड नहीं है, सभी डेटा को विधियों में पैरामीटर के रूप में पारित किया जाता है और परिणाम तुरंत वापस आ जाता है।

उचित वस्तु उन्मुख प्रोग्रामिंग करने के लिए मुझे किन सिद्धांतों का पालन करना चाहिए?


3
जब आप मल्टी थ्रेडिंग करते हैं तो स्थैतिक चीजें खराब होती हैं। दूसरे दिन, मेरे पास XMLWriter.write (डेटा, फ़ाइलल) की तरह एक स्थिर XMLWriter था। हालाँकि, चूंकि यह एक निजी स्टैटिक फाइलस्ट्रीम था, इसलिए एक ही समय में कई थ्रेड्स से इस क्लास का उपयोग करते हुए, पहले थ्रेड्स फाइलस्ट्रीम को ओवरराइट करने के लिए दूसरा थ्रेड बनता था, जिससे एक त्रुटि उत्पन्न होती है जिसे ढूंढना बहुत कठिन होगा। स्थैतिक सदस्यों के साथ स्टेटिक क्लास + मल्टी-थ्रेडिंग आपदा के लिए एक नुस्खा है।
प्रति अलेक्जेंडरसन

1
@Paxinum। आपके द्वारा वर्णित समस्या एक राज्य समस्या है, न कि "स्थिर" समस्या। यदि आपने गैर-स्थैतिक सदस्यों के साथ एक सिंगलटन का उपयोग किया है तो आपके पास मल्टी-थ्रेडिंग के साथ एक ही मुद्दा होगा।
mike30

2
@Per Alexandersson समसामयिक तरीकों के संबंध में स्थैतिक तरीके खराब नहीं हैं। स्टेटिक स्थिति खराब है। यही कारण है कि कार्यात्मक प्रोग्रामिंग, जिसमें सभी विधियां स्थिर हैं, समवर्ती स्थितियों में बहुत अच्छी तरह से काम करती हैं।
युली बॉनर

जवाबों:


11

उदाहरण 2 परीक्षण के लिए काफी खराब है ... और मेरा मतलब यह नहीं है कि आप आंतरिक परीक्षण नहीं कर सकते। आप अपनी XmlReaderवस्तु को किसी नकली वस्तु से नहीं बदल सकते क्योंकि आपके पास कोई वस्तु नहीं है।

उदाहरण 1 का उपयोग करने के लिए अनावश्यक रूप से कठिन है। व्हाट अबाउट

XmlReader reader = new XmlReader(url);
Document result = reader.getDocument();

जो आपके स्थैतिक विधि की तुलना में उपयोग करने के लिए कोई कठिन नहीं है।

URL खोलना, XML पढ़ना, बाइट्स को स्ट्रिंग्स में कनवर्ट करना, पार्स करना, क्लोज़ सॉकेट्स और जो भी हो, जैसी चीजें निर्बाध हैं। एक वस्तु बनाना और उसका उपयोग करना महत्वपूर्ण है।

तो IMHO उचित OO डिज़ाइन सिर्फ दो चीजों को सार्वजनिक करने के लिए है (जब तक कि आपको किसी कारण से मध्यवर्ती चरणों की आवश्यकता न हो)। स्टेटिक बुराई है।


-1। YOu वास्तव में XmlReader को एक नकली वस्तु से बदल सकता है। विटहा ब्रेन डेड ओपन सोर्स मोइक फ्रेमवर्क नहीं है, लेकिन एक अच्छे औद्योगिक ग्रेड एक के साथ; आप प्रति डेवलपर सैकड़ों यूएसडी की लागत लेते हैं, लेकिन एपीआई के प्रकाशित प्रकाशन में सील कार्यक्षमता का परीक्षण करने के लिए अद्भुत काम करता है।
टॉमटॉम

2
TomTom की बिक्री पिच पर लिसिंग न करने के लिए +1। जब मुझे एक लाइनर चाहिए तो मैं कुछ ऐसा Document result = new XmlReader(url).getDocument();क्यों लिखूंगा ? ताकि मैं इसे अपग्रेड कर सकूं Document result = whateverReader.getDocument();और whateverReaderकुछ और करके मुझे सौंप सकूं।
कैंडिड_ऑरेंज सेप

6

यहाँ बात है - कोई एक सही उत्तर नहीं है, और "उचित वस्तु उन्मुख डिजाइन" की कोई पूर्ण परिभाषा नहीं है (कुछ लोग आपको एक की पेशकश करेंगे, लेकिन वे अनुभवहीन हैं ... उन्हें समय दें)।

यह सब आपके GOALS पर आता है।

आप एक कलाकार हैं, और कागज कोरा है। आप एक नाजुक, बारीक पिंक ब्लैक एंड व्हाइट साइड पोर्ट्रेट, या मिश्रित नीयन के विशाल गमलों के साथ एक सार चित्र बना सकते हैं। या बीच में कुछ भी।

तो जो समस्या आप हल कर रहे हैं, उसके लिए क्या संकेत हैं? उन लोगों की शिकायतें क्या हैं जिन्हें xml के साथ काम करने के लिए आपकी कक्षाओं का उपयोग करने की आवश्यकता है? उनकी नौकरी के बारे में क्या मुश्किल है? वे किस तरह का कोड लिखने की कोशिश कर रहे हैं जो आपके पुस्तकालय में कॉल को घेरता है, और आप उनके लिए बेहतर प्रवाह कैसे बना सकते हैं?

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

नरक, जो आपको शायद करने की आवश्यकता है वह कोड है 4 या 5 अलग-अलग तरीकों से, फिर अपने उपभोक्ता टोपी पर रखो और कोड लिखें जो सभी 5 का उपयोग करता है, और देखें कि कौन सा बेहतर लगता है। यदि आप अपने पूरे पुस्तकालय के लिए ऐसा नहीं कर सकते हैं, तो इसे एक सबसेट के लिए करें। और आपको अपनी सूची में कुछ अतिरिक्त विकल्प भी जोड़ने की आवश्यकता है - एक धाराप्रवाह इंटरफ़ेस, या अधिक कार्यात्मक दृष्टिकोण, या नामित पैरामीटर, या डायनामिकऑब्जेक्ट पर आधारित कुछ के बारे में क्या ताकि आप सार्थक "छद्म-तरीके" बना सकें जो उनकी मदद करें बाहर?

अभी jQuery राजा क्यों है? Resig और टीम इस प्रक्रिया को जब तक वे एक वाक्यात्मक सिद्धांत है कि भर में आया था पीछा किया, क्योंकि अविश्वसनीय रूप से जे एस कोड की राशि यह डोम और घटनाओं के साथ काम करने के लिए ले जाता है कम कर दिया। जब उन्होंने शुरू किया था तो यह वाक्यात्मक सिद्धांत उनके या किसी और के लिए स्पष्ट नहीं था। उन्होंने इसे प्राप्त किया।

एक प्रोग्रामर के रूप में, यही आपकी सर्वोच्च कॉलिंग है। जब तक आप इसे नहीं ढूंढते तब तक आप अंधेरे की कोशिश कर रहे सामान में चारों ओर बैठ जाते हैं। जब आप ऐसा करेंगे, तो आपको पता चल जाएगा। और आप अपने उपयोगकर्ताओं को एक विशाल उत्पादकता छलांग देंगे । और यही डिजाइन (सॉफ्टवेयर क्षेत्र में) है।


1
इसका तात्पर्य यह है कि "कैसा महसूस होता है" के अलावा अन्य सर्वोत्तम प्रथाओं और अन्य प्रथाओं के बीच कोई अंतर नहीं है। यह है कि आप कैसे कीचड़ की अचूक गेंदों के साथ हवा करते हैं - क्योंकि कई डेवलपर्स, कक्षा की सीमाओं के पार तक पहुंचते हैं, आदि, "लगता है" बस शानदार गुस्सा।
एमी ब्लैंकेनशिप

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

... वह इन सभी संभावित विकल्पों का सामना करता है। उन विकल्पों में से कोई भी "सही उत्तर" नहीं है। यह सिस्टम के लक्ष्यों और दर्द बिंदुओं से प्रेरित है। मैं आपको गारंटी देता हूं कि हास्केल प्रोग्रामर को नहीं लगता कि सभी तरीके उदाहरण के तरीके होने चाहिए। और लिनक्स कर्नेल प्रोग्रामर को नहीं लगता कि टीडीडी को सुलभ बनाना सभी के लिए बहुत महत्वपूर्ण है। और C ++ गेम प्रोग्रामर अक्सर अपने डेटा को ऑब्जेक्ट में सब कुछ एनकैप करने की तुलना में स्मृति में एक तंग डेटा संरचना में बंडल करते हैं। हर "बेस्ट प्रैक्टिस" किसी दिए गए संदर्भ में केवल "सर्वश्रेष्ठ अभ्यास" है, और किसी अन्य संदर्भ में एक विरोधी पैटर्न है।
चार्ली फूल

@AmyBlankenship एक और बात: मैं इस बात से असहमत हूं कि कक्षा की सीमाओं के पार पहुंचना "अद्भुत अद्भुत लगता है।" यह कीचड़ की अचूक गेंदों की ओर जाता है, जो भयानक लगता है । मुझे लगता है कि आप इस समस्या को हल करने की कोशिश कर रहे हैं कि कुछ कार्यकर्ता मैला / असंबद्ध / बहुत अनुभवहीन हैं। उस स्थिति में, जो व्यक्ति सावधान, प्रेरित और अनुभवी है, उसे मुख्य विकल्प बनाने चाहिए, और उन्हें "सर्वश्रेष्ठ आचरण" कहना चाहिए। लेकिन, उन "बेस्ट प्रैक्टिस" को चुनने वाला व्यक्ति अभी भी "सही लगता है" के आधार पर चुनाव कर रहा है , और कोई सेट सही उत्तर नहीं हैं। आप बस नियंत्रित कर रहे हैं कि कौन विकल्प बनाता है।
चार्ली फूल

मैंने कई प्रोग्रामर्स के साथ काम किया है, जो खुद को सीनियर लेवल का समझते थे और प्रबंधन द्वारा इस तरह से सोचा जाता था, जो दृढ़ता से मानते थे कि स्टैटिक्स और सिंग्लेटन्स संचार के मुद्दों को संभालने के लिए बिल्कुल सही तरीका था। इस सवाल का स्थिर हिस्सा भी तब तक नहीं पूछा जाता था, जब वह कक्षा की सीमाओं के पार पहुंच जाता है, जैसे कि डेवलपर्स को "गलत" लगता है, और न ही यह जवाब होगा कि स्थिर विकल्प की वकालत करने वाले किसी भी वोट को प्राप्त करते हैं।
एमी ब्लेंकशिप 14

3

दूसरा विकल्प बेहतर है क्योंकि यह लोगों के लिए उपयोग करने के लिए सरल है (भले ही यह सिर्फ आप हो), बहुत सरल।

इकाई परीक्षण के लिए, मैं सिर्फ इंटरफ़ेस का परीक्षण करूँगा, यदि आप वास्तव में निजी से संरक्षित आंतरिक को स्थानांतरित करना चाहते हैं, तो आंतरिक नहीं।


2
इकाई परीक्षण के प्रयोजनों के लिए, यदि आपके परीक्षण मामले एक ही पैकेज में हैं, तो आप अपने तरीकों को निजी (डिफ़ॉल्ट) भी बना सकते हैं।

अच्छी बात - यह बेहतर है।

3

1. स्थैतिक बनाम उदाहरण

मुझे लगता है कि अच्छे ओओ डिज़ाइन और क्या नहीं है, इसके बारे में बहुत स्पष्ट दिशानिर्देश हैं। समस्या यह है कि ब्लॉग जगत अच्छे को बुरे और बदसूरत से अलग करना मुश्किल बनाता है। आप किसी प्रकार के संदर्भ का समर्थन कर सकते हैं, यहां तक ​​कि सबसे खराब अभ्यास का भी आप सोच सकते हैं।

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

निर्भरता को वास्तव में समझने के लिए, डेवलपर्स को कोड की प्रत्येक पंक्ति को पढ़ना चाहिए। यह दूरी पर स्पूकी एक्शन का कारण बनता है: जब परीक्षण सूट चल रहा है, तो एक परीक्षण में उत्परिवर्तित वैश्विक स्थिति अप्रत्याशित रूप से विफल होने के लिए एक बाद या समानांतर परीक्षण का कारण बन सकती है। स्थैतिक निर्भरता को मैनुअल या ग्लिस निर्भरता इंजेक्शन का उपयोग करके तोड़ें।

दूरी पर स्पूकी एक्शन तब होता है जब हम एक ऐसी चीज चलाते हैं जिसे हम मानते हैं कि वह अलग-थलग है (क्योंकि हमने कोई संदर्भ नहीं दिया है) लेकिन सिस्टम के दूर के स्थानों में अप्रत्याशित बातचीत और राज्य परिवर्तन होते हैं जिसके बारे में हमने ऑब्जेक्ट को नहीं बताया था। यह केवल वैश्विक स्थिति के माध्यम से हो सकता है।

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

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

2. इनपुट पैरामीटर्स और रिटर्न वैल्यूज बनाम मेथड्स विथ नॉन

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

किसी भी समय आपके पास संग्रहीत स्थिति है, आपके पास साइड-इफेक्ट्स की संभावना है, इसलिए सुनिश्चित करें कि आप हमेशा इसका उपयोग दिमाग से करते हैं। इसका मतलब है कि आपको परिभाषित इनपुट और / या आउटपुट के साथ कार्यों को प्राथमिकता देना चाहिए ।

और, वास्तव में, ऐसे फ़ंक्शंस, जिन्होंने इनपुट और आउटपुट को परिभाषित किया है, परीक्षण करना बहुत आसान है - आपको यहां एक फ़ंक्शन चलाने की ज़रूरत नहीं है और वहां पर जाकर देखें कि क्या हुआ था, और आपको कहीं संपत्ति स्थापित करने की आवश्यकता नहीं है इससे पहले कि आप परीक्षण के तहत फ़ंक्शन चलाते हैं।

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

3. अतिव्यापी बनाम विचलित

मुझे सवाल समझ नहीं आ रहा है। 2 अतिव्यापी तरीकों से क्या फायदा होगा?

4. निजी बनाम सार्वजनिक

कुछ भी उजागर न करें जिसे आपको उजागर करने की आवश्यकता नहीं है। हालांकि, मैं निजी का बहुत बड़ा प्रशंसक नहीं हूं। मैं C # डेवलपर नहीं, बल्कि ActionScript डेवलपर हूं। मैंने एडोब के फ्लेक्स फ्रेमवर्क कोड में बहुत समय बिताया है, जो कि 2007 में लिखा गया था। और उन्होंने निजी बनाने के लिए कुछ बहुत ही बुरे विकल्प बनाए, जो इसे अपनी कक्षाओं को विस्तारित करने की कोशिश कर एक बुरा सपना बनाता है।

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


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

एक बात के लिए, आपको संभवतः अपने ऑब्जेक्ट निर्माण को इसके उपयोग से अलग करना चाहिए । तो आप आमतौर पर new XMLReader()जहां यह प्रयोग किया जाता है के बगल में अपना अधिकार नहीं होगा ।

इसके अलावा, जैसा कि @djna कहती है, आपको अपने XML रीडर उपयोग में आने वाले तरीकों का इनकैप्सुलेट करना चाहिए, ताकि आपके API (उदाहरण उदाहरण) को सरल बनाया जा सके:

_document Document = reader.read(info);

मुझे नहीं पता कि C # कैसे काम करता है, लेकिन जब से मैंने कई वेब तकनीकों के साथ काम किया है, मुझे संदेह होगा कि आप हमेशा XML दस्तावेज़ को तुरंत वापस नहीं कर पाएंगे (शायद एक वादा या भविष्य के प्रकार के अलावा ऑब्जेक्ट), लेकिन मैं आपको C # में एसिंक्रोनस लोड को संभालने के तरीके के बारे में सलाह नहीं दे सकता।

ध्यान दें कि इस दृष्टिकोण के साथ, आप कई कार्यान्वयन बना सकते हैं जो एक पैरामीटर ले सकते हैं जो उन्हें बताता है कि एक XML ऑब्जेक्ट को कहां / क्या पढ़ना और वापस करना है, और अपनी परियोजना की जरूरतों के आधार पर उन्हें स्वैप करें। उदाहरण के लिए, आप किसी डेटाबेस से, स्थानीय स्टोर से, या अपने मूल उदाहरण के अनुसार, URL से सीधे पढ़ सकते हैं। यदि आप एक स्थिर विधि का उपयोग करते हैं तो आप ऐसा नहीं कर सकते।


2

ग्राहक के दृष्टिकोण पर ध्यान दें।

IReader reader = new XmlReader.readXml(url);  // or injection, or factory or ...
Document document = reader.read();

स्टेटिक तरीके भविष्य के विकास को सीमित करते हैं, हमारा क्लाइंट संभवतः कई अलग-अलग कार्यान्वयनों द्वारा प्रदान किए गए इंटरफ़ेस के संदर्भ में काम कर रहा है।

आपके खुले / पढ़े मुहावरे के साथ प्रमुख समस्या यह है कि क्लाइंट को उस ऑर्डर को जानना होगा जिसमें कॉल करने के तरीके हैं, जब वह केवल सरल काम करना चाहता है। यहाँ स्पष्ट है, लेकिन एक बड़े वर्ग में यह स्पष्ट से बहुत दूर है।

परीक्षण करने के लिए सिद्धांत विधि पढ़ी जाती है ()। आंतरिक तरीकों को परीक्षण कार्यक्रमों को न तो सार्वजनिक और न ही निजी बनाकर और एक ही पैकेज में परीक्षण करके दृश्यमान बनाया जा सकता है - परीक्षणों को अभी भी जारी कोड से अलग रखा जा सकता है।


क्या डिफ़ॉल्ट दृश्यता वाली विधियां अभी भी दिखाई दे रही हैं, अगर परीक्षण सूट एक अलग परियोजना में है?
सियामी जूल

जावा प्रोजेक्ट्स के बारे में नहीं जानता। परियोजनाएं एक आईडीई निर्माण हैं। संकलक और जेवीएम उन पैकेजों को देखते हैं जो परीक्षण किए गए और परीक्षक वर्ग - एक ही पैकेज में हैं, डिफ़ॉल्ट दृश्यता की अनुमति है। ग्रहण में मैं दो अलग-अलग स्रोत निर्देशिकाओं के साथ एक एकल परियोजना का उपयोग करता हूं। मैं सिर्फ दो परियोजनाओं के साथ कोशिश की है, यह काम करता है।

2

स्थिर बनाम उदाहरण विधि

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

कोई पैरामीटर या वापसी मूल्य बनाम विधि, मापदंडों और वापसी मूल्य के साथ विधि

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

ओवरलैपिंग बनाम अलग-अलग विधि कार्यक्षमता

अतिव्यापी कार्यक्षमता से बचने का प्रयास करना एक अच्छा विचार है। कभी-कभी यह मुश्किल हो सकता है, लेकिन जब तर्क में बदलाव आवश्यक होता है, तो एक ही विधि को बदलना बहुत आसान होता है, जिसका पुन: उपयोग किया जाता है, समान कार्यक्षमता वाले तरीकों का एक पूरा गुच्छा बदलने से

निजी बनाम सार्वजनिक विधि

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


1

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

XmlReader.read => twice "read"

मुझे लगता है कि आपको एक XML की आवश्यकता है, इसलिए मैं एक ऐसी वस्तु XML बनाऊंगा जिसे पाठ प्रकार से बनाया जा सके (मुझे नहीं पता C # ... जावा में इसे स्ट्रिंग कहा जाता है)। उदाहरण के लिए

class XML {
    XML(String text) { [...] }
}

आप इसका परीक्षण कर सकते हैं और यह स्पष्ट है। फिर यदि आपको एक कारखाने की आवश्यकता है, तो आप एक कारखाना विधि जोड़ सकते हैं (और यह आपके 2 उदाहरण की तरह स्थिर हो सकता है)। उदाहरण के लिए

class XML {
    XML(String text) { [...] }

    static XML fromUrl(url) { [...] }

}

0

आप कुछ सरल नियमों का पालन कर सकते हैं। यदि आप नियमों के कारणों को समझते हैं तो यह मदद करता है।

स्थिर बनाम उदाहरण विधि

विधियों के लिए आपको सचेत रूप से यह निर्णय लेने की आवश्यकता नहीं है। यदि ऐसा प्रतीत होता है कि आपकी विधि किसी भी क्षेत्र के सदस्यों का उपयोग नहीं कर रही है (आपके पसंदीदा विश्लेषक को आपको ऐसा बताना चाहिए), तो आपको स्थैतिक कीवर्ड जोड़ना चाहिए।

कोई पैरामीटर या वापसी मूल्य बनाम विधि, मापदंडों और वापसी मूल्य के साथ विधि

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

ओवरलैपिंग बनाम अलग-अलग विधि कार्यक्षमता

मुझे नहीं लगता कि यह कोई मुद्दा है। अन्य विधियों को कॉल करने के तरीके ठीक हैं यदि यह कार्यों को छोटे विशिष्ट कार्यात्मक विखंडू में काटता है।

निजी बनाम सार्वजनिक विधि

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.