ठोस बनाम समयपूर्व परहेज


27

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

  • मैं समय से पहले अमूर्तता से बचना चाहता हूं। मेरे अनुभव में ठोस उपयोग के मामलों के बिना अमूर्त रेखाएं खींचना (जिस तरह का अब या निकट भविष्य में मौजूद है ) उन्हें गलत स्थानों पर खींचता है । जब मैं इस तरह के कोड को संशोधित करने की कोशिश करता हूं, तो एब्सट्रैक्शन लाइनें मदद करने के बजाय रास्ते में आती हैं। इसलिए, मैं किसी भी एब्सट्रैक्शन लाइनों को नहीं खींचने के पक्ष में गलत करना चाहता हूं जब तक कि मुझे यह पता नहीं है कि वे कहां उपयोगी होंगे।

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

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

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


10
@ S.Lott: कुंजी शब्द "अधिक" है। यह ठीक उसी तरह की चीज है जिस तरह से YAGNI का आविष्कार किया गया था। अपनी खुद की खातिर बढ़ती प्रतिरूपकता या घटते युग्मन सिर्फ कार्गो-पंथ प्रोग्रामिंग है।
मेसन व्हीलर

3
@ S.Lott: यह संदर्भ से स्पष्ट होना चाहिए। जैसा कि मैंने इसे पढ़ा, कम से कम, "वर्तमान में प्रश्न से अधिक कोड में मौजूद है।"
मेसन व्हीलर

3
@ एस.लॉट: यदि आप पांडित्य होने पर जोर देते हैं, तो "अधिक" वर्तमान में मौजूद से अधिक है। निहितार्थ यह है कि कुछ, चाहे कोड हो या खुरदरा डिज़ाइन, पहले से मौजूद है और आप सोच रहे हैं कि इसे कैसे रिफैक्ट किया जाए।
dsimcha

5
@ back2dos: ठीक है, लेकिन मुझे इस बात की स्पष्ट जानकारी के बिना कि वह कैसे विस्तारित होने की संभावना है, इसकी व्यापकता के लिए इंजीनियरिंग के बारे में संदेह है। इस जानकारी के बिना, आपकी अमूर्त रेखाएं संभवतः सभी गलत स्थानों पर समाप्त हो जाएंगी। यदि आप नहीं जानते हैं कि जहां अमूर्त रेखाएं उपयोगी होंगी, मैं सुझाव दे रहा हूं कि आपको बस सबसे संक्षिप्त कोड लिखना चाहिए जो काम करता है और पठनीय है, भले ही आपके पास कुछ ईश्वर की वस्तुएं हों।
dsimcha

2
@dsimcha: यदि आप कोड के एक टुकड़े को लिखने के बाद आवश्यकताओं को बदलते हैं, तो आप भाग्यशाली हैं , क्योंकि आमतौर पर जब आप ऐसा करते हैं तो वे बदल जाते हैं । यही कारण है कि स्नैपशॉट-कार्यान्वयन वास्तविक सॉफ़्टवेयर जीवन चक्र से बचने के लिए उपयुक्त नहीं हैं। इसके अलावा, SOLID आपको केवल अमूर्त रूप से आँख बंद करने की मांग नहीं करता है। एक अमूर्त के लिए संदर्भ निर्भरता उलटा के माध्यम से परिभाषित किया गया है। आप प्रत्येक मॉड्यूल की निर्भरता को कम करते हैं जो अन्य सेवाओं के सबसे सरल और स्पष्ट अमूर्तकरण पर निर्भर करता है। यह मनमाना, कृत्रिम या जटिल नहीं है, बल्कि अच्छी तरह से परिभाषित, प्रशंसनीय और सरल है।
बैक

जवाबों:


8

निम्नलिखित सरल सिद्धांत हैं जिन्हें आप अपने सिस्टम डिज़ाइन को संतुलित करने में समझने में मदद करने के लिए आवेदन कर सकते हैं:

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

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


3
अच्छी टिप्पणी है। जैसा कि अन्य उत्तरों में चर्चा की गई है, "एकल जिम्मेदारी" के साथ एक समस्या यह है कि एक वर्ग की जिम्मेदारी को विभिन्न प्रकार के अमूर्त स्तरों पर वर्णित किया जा सकता है।
dsimcha

5

मुझे लगता है कि अधिकांश भाग के लिए आपने अपने प्रश्न का उत्तर दिया है। SOLID आपके कोड को कैसे रिफलेक्टर करता है, इस पर दिशानिर्देशों का एक सेट है, जब अवधारणाओं को अमूर्त स्तरों को ऊपर ले जाने की आवश्यकता होती है।

