क्या SOLID के बाद टेक स्टैक के शीर्ष पर एक फ्रेमवर्क लिखने का नेतृत्व होता है?


70

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

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

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

यह कुछ ऐसा है जो जावा एंटरप्राइज की दुनिया में आम लगता है, जहां ऐसा लगता है जैसे आप J2EE या स्प्रिंग के शीर्ष पर अपनी रूपरेखा तैयार कर रहे हैं ताकि यह उपयोगकर्ता के लिए UX पर ध्यान केंद्रित करने के बजाय डेवलपर के लिए एक बेहतर UX हो?


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

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

1
@MartinMaat मुझे लगता है कि SOLID के अधिक चरम रूप बड़े निवेश करते हैं। अर्थात। उपक्रम सॉफ्टवेयर। एंटरप्राइज़ सॉफ़्टवेयर के बाहर, आपके पास अपने ORM, तकनीक स्टैक, या डेटाबेस को अमूर्त करने का बहुत कम कारण होगा क्योंकि एक बहुत अच्छा मौका है जिसे आप अपने चुने हुए स्टैक के साथ छड़ी करने जा रहे हैं। उसी अर्थ में, अपने आप को एक विशेष ढांचे, डेटाबेस, या ओआरएम से बांधकर, आप एसओएलआईडी सिद्धांतों को तोड़ रहे हैं क्योंकि आप अपने स्टैक के लिए युग्मित हैं। अधिकांश नौकरियों में SOLID के लचीलेपन के स्तर की आवश्यकता नहीं होती है।
Igneous01


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

जवाबों:


84

आपका अवलोकन सही है, ठोस सिद्धांत IMHO हैं जिन्हें पुन: प्रयोज्य पुस्तकालयों या फ्रेमवर्क कोड को ध्यान में रखते हुए बनाया गया है। जब आप बस उन सभी का आँख बंद करके पालन करते हैं, तो यह पूछे बिना कि क्या यह समझ में आता है या नहीं, आप जरूरत से ज्यादा अपने सिस्टम में बहुत अधिक प्रयास करने और निवेश करने के लिए जोखिम उठा रहे हैं।

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

लचीलापन प्रदान करें अन्य डेवलपर्स की आवश्यकता हो सकती है

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

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

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

यह वास्तव में पुराना ज्ञान है। बहुत समय पहले SOLID लोकप्रिय हो गया था, किसी ने मुझे बताया कि इससे पहले कि हम पुन: प्रयोज्य कोड लिखने की कोशिश करें , हमें प्रयोग करने योग्य कोड लिखना चाहिए । और मुझे अभी भी लगता है कि यह एक अच्छी सिफारिश है।


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

8
मैं आमतौर पर इससे सहमत हूं, लेकिन ऐसा महसूस करता हूं कि यह "वन-ऑफ" ऐप पर बहुत अधिक केंद्रित है: आप कोड लिखते हैं, यह ठीक काम करता है। हालांकि, "लंबे समय से समर्थन" के साथ बहुत सारे ऐप हैं। आप कुछ कोड लिख सकते हैं और 2 साल बाद, व्यावसायिक आवश्यकताएं बदल जाती हैं ताकि आपको कोड समायोजित करना पड़े। उस समय तक, बहुत सारे अन्य कोड इस पर निर्भर हो सकते हैं - उस स्थिति में, SOLID सिद्धांत परिवर्तन को आसान बना देंगे।
आर। शमित्ज़

3
"पुन: प्रयोज्य कोड लिखने का प्रयास करने से पहले, हमें प्रयोग करने योग्य कोड लिखना चाहिए" - बहुत बुद्धिमान!
ग्राहम

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

2
आम तौर पर आपको अभी भी परीक्षण योग्य कोड लिखने की आवश्यकता होगी, जिसका अर्थ है कि अमल करने के लिए ठोस कार्यान्वयन से स्विच करने में सक्षम होने के लिए अमूर्त की पहली परत होना चाहिए।
वॉलफ्रैट

49

