DanLevy.net

सावधान रहें: सिंगल-पर्पस लोगों से

इतना शुद्ध कि दर्द हो

Single Responsibility Principle उन विचारों में से एक है जो इतना समझदार लगता है कि यह आपके विवेक को चकमा दे सकता है।

एक काम करो। उसे अच्छे से करो। मॉड्यूल को फोकस्ड रखो। कोड को बदलने का एक कारण दो। अच्छी सलाह।

फिर कोई उस सलाह को मापने का टेप बना देता है और यह घोषित करने लगता है कि पाँच लाइन से बड़ा कोई भी फंक्शन एक कोड स्मेल है।

समस्या SRP नहीं है। समस्या “छोटा” को “cohesive” का विकल्प मानना है।

उस बिंदु पर आप सिंगल-पर्पस लोगों से मिल चुके हैं: डेवलपर्स जो मॉड्युलरिटी के बारे में बिल्कुल गलत नहीं हैं, लेकिन उपयोगी बाउंड्रीज को अधिकतम विखंडन के साथ भ्रमित कर चुके हैं।

सॉफ्टवेयर आर्किटेक्चर में हिंसा
कंपोनेंट्स, कंपोनेंट्स हर जगह

I. इसके नीचे का उपयोगी विचार

फॉर्म में एक सिंगल चेकबॉक्स जोड़ने से आदर्श रूप से केवल एक फाइल प्रभावित होनी चाहिए। 5 डायरेक्टरीज में 8 फाइलें नहीं… मैं तुम्हारी ही बात कर रहा हूँ, React/Redux।

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

यहाँ तक कि क्लासिक Unix उदाहरण भी नारे से ज़्यादा व्यावहारिक हैं। ls फाइलों को सूचीबद्ध करता है, हाँ, लेकिन यह opendir, readdir, closedir, और stat जैसे कॉल्स को भी कोऑर्डिनेट करता है। उपयोगी यूनिट सबसे छोटी संभव ऑपरेशन नहीं है। उपयोगी यूनिट वह सबसे छोटी सुसंगत चीज़ है जो कार्य को हल करती है।

मूल Unix दर्शन कंपोजिशन और सरलता के बारे में था, सब कुछ को एक सिंगल फंक्शन या फाइल में कम करने के बारे में नहीं।

यह अंतर मायने रखता है। “एक जिम्मेदारी” का मतलब “व्यवहार की एक लाइन” नहीं है।

II. ओवर-अब्सट्रैक्शन: जब सरलता अराजकता में बदल जाती है

हमारे आर्किटेक्ट का ज़िद है कि 5 लाइन से लंबा हर फंक्शन एक ‘कोड स्मेल’ है। हमारा कोडबेस अब बेवकूफीपूर्ण निराशा की हल्की गंध देता है।

फेलियर मोड को आसानी से देखा जा सकता है, भले ही इसने आपका हफ्ता पहले से ही खराब कर दिया हो।

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

इस अनंत कार्य पैटर्न से कोई बचाव नहीं
कंपोनेंट्स, कंपोनेंट्स हर जगह

उस सारी पवित्रता ने क्या खरीदा?

मैंने ऐसे कोडबेस के abyss में देखा है जहाँ एक सीधी 100-लाइन फीचर को 15+ फाइलों में विविसected किया गया था, प्रत्येक एक “शुद्ध” छोटा परी जिसमें शायद एक या दो फंक्शन थे। उस गंदगी को अपने सिर में रखने की कोशिश करने का कॉग्निटिव ब्लास्ट रेडियस अलगाव से किसी भी सैद्धांतिक लाभ को पूरी तरह से नकार देता है। यह सरल नहीं था; यह बस बिखरा हुआ था।

III. पूर्णता की कीमत: डेवलपर्स पर प्रभाव

हम फीचर्स शिप करने की तुलना में फाइल स्ट्रक्चर और नेमिंग कन्वेंशन पर बहस करने में ज़्यादा समय बिताते हैं। क्या यह Agile है?

इतना गंदा कि यह कला की सीमा पर है
इतना गंदा कि यह कला की सीमा पर है

यह पैथोलॉजिकल विखंडन केवल एक सौंदर्य समस्या नहीं है। यह बदल देता है कि डेवलपर्स अपना ध्यान कैसे खर्च करते हैं:

प्रोडक्टिविटी ड्रेन: टेक्निकल डेट को भूल जाइए; यह ऑब्सेसिव-कंपल्सिव डायरेक्टरी नेस्टिंग के माध्यम से अर्जित ऑर्गनाइज़ेशनल डेट है। हर मामूली बदलाव लेयर्स ऑफ़ अब्सट्रैक्शन के माध्यम से एक पुरातात्विक खुदाई बन जाता है। समय cd .. और grep के ब्लैक होल में गायब हो जाता है।

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

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

IV. व्यावहारिकता को अपनाना: एक व्यावहारिक विकल्प

मैंने सुझाव दिया कि हम दो संबंधित फंक्शन्स को एक ही फाइल में रखें। कमरे ने प्रतिक्रिया व्यक्त की जैसे मैंने स्टेजिंग डिलीट करने का प्रस्ताव रखा हो। — एक रिकवरिंग प्यूरिस्ट पाठक

एस्केप हैच SRP को छोड़ना नहीं है। जवाब इसे अर्थ के सही स्तर पर लागू करना है।

व्यवहार में ऐसा दिखता है:

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

कभी-कभी इसका मतलब है कि एक फाइल 50 लाइन की बजाय 200 लाइन लंबी है। कभी-कभी एक फंक्शन डेटा फेच करना और इसे थोड़ा ट्रांसफॉर्म करना हैंडल करता है। कभी-कभी एक क्लास की दो जिम्मेदारियाँ होती हैं जो इतनी कसकर जुड़ी होती हैं कि उन्हें एक साथ रहना चाहिए। यदि यह सिस्टम को समग्र रूप से काम करना आसान बनाता है, तो यह शायद सही कॉल है।

व्यावहारिक प्रश्नों पर निर्दयता से केंद्रित रहें:

V. निष्कर्ष: कोहेसिव और मेंटेनेबल कोड को बढ़ावा देना

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

इसलिए जब आप सिंगल-पर्पस लोगों का सामना करें, जो तीन लाइन से ज़्यादा किसी भी फंक्शन पर युद्ध छेड़ने के लिए तैयार हैं, तो एक गहरी साँस लें। 12-फाइल चेकबॉक्स को याद करें।

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

व्यावहारिक रहें। परिणामों पर ध्यान केंद्रित करें। शुद्धता की खोज को मेंटेनेबल कोड का दुश्मन न बनने दें। आपकी मानसिक शांति, और आपकी टीम की वेलोसिटी, इस पर निर्भर करती है।

¹ विडंबना यह है कि सबसे निचले स्तर पर वास्तविक सिंगल परपस प्राप्त करने के लिए immense कॉम्प्लेक्सिटी की ज़रूरत होती है जो सतह के ठीक नीचे छिपी होती है।

² हम यहाँ अवधारणात्मक शुद्धता की बात कर रहे हैं: यह विचार कि एक फंक्शन को तार्किक रूप से केवल “एक काम” करना चाहिए। इसे “प्योर फंक्शन” की फंक्शनल प्रोग्रामिंग अवधारणा के साथ भ्रमित न करें जिसका कोई साइड इफेक्ट नहीं होता, जो एक अलग, हालाँकि कभी-कभी संबंधित, विचार है।