अन्य सभी रचनात्मक विषयों की तरह कोई निरपेक्षता नहीं है - सिर्फ व्यापार। जितना अधिक आप इसे करते हैं "आसान" यह तय करना हो जाता है कि आपके वर्तमान समस्या डोमेन या आवश्यकताओं के लिए पर्याप्त है।

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


5
I want to avoid premature abstraction.In my experience drawing abstraction lines without concrete use cases... 

यह आंशिक रूप से सही है और आंशिक रूप से गलत है।

गलत
यह OO सिद्धांतों / SOLID को लागू करने से रोकने का कारण नहीं है। यह केवल उन्हें बहुत जल्दी लागू करने से रोकता है

जो है...

सही
क्या नहीं refactor कोड जब तक यह refactorable है; जब यह आवश्यकताओं को पूरा हो गया है। या, जब "उपयोग के मामले" आप कहते हैं कि सब वहाँ हैं।

I find simple, tightly coupled procedural or God object code is sometimes easier to understand than very well-factored...

अकेले या साइलो में काम करते समय
OO न करने की समस्या तुरंत स्पष्ट नहीं होती है। आपके द्वारा किसी प्रोग्राम का पहला संस्करण लिखने के बाद:

Code is fresh in your head
Code is familiar
Code is easy to mentally compartmentalize
You wrote it

इन अच्छी चीजों में से 3/4 कम समय में जल्दी मर जाती हैं।

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

एक टीम में
OO न करने की समस्याएं तुरंत ध्यान देने योग्य हैं। अच्छा OO कोड कम से कम कुछ स्व-दस्तावेजीकरण और पठनीय है। खासकर जब अच्छे हरे कोड के साथ संयुक्त। इसके अलावा, संरचना की कमी से कार्यों को अलग करना और बहुत अधिक जटिल एकीकरण करना मुश्किल हो जाता है।


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

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

ठीक से लागू होने पर अमूर्त रखरखाव को कम कर सकता है। अनुचित तरीके से लागू यह रखरखाव को बढ़ा सकता है। यह जानना कि कब और कहाँ रेखाएँ खींचनी हैं, इसके लिए व्यवसाय, रूपरेखा, ग्राहक की एक ठोस समझ की आवश्यकता होती है, बस इसके मूल रूप से "फ़ैक्टरी पैटर्न लागू करने" के बुनियादी तकनीकी पहलुओं के अलावा।
पी। ब्रायन। मैके

3

बड़ी वस्तुओं के साथ कुछ भी गलत नहीं है और जब उचित हो तब बेहतर कोडित कोड की आवश्यकता होती हैहठधर्मिता में अंगूठे के नियम का यह सिर्फ एक और अभिव्यक्ति है

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


1
+1। अभी भी "उचित" का एक अच्छा परिभाषा की जरूरत है।
jprete

2
@jprete: क्यों? निरपेक्ष परिभाषाओं को लागू करने की कोशिश इस तरह की वैचारिक गंदगी का कारण है। अच्छे सॉफ्टवेयर के निर्माण में बहुत सारे शिल्प कौशल शामिल हैं। क्या वास्तव में जरूरत है IMO अनुभव और अच्छा निर्णय है।
मेसन व्हीलर 18

4
ठीक है, हाँ, लेकिन कुछ प्रकार की एक व्यापक परिभाषा अभी भी उपयोगी है।
jprete

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

1
मैं आँख बंद करके स्पेगेटी कोड लिखने के बजाय किसी को अंधाधुंध कोड लिखना पसंद करता हूं :)
बोरिस याकोव

2

मैं तुम्हें इस दृष्टिकोण से जरूरत से ज्यादा नहीं है। यह पोस्ट विशेष रूप से एक आइटम पर ध्यान केंद्रित करेगी: विरासत।

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

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


1

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

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

हालांकि इससे भी महत्वपूर्ण बात यह है कि अधिकांश डेवलपर्स दिन का काम कर रहे हैं और आपकी उतनी परवाह नहीं करते हैं। यदि आप शुरू में लंबे समय तक चलने वाले तरीकों को निर्धारित करते हैं, तो अन्य डेवलपर्स कौन से कोड में आते हैं, यह सोचने के लिए कोड में आते हैं कि वे इसे बनाए रखने या इसे बढ़ाने के लिए आते हैं? ... हाँ, आपने अनुमान लगाया, बड़ा काम करता है, लंबे समय तक चलने वाली कक्षाएं, और अधिक। देव वस्तुओं, और उनके पास बढ़ते सिद्धांतों को पकड़ने और इसे सही ढंग से संलग्न करने में सक्षम होने के लिए सिद्धांत नहीं हैं। आप "पठनीय" कोड अब एक सड़ने वाली गंदगी बन गए हैं।

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

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

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


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

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