मेरे अनुभव से, ऐप लिखते समय, आपके पास तीन विकल्प हैं:

  1. आवश्यकताओं को पूरा करने के लिए पूरी तरह से कोड लिखें,
  2. जेनेरिक कोड लिखें जो भविष्य की आवश्यकताओं की आशा करता है, साथ ही साथ वर्तमान आवश्यकताओं को पूरा करता है,
  3. कोड लिखें जो केवल वर्तमान आवश्यकताओं को पूरा करता है, लेकिन एक तरह से जो बाद में अन्य आवश्यकताओं को पूरा करने के लिए बदलना आसान है।

पहले मामले में, यूनिट परीक्षणों की कमी वाले कसकर युग्मित कोड के साथ समाप्त होना आम है। यकीन है कि यह लिखना जल्दी है, लेकिन यह परीक्षण करना कठिन है। और बाद में आवश्यकताओं को बदलने पर यह सही शाही दर्द है।

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

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

SOLID का एकमात्र पहलू जो वास्तव में यहां लागू नहीं होता है, वह खुला / बंद सिद्धांत है। पुस्तकालयों और रूपरेखा के लिए, यह महत्वपूर्ण है। एक आत्म निहित ऐप के लिए, इतना नहीं। वास्तव में यह कोड लिखने का मामला है जो " SLID " का अनुसरण करता है : लिखने में आसान (और पढ़ना), परीक्षण करना आसान और बनाए रखने में आसान।


इस साइट पर मेरे पसंदीदा उत्तरों में से एक!
TheCatWhisperer

मुझे यकीन नहीं है कि आप कैसे निष्कर्ष निकालते हैं कि 1) 3 की तुलना में परीक्षण करना अधिक कठिन है)। परिवर्तन करने के लिए और अधिक कठिन, निश्चित, लेकिन आप परीक्षण क्यों नहीं कर सकते? यदि कुछ भी हो, तो सॉफ़्टवेयर का एक-दिमाग वाला टुकड़ा एक अधिक सामान्य से आवश्यकताओं के खिलाफ परीक्षण करना आसान होता है।
श्री लिस्टर

@MrLister दो गो हाथ में हाथ, 1. परीक्षण करने के लिए 3 से अधिक कठिन है। क्योंकि इसका मतलब है कि यह लिखा नहीं है "एक तरह से जो अन्य आवश्यकताओं को पूरा करने के लिए बाद में बदलना आसान है।"
मार्क बूथ

1
+0; IMVHO आप गलत तरीके से (यद्यपि एक तरह से) 'O' (ओपन-क्लोज्ड) काम करता है। उदाहरण के लिए देखें codeblog.jonskeet.uk/2013/03/15/… - यहां तक ​​कि छोटे कोडबेस में, यह कोड की स्व-निहित इकाइयां होने के बारे में अधिक है (उदाहरण वर्ग, मॉड्यूल, पैकेज, जो भी हो), जिसे अलगाव में जोड़ा जा सकता है और जोड़ा जा सकता है / जरूरत पड़ने पर हटा दिया जाता है। इस तरह का एक उदाहरण उपयोगिता के तरीकों का एक पैकेट होगा - भले ही जिस तरह से आप उन्हें बंडल करते हैं, उन्हें 'बंद' किया जाना चाहिए, अर्थात आत्म-निहित होना चाहिए, और 'खुला' होना चाहिए, अर्थात किसी तरह से बढ़ाना होगा।
vaxquis

BTW, यहां तक ​​कि अंकल बॉब एक ​​बिंदु पर इस तरह से जाते हैं: "क्या [खुले-बंद] का मतलब है कि आपको अपना कोड इस तरह की स्थिति में लाने का प्रयास करना चाहिए, जब व्यवहार अपेक्षित तरीकों से बदलता है, तो आपको स्वीपिंग करने की आवश्यकता नहीं है। सिस्टम के सभी मॉड्यूल में परिवर्तन। आदर्श रूप से, आप नए कोड को जोड़कर और थोड़ा या कोई पुराना कोड बदलकर नया व्यवहार करने में सक्षम होंगे। " <- यह स्पष्ट रूप से छोटे अनुप्रयोगों पर भी लागू होता है, यदि उनका इरादा कभी भी संशोधित या तय किया गया हो (और, IMVHO, कि आम तौर पर मामला है, खास तौर पर जब फिक्स के विषय में। व्यंग्य )
vaxquis

8

