TL; DR: यह इस बात पर निर्भर करता है कि आप क्या हल करना चाहते हैं।
मैंने इस बारे में अपने Gramps के साथ एक समान बातचीत की है, जबकि हम बात कर रहे थे कि कैसे C # में Func और Action कमाल के हैं। मेरा ग्रैम्प एक बहुत पुराना टाइमर प्रोग्रामर है, जो कि पूरे कंप्यूटर पर काम करने वाले कंप्यूटरों पर सॉफ्टवेयर चलाने के बाद से सोर्स कोड के आसपास है।
उन्होंने अपने जीवन में कई बार टेक बदले। उन्होंने C, COBOL, पास्कल, BASIC, फोरट्रान, स्मॉलटाक, जावा में कोड लिखे और आखिरकार C # को एक शौक के रूप में शुरू किया। मैंने आईबीएम की साइडकिक के नीले संपादक पर कोड की मेरी पहली पंक्तियों को उकेरते हुए उसकी गोद में बैठकर उसकी गोद में बैठना सीख लिया। जब मैं 20 साल का था, तब तक मैंने पहले से ही बाहर खेलने से ज्यादा समय कोडिंग में बिताया था।
वे मेरी यादों में से एक हैं, इसलिए मुझे माफ करना अगर मैं उन्हें वापस लेने के दौरान बिल्कुल व्यावहारिक नहीं हूं। मैं उन पलों का कुछ ज्यादा ही शौकीन हूं।
उसने मुझसे यही कहा:
"क्या हमें किसी समस्या के सामान्यीकरण के लिए जाना चाहिए, या इसे विशिष्ट दायरे में हल करना चाहिए, क्या आप पूछते हैं? अच्छा, यह एक प्रश्न है।"
ग्रैम्प्स ने अपने चेहरे पर अपने चश्मे की स्थिति को ठीक करते हुए, एक संक्षिप्त क्षण के बारे में सोचने के लिए एक विराम लिया। वह अपने पुराने साउंड सिस्टम पर डीप पर्पल के एलपी को सुनते हुए अपने कंप्यूटर पर मैच -3 गेम खेल रहा था।
"ठीक है, यह इस बात पर निर्भर करेगा कि आप किस समस्या को हल करने की कोशिश कर रहे हैं", उन्होंने मुझसे कहा। "यह विश्वास करना ललचाता है कि सभी डिजाइन विकल्पों के लिए एक एकल, पवित्र समाधान मौजूद है, लेकिन एक नहीं है। सॉफ्टवेयर आर्किटेक्चर पनीर जैसा है, आप देखते हैं।"
"... पनीर, दादाजी?"
"कोई फर्क नहीं पड़ता कि आप अपने पसंदीदा के बारे में क्या सोचते हैं, हमेशा कोई ऐसा व्यक्ति होगा जो सोचता है कि यह बदबूदार है"।
मैं एक पल के लिए असमंजस में पड़ गया, लेकिन इससे पहले कि मैं कुछ कह पाता ग्रैम्प चल गया।
"जब आप एक कार का निर्माण कर रहे हैं, तो आप एक हिस्से के लिए सामग्री कैसे उठाते हैं?"
"मैं ... मुझे लगता है कि इसमें शामिल लागतों पर निर्भर करता है और क्या करना चाहिए, मुझे लगता है।"
"यह उस समस्या पर निर्भर करता है जो भाग हल करने की कोशिश कर रहा है। आप स्टील से बने टायर, या चमड़े से बने विंडशील्ड नहीं बनाएंगे। आप उस सामग्री को चुनते हैं जो आपके हाथ में लगी समस्या को हल करती है। अब, क्या है एक जेनेरिक सॉल्यूशन? या एक विशिष्ट? किस समस्या के लिए, किस मामले का उपयोग करें? क्या आपको एक पूर्ण कार्यात्मक दृष्टिकोण के साथ जाना चाहिए, एक कोड का अधिकतम लचीलापन देने के लिए जो केवल एक बार उपयोग किया जाएगा? क्या आपको एक बहुत ही विशेष, नाजुक कोड लिखना चाहिए? आपके सिस्टम का एक हिस्सा जो बहुत सारे और बहुत सारे उपयोगों और संभवतः बहुत सारे परिवर्तनों को देखेगा; डिजाइन विकल्प उन सामग्रियों की तरह हैं जिन्हें आप कार में भाग के लिए चुनते हैं या लेगो ईंट का आकार जिसे आप एक छोटा घर बनाने के लिए चुनते हैं। क्या लेगो ईंट सबसे अच्छा है? "
बुजुर्ग प्रोग्रामर थोड़ा लेगो ट्रेन मॉडल के लिए पहुंचे, जिसे जारी रखने से पहले उनकी मेज पर है।
"आप केवल यह उत्तर दे सकते हैं कि यदि आप जानते हैं कि आपको उस ईंट की आवश्यकता क्या है। तो आप कैसे जानेंगे कि विशिष्ट समाधान जेनेरिक से बेहतर है, या इसके विपरीत, यदि आपको यह भी पता नहीं है कि आपको क्या समस्या है? हल करने की कोशिश कर रहे हैं? आप एक विकल्प नहीं देख सकते हैं जिसे आप नहीं समझते हैं। "
".. क्या आप सिर्फ मैट्रिक्स बोली ? "
"क्या?"
"कुछ नहीं, जाओ।"
"ठीक है, मान लीजिए कि आप नेशनल इनवॉयस सिस्टम में कुछ बनाने की कोशिश कर रहे हैं। आपको पता है कि उस नारकीय एपीआई और उसकी तीस हज़ार लाइनें XML फ़ाइल के अंदर से कैसी दिखती हैं। उस फ़ाइल को बनाने के लिए 'जेनेरिक' समाधान भी कैसा दिखेगा। जैसे? फ़ाइल वैकल्पिक मापदंडों से भरी है, उन मामलों से भरी हुई है जो केवल व्यापार की बहुत विशिष्ट शाखाओं का उपयोग करना चाहिए। अधिकांश मामलों के लिए, आप उन्हें सुरक्षित रूप से अनदेखा कर सकते हैं। यदि आपको केवल एक चीज की आवश्यकता हो तो आपको एक सामान्य चालान प्रणाली बनाने की आवश्यकता नहीं है। कभी जूते बेचते हैं, बस जूते बेचने के लिए एक सिस्टम बनाते हैं और बनाते हैं कि यह सबसे अच्छी तरह से बिकने वाला जूता बेचने वाला इनवॉइस सिस्टम है। अब, यदि आपको किसी भी प्रकार के क्लाइंट के लिए एक अधिक व्यापक एप्लिकेशन पर इनवॉइस सिस्टम बनाना है - एक स्वतंत्र, सामान्य बिक्री प्रणाली के रूप में फिर से बेचना,उदाहरण के लिए - अब उन विकल्पों को लागू करना दिलचस्प है जो केवल गैस, भोजन या शराब के लिए उपयोग किए जाते हैं।अब उन मामलों का उपयोग संभव है। इससे पहले कि वे बस कुछ काल्पनिक थे का उपयोग न करें मामलों, और आप को लागू नहीं करना चाहते का उपयोग न करें मामलों। उपयोग न करें छोटे भाई की जरूरत नहीं है । "
ग्रैम्प्स ने लेगो ट्रेन को उसके स्थान पर वापस रख दिया और अपने मैच -3 गेम में वापस आ गया।
"तो, किसी दिए गए समस्या के लिए एक सामान्य या एक विशिष्ट समाधान चुनने में सक्षम होने के लिए आपको सबसे पहले यह समझने की आवश्यकता है कि समस्या क्या है। अन्यथा आप केवल अनुमान लगा रहे हैं, और अनुमान लगाना प्रबंधकों का काम है, न कि प्रोग्रामर का। लगभग। आईटी में सब कुछ, यह निर्भर करता है। ”
इसलिए यह अब आपके पास है। "निर्भर करता है"। सॉफ्टवेयर डिजाइन के बारे में सोचते समय शायद यह सबसे शक्तिशाली दो-शब्द की अभिव्यक्ति है।