मैंने कुछ उत्तरों को देखा है और Google पर खोजा है, लेकिन मुझे कुछ भी मददगार नहीं मिला (यानी, इसका कोई दुष्प्रभाव नहीं होगा)।
अमूर्त में मेरी समस्या यह है कि मेरे पास एक वस्तु है और उस पर परिचालन का एक लंबा अनुक्रम करने की आवश्यकता है; मैं इसे असेंबली लाइन की तरह समझता हूं, जैसे कार बनाना।
मेरा मानना है कि इन ऑब्जेक्ट्स को मेथड ऑब्जेक्ट्स कहा जाएगा ।
तो इस उदाहरण में कुछ बिंदु पर मेरे पास एक CarWithoutUpholstery होगी, जिस पर मुझे फिर installBackSeat, installFrontSeat, installWoodenInserts चलाने की आवश्यकता होगी (संचालन एक दूसरे के साथ हस्तक्षेप नहीं करते हैं, और समानांतर में भी किया जा सकता है)। ये संचालन CarWithoutUpholstery.worker () द्वारा किया जाता है और एक नई वस्तु प्राप्त करता है जो CarWithUpholstery होगी, जिस पर मैं तब CleanInsides (), VerNoUpholsteryDefects (), और इसी तरह चलाऊंगा।
एक ही चरण में परिचालन पहले से ही स्वतंत्र है, यानी, मैं पहले से ही उनमें से एक सबसेट के साथ जूझ रहा हूं जिसे किसी भी क्रम में निष्पादित किया जा सकता है (आगे और पीछे की सीटें किसी भी क्रम में स्थापित की जा सकती हैं)।
मेरा तर्क वर्तमान में कार्यान्वयन की सादगी के लिए प्रतिबिंब का उपयोग करता है।
यही है, एक बार जब मेरे पास CarWithoutUpholstery है, तो ऑब्जेक्ट खुद को PerformSomething () नामक विधियों के लिए निरीक्षण करता है। उस समय यह इन सभी विधियों को कार्यान्वित करता है:
myObject.perform001SomeOperation();
myObject.perform002SomeOtherOperation();
...
त्रुटियों और सामान की जाँच करते समय। जबकि ऑपरेशन का आदेश महत्वहीन है, मैंने कभी-कभी एक लेक्सोग्राफ़िक ऑर्डर सौंपा है, जिसमें मुझे पता चलता है कि कुछ ऑर्डर सभी के बाद महत्वपूर्ण है। यह YAGNI का विरोधाभास करता है , लेकिन इसकी लागत बहुत कम थी - एक साधारण प्रकार () - और यह एक बड़े पैमाने पर विधि का नाम बदलने (या परीक्षण करने के कुछ अन्य तरीके पेश कर सकता है, जैसे कि तरीकों की एक सरणी) रेखा के नीचे।
एक अलग उदाहरण
हम कहते हैं कि मुझे एक कार बनाने के बजाय किसी पर एक गुप्त पुलिस रिपोर्ट संकलित करनी होगी, और इसे मेरे ईविल ओवरलॉर्ड को जमा करना होगा । मेरी अंतिम वस्तु एक रेडीपोर्ट होगी। इसके निर्माण के लिए मैं बुनियादी जानकारी (नाम, उपनाम, पति या पत्नी) इकट्ठा करके शुरू करता हूं। यह मेरा चरण ए है। इस बात पर निर्भर करता है कि पति या पत्नी है या नहीं, मुझे इसके बाद बी 1 या बी 2 के चरणों में जाना होगा, और एक या दो लोगों पर कामुकता संबंधी डेटा एकत्र करना होगा। यह नाइट लाइफ, स्ट्रीट कैम, सेक्स शॉप की बिक्री प्राप्तियों और क्या नहीं, को नियंत्रित करने वाले विभिन्न ईविल मिनियंस के लिए कई अलग-अलग प्रश्नों से बना है। इत्यादि इत्यादि।
यदि पीड़ित का कोई परिवार नहीं है, तो मैं GetInformationAboutFamily चरण में भी प्रवेश नहीं करूंगा, लेकिन अगर मैं करता हूं, तो यह अप्रासंगिक है कि क्या मैं पहले पिता या माता या भाई-बहन (यदि कोई हो) को लक्षित करता हूं। लेकिन मैं ऐसा नहीं कर सकता, अगर मैंने फैमिलीस्टैटसकैच नहीं किया है, जो कि पहले के चरण से संबंधित है।
यह सब अद्भुत काम करता है ...
- अगर मुझे कुछ अतिरिक्त ऑपरेशन की आवश्यकता है, तो मुझे केवल एक निजी विधि जोड़ने की आवश्यकता है,
- यदि ऑपरेशन कई चरणों में सामान्य है, तो मुझे यह एक सुपरक्लास से विरासत में मिल सकता है,
- संचालन सरल और आत्म-निहित हैं। एक ऑपरेशन के बाद कभी भी कोई मान दूसरों (कार्य है कि में से किसी के लिए आवश्यक है है , एक अलग चरण में प्रदर्शन कर रहे हैं)
- रेखा से नीचे की वस्तुओं को कई परीक्षण करने की आवश्यकता नहीं है क्योंकि वे तब भी मौजूद नहीं हो सकते थे जब उनके निर्माता वस्तुओं ने उन स्थितियों को पहले स्थान पर सत्यापित नहीं किया था। यानी, जब डैशबोर्ड में आवेषण रखते हैं, डैशबोर्ड की सफाई करते हैं और डैशबोर्ड की पुष्टि करते हैं, तो मुझे यह सत्यापित करने की आवश्यकता नहीं है कि डैशबोर्ड वास्तव में है ।
- यह आसान परीक्षण के लिए अनुमति देता है। मैं आसानी से एक आंशिक वस्तु का मजाक उड़ा सकता हूं और उस पर कोई भी विधि चला सकता हूं, और सभी ऑपरेशन नियतात्मक ब्लैक बॉक्स हैं।
...परंतु...
समस्या तब पैदा हुई जब मैंने अपनी एक विधि ऑब्जेक्ट में एक आखिरी ऑपरेशन जोड़ा , जिससे समग्र मॉड्यूल एक अनिवार्य जटिलता सूचकांक ("एन प्राइवेट तरीकों से कम") से अधिक हो गया।
मैंने पहले ही मामले को ऊपर ले लिया है और सुझाव दिया है कि इस मामले में, निजी तरीकों का धन आपदा का कोई विवरण नहीं है। जटिलता है वहाँ है, लेकिन यह वहाँ है, क्योंकि आपरेशन है जटिल है, और वास्तव में यह सब है कि जटिल नहीं है - यह सिर्फ है लंबे समय तक ।
ईविल ओवरलॉर्ड उदाहरण का उपयोग करते हुए, मेरी समस्या यह है कि ईविल ओवरलॉर्ड (उर्फ वह कौन होगा, जिसने इनकार नहीं किया) ने सभी आहार संबंधी जानकारी का अनुरोध किया , मेरे आहार मंत्रालय ने मुझे बताया कि मुझे रेस्तरां, किचनसेट, स्ट्रीट वेंडर, बिना लाइसेंस वाले स्ट्रीट वेंडर्स, ग्रीनहाउस को क्वेरी करने की आवश्यकता है। मालिकों आदि, और ईविल (उप) अधिपति - जिसे वे कौन कौन हैं, यह भी ज्ञात नहीं है - शिकायत है कि मैं GetDietaryInformation चरण में बहुत सारे प्रश्नों का प्रदर्शन कर रहा हूं।
नोट : मुझे पता है कि कई बिंदुओं से यह बिल्कुल भी समस्या नहीं है (संभावित प्रदर्शन मुद्दों की अनदेखी)। यह सब हो रहा है कि एक विशिष्ट मीट्रिक दुखी है, और उसके लिए औचित्य है।
मुझे लगता है कि मैं क्या कर सकता था
पहले के अलावा, ये सभी विकल्प उल्लेखनीय हैं और, मुझे लगता है, रक्षात्मक।
- मैंने सत्यापित किया है कि मैं डरपोक हो सकता हूं और अपने आधे तरीकों की घोषणा कर सकता हूं
protected
। लेकिन मैं परीक्षण प्रक्रिया में एक कमजोरी का शोषण कर रहा हूं, और पकड़े जाने पर खुद को सही ठहराने के अलावा, मुझे यह पसंद नहीं है। इसके अलावा, यह एक स्टॉपगैप उपाय है। क्या होगा यदि आवश्यक संचालन की संख्या दोगुनी हो जाए? बेखबर, लेकिन फिर क्या? - मैं मनमाने ढंग से इस चरण को AnnealedObjectAlpha, AnnealedObjectBravo और AnnealedObjectCharlie में विभाजित कर सकता हूं, और प्रत्येक चरण में एक तिहाई ऑपरेशन किए जा रहे हैं। मैं इस धारणा के तहत हूं कि यह वास्तव में जटिलता (एन -1 अधिक कक्षाएं) जोड़ता है, जिसमें एक परीक्षण पास करने के अलावा कोई लाभ नहीं है। मैं निश्चित रूप से पकड़ सकता हूं कि CarWithFrontSeatsInstalled और CarWithAllSeatsInstalled तार्किक रूप से क्रमिक चरण हैं। अल्फा द्वारा बाद में आवश्यक ब्रावो पद्धति का जोखिम छोटा है, और अगर मैं इसे अच्छी तरह से खेलता हूं तो भी छोटा होता है। फिर भी।
- मैं एक ही बार में, अलग-अलग ऑपरेशनों को एक समान कर सकता हूं।
performAllSeatsInstallation()
। यह केवल एक स्टॉपगैप उपाय है और यह एकल ऑपरेशन की जटिलता को बढ़ाता है। अगर मुझे कभी भी एक अलग क्रम में ए और बी ऑपरेशन करने की आवश्यकता होती है, और मैंने उन्हें ई = (ए + सी) और एफ (बी + डी) के अंदर पैक किया है, तो मुझे ई और एफ को अनबंड करना होगा और कोड को फेरबदल करना होगा । - मैं मेमने के कार्यों की एक सरणी का उपयोग कर सकता हूं और पूरी तरह से जांच को दरकिनार कर सकता हूं, लेकिन मुझे लगता है कि यह क्लंकी है। हालांकि यह अब तक का सबसे अच्छा विकल्प है। यह प्रतिबिंब से छुटकारा मिलेगा। मेरे पास जो दो समस्याएं हैं, मुझे शायद सभी विधि वस्तुओं को फिर से लिखने के लिए कहा जाएगा , न केवल काल्पनिक
CarWithEngineInstalled
, और जबकि यह बहुत अच्छी नौकरी की सुरक्षा होगी, यह वास्तव में यह सब अपील नहीं करता है; और यह कि कोड कवरेज चेकर के पास लैम्ब्डा (जो हल करने योग्य हैं, लेकिन फिर भी ) के साथ समस्याएँ हैं ।
इसलिए...
- जो, आपको लगता है, मेरा सबसे अच्छा विकल्प है?
- क्या कोई बेहतर तरीका है जिस पर मैंने विचार नहीं किया है? ( शायद मैं बेहतर ढंग से साफ आऊंगा और सीधे पूछूंगा कि यह क्या है? )
- क्या यह डिज़ाइन निराशाजनक रूप से दोषपूर्ण है, और मैं हार और खाई को बेहतर स्वीकार करूँगा - यह वास्तुकला पूरी तरह से? मेरे करियर के लिए अच्छा नहीं है, लेकिन लंबी अवधि में बीमार डिजाइन कोड लिखना बेहतर होगा?
- क्या मेरी वर्तमान पसंद वास्तव में वन ट्रू वे है, और मुझे बेहतर गुणवत्ता वाले मेट्रिक्स (और / या इंस्ट्रूमेंटेशन) स्थापित करने के लिए लड़ने की जरूरत है? इस अंतिम विकल्प के लिए मुझे संदर्भों की आवश्यकता होगी ... मैं बड़बड़ाते समय @PHB पर अपना हाथ नहीं हिला सकता, ये वे मीट्रिक नहीं हैं जिनकी आप तलाश कर रहे हैं । कोई फर्क नहीं पड़ता कि मैं कितना सक्षम होना चाहता हूं