आपके द्वारा दिए गए परिप्रेक्ष्य को व्यक्तिगत अनुभव द्वारा तिरछा किया जा सकता है। यह उन तथ्यों का एक ढलान ढलान है जो व्यक्तिगत रूप से सही हैं, लेकिन परिणामी अनुमान ऐसा नहीं है, भले ही यह पहली नज़र में सही लगे।

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

इसका मतलब है कि जब आप चौखटे और छोटे पुस्तकालयों के साथ बातचीत करते हैं, तो आप जिस अच्छे अभ्यास कोड के साथ बातचीत करेंगे, वह आमतौर पर बड़े ढाँचों में मिलेगा।

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

आपके मामले में, यह संभव है कि आपने मुख्य रूप से बड़े ढांचे में अच्छा अभ्यास किया हो और छोटे पुस्तकालयों में नहीं। आपका व्यक्तिगत अवलोकन गलत नहीं है, लेकिन यह वास्तविक सबूत है और सार्वभौमिक रूप से लागू नहीं है।


प्रोग्रामिंग के 2 मोड - बनाने और अधिक या कम वास्तव में क्या आवश्यकताओं और KISS (विशिष्ट प्रोग्रामिंग), या बहुत सामान्य और पुन: प्रयोज्य तर्क बनाने, सेवाओं, आदि कि लचीलापन अन्य डेवलपर्स आवश्यकता हो सकती है प्रदान के माध्यम से पूछा जाता है (ढांचा प्रोग्रामिंग)

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

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

हालांकि, एप्लिकेशन बिल्डरों में तार्किक दक्षता पर समझौता करने की क्षमता होती है क्योंकि वे किसी उत्पाद को वितरित करने पर केंद्रित होते हैं। उनका मुख्य लक्ष्य कोड का कामकाज नहीं है, बल्कि उपयोगकर्ता का अनुभव है।

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

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


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

यह एक दिलचस्प बिंदु है, और यह (मेरे अनुभव में) मुख्य कारण है कि लोग अभी भी अच्छे अभ्यास से बचने का औचित्य बनाने की कोशिश करते हैं।

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

मान लीजिए कि आप 4 सप्ताह में शॉडिली को एक एप्लिकेशन बना सकते हैं, और आप इसे 6 सप्ताह में ठीक से बना सकते हैं। पहली नजर में, शॉडिली बिल्डिंग बेहतर लगती है। ग्राहक को अपना आवेदन जल्दी मिलता है, और कंपनी को डेवलपर मजदूरी पर कम समय बिताना पड़ता है। जीत / जीत, सही?

हालाँकि, यह बिना सोचे समझे लिया गया निर्णय है। कोडबेस की गुणवत्ता के कारण, निर्मित शोडिली में एक बड़ा बदलाव करने में 2 सप्ताह लगेंगे, जबकि ठीक से निर्मित एक ही परिवर्तन में 1 सप्ताह का समय लगता है। भविष्य में इनमें से कई बदलाव आ सकते हैं।

इसके अलावा, अप्रत्याशित रूप से निर्मित कार्य की तुलना में अधिक कार्य के लिए अप्रत्याशित रूप से बदलाव की आवश्यकता होती है, इस तरह से दो कोड के बजाय अपने विकास के समय को तीन सप्ताह तक बढ़ाने की संभावना है।

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

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

शॉर्टकट फैसले (त्वरित और गंदे प्रोग्रामिंग) केवल तभी फायदेमंद होते हैं जब आप निर्णायक गारंटी दे सकते हैं कि आवश्यकताएं बिल्कुल सही हैं और कभी भी बदलने की आवश्यकता नहीं होगी। मेरे अनुभव में, मैं कभी ऐसी परियोजना में नहीं आया जहाँ यह सच है।

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


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

आप ओपी के अनुभव को "गिरावट" के रूप में नकार रहे हैं। रचनात्मक नहीं।
अधिकतम ६३०

@ max630 मैं इससे इनकार नहीं कर रहा हूं। मैंने उत्तर का एक अच्छा हिस्सा यह बताते हुए बिताया कि ओपी की टिप्पणियां क्यों मान्य हैं।
फ्लेटर

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

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

7