1

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

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


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

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

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

1

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

इसके अलावा, आपको SOLID को ध्यान में रखना चाहिए, लेकिन एक नियम की तुलना में अधिक दिशानिर्देश के रूप में।


0

क्या, अगर कुछ भी, भगवान की वस्तुओं के साथ गलत है और कसकर युग्मित कोड अगर आपको स्पष्ट रूप से अधिक प्रतिरूपकता की आवश्यकता नहीं है, तो महत्वपूर्ण दोहराव नहीं है और कोड पठनीय है?

यदि आवेदन काफी छोटा है, तो कुछ भी बनाए रखने योग्य है। बड़े अनुप्रयोगों में, भगवान की वस्तुएँ जल्दी से एक समस्या बन जाती हैं। अंततः एक नई सुविधा को लागू करने के लिए 17 देव वस्तुओं को संशोधित करने की आवश्यकता होती है। लोग 17-चरणीय प्रक्रियाओं का पालन बहुत अच्छी तरह से नहीं करते हैं। भगवान की वस्तुओं को लगातार कई डेवलपर्स द्वारा संशोधित किया जा रहा है, और उन परिवर्तनों को बार-बार विलय करना होगा। आप वहां नहीं जाना चाहते हैं।


0

मैं अत्यधिक और अनुचित अमूर्तता के बारे में आपकी चिंताओं को साझा करता हूं, लेकिन मैं समय से पहले अमूर्तता के बारे में इतना चिंतित नहीं हूं।

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

इसका तात्पर्य यह है कि कोड में कुछ हद तक प्रोटोटाइप, प्रयोग और बैकट्रैकिंग है।

उस ने कहा, सभी समस्याओं का समाधान करने के लिए कोई सरल निर्धारक नियम नहीं है। अनुभव बहुत मायने रखता है, लेकिन आपको गलतियाँ करके उस अनुभव को हासिल करना होगा। और हमेशा ऐसी गलतियाँ होती हैं जिन्हें पिछली गलतियों ने आपके लिए तैयार नहीं किया होगा।

फिर भी, पाठ्यपुस्तक के सिद्धांतों को एक शुरुआती बिंदु मानें, फिर बहुत सारी प्रोग्रामिंग सीखें और देखें कि वे सिद्धांत कैसे काम करते हैं। अगर SOLID जैसी चीजों की तुलना में बेहतर, अधिक सटीक और विश्वसनीय दिशानिर्देश देना संभव था, तो किसी ने शायद अब किया होगा - और यहां तक ​​कि अगर उनके पास था, तो उन बेहतर सिद्धांत अभी भी अपूर्ण होंगे, और लोग उन सीमाओं के बारे में पूछ रहे होंगे ।

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


0

उपयुक्त अमूर्त रेखाओं को खींचना एक ऐसी चीज है जो अनुभव से खींची जाती है। आप ऐसा करने में गलतियाँ करेंगे, जो निर्विवाद है।

SOLID उस अनुभव का एक केंद्रित रूप है जो आपको उन लोगों द्वारा सौंपा जाता है जिन्होंने इस अनुभव को कठिन तरीके से प्राप्त किया। जब आप कहते हैं कि इससे पहले कि आप इसके लिए एक आवश्यकता को देखते हैं, तो आप इसे बहुत ज्यादा नस्ट कर देते हैं। वैसे SOLID प्रदान करने वाला अनुभव आपको उन समस्याओं को हल करने में मदद करेगा जो आप कभी भी नए अस्तित्व में नहीं थे । लेकिन मेरा विश्वास करो ... बहुत वास्तविक हैं।

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

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

फुर्तीले होने के नाते शिपिंग तेजी के बीच नाजुक संतुलन बनाने और अच्छी गुणवत्ता प्रदान करने का प्रयास करना है। एजाइल का मतलब यह नहीं है कि हमें कोने में कटौती करनी चाहिए, वास्तव में, सबसे सफल फुर्तीली परियोजनाएं, जिनके साथ मैं शामिल हूं, ऐसे दिशानिर्देशों पर ध्यान दिया गया है।


0

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


1
कृपया अपने उत्तर पर विस्तार करने पर विचार करें। जैसा कि यह खड़ा है, आप दो ऑर्थोगोनल अवधारणाओं को एक साथ ला रहे हैं और यह स्पष्ट नहीं है कि परिणाम ओपी की चिंताओं को कैसे संबोधित करता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.