SOLID कैसे सरल कोड को फ्रेमवर्क कोड में बदल देता है? मैं किसी भी तरह से SOLID के लिए एक स्टेन नहीं हूं, लेकिन यह वास्तव में स्पष्ट नहीं है कि आपका यहां क्या मतलब है।

  • KISS का सार है एस चिमनी जिम्मेदारी सिद्धांत।
  • पेन / बंद सिद्धांत में कुछ भी नहीं है (कम से कम जैसा कि मैं इसे समझता हूं - जॉन स्कीट देखें ) जो एक चीज को अच्छी तरह से करने के लिए कोड लिखने के खिलाफ जाता है। (वास्तव में कोड जितना अधिक कसकर केंद्रित होता है, उतना ही महत्वपूर्ण "बंद" भाग बन जाता है।)
  • एल iskov प्रतिस्थापन सिद्धांत नहीं कहते हैं कि तुम लोग अपनी कक्षाओं उपवर्ग जाने के लिए है। यह कहता है कि यदि आप अपनी कक्षाओं को उपवर्ग करते हैं, तो आपके उपवर्गों को अपने सुपरक्लास के अनुबंध को पूरा करना चाहिए। यह सिर्फ अच्छा OO डिजाइन है। (और यदि आपके पास कोई उपवर्ग नहीं है, तो यह लागू नहीं होता है।)
  • KISS भी का सार है मैं nterface पृथक्करण सिद्धांत।
  • डी ependency उलट सिद्धांत केवल एक ही मैं दूर से लागू करने के देख सकते हैं, लेकिन मुझे लगता है कि यह व्यापक रूप से गलत समझा और हद से ज़्यादा है। इसका मतलब यह नहीं है कि आपको सब कुछ गुईस या स्प्रिंग के साथ इंजेक्ट करना होगा। इसका सिर्फ यह मतलब है कि आपको अमूर्त होना चाहिए जहां उपयुक्त हो और कार्यान्वयन विवरण पर निर्भर न हो।

मैं मानता हूं कि मैं अपने आप को SOLID के संदर्भ में नहीं समझता, क्योंकि मैं बॉब मार्टिन स्कूल नहीं, बल्कि गैंग ऑफ फोर और प्रोग्रामिंग के जोश बलोच स्कूलों के माध्यम से आया था । लेकिन मुझे सच में लगता है कि अगर आपको लगता है कि "SOLID" = "टेक स्टैक में और परतें जोड़ना", तो आप इसे गलत पढ़ रहे हैं।


PS "डेवलपर के लिए बेहतर UX" के लाभों को कम मत बेचिए। जीवन का अधिकांश भाग रखरखाव में व्यतीत करता है। एक डेवलपर आप हैं


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

3
1) कोई भी हो सकता है, लेकिन मुझे संदेह है कि किसी को भी सुनने के लायक है। 2) आप आश्चर्यचकित हो सकते हैं कि कितनी जल्दी एक परियोजना आकार में बढ़ सकती है कि स्वतंत्र रूप से आंतरिक इंटरफेस को संशोधित करना एक बुरा विचार बन जाता है। 3) 1) और 2 दोनों देखें)। यह कहने के लिए कि मुझे लगता है कि आप तीनों सिद्धांतों में बहुत अधिक पढ़ रहे हैं। लेकिन टिप्पणियाँ वास्तव में इन तर्कों को संबोधित करने का स्थान नहीं हैं; मेरा सुझाव है कि आप उनमें से प्रत्येक को एक अलग प्रश्न के रूप में देखें और देखें कि आपको किस प्रकार के उत्तर मिलते हैं।
डेविड मोल्स

4
@ Igneous01 उस तर्क का उपयोग करते हुए, आप गेटर्स और सेटर को छोड़ सकते हैं, क्योंकि आप प्रत्येक चर सेटर के लिए एक अलग वर्ग बना सकते हैं और प्रत्येक गेट्टर के लिए एक। IE: class A{ int X; int Y; } class A_setX{ f(A a, int N) { a.X = N; }} class A_getX{ int f(A a) { return X; }} class A_setY ... etc.मुझे लगता है कि आप इसे अपने कारखाने के दावे के साथ बहुत अधिक मेटा पॉइंट से देख रहे हैं। प्रारंभ करना डोमेन समस्या का एक पहलू नहीं है।
हारून

@ ऐरन यह। लोग बुरा तर्क देने के लिए SOLID का उपयोग कर सकते हैं, लेकिन इसका मतलब यह नहीं है कि बुरा काम करना = "निम्नलिखित SOLID"।
डेविड मोल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.