स्काला के लिए री-अविष्कार सिस्टम डिज़ाइन


35

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

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

डिजाइन और विकास खो गया यह मजेदार है और मैं अपने पीछे पूरे आईटी उद्योग को छोड़ने वाला था।

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

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

हम शुद्ध स्काला समाधान कैसे डिजाइन करते हैं?

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

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

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

क्या इस तरह के एक डिजाइन / प्रक्रिया / समाधान मौजूद है , या यह एक आविष्कार करने का समय है?


+1 के लिए "योग पैंट की एक जोड़ी की तरह अपनी आवश्यकता को फिट करने के लिए बढ़ाया जा सकता है।"
रसेल

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

यह एक बहुत लायक है ;-) यह मुझे खुदाई करने के लिए दिशा देता है। धन्यवाद डैनियल
जैक

वर्थ चेकिंग, स्काला के लिए "संशोधित" यूएमएल, github.com/mnn/Dia2Scala/blob/master/other/Notation.md
वीचिंग लिन

जवाबों:


12

मैं वास्तव में इस प्रश्न का उत्तर नहीं दे सकता, लेकिन मुझे कुछ विचार प्रस्तुत करने दें।

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

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

यूएमएल श्रेणी के चित्र स्काला के लिए अधिक उत्तरदायी हैं; हां, मिश्रण अच्छी तरह से नहीं आते हैं, लेकिन यह एक ऐसी चीज है जिसे ओवरहालिंग के बजाय "ट्विक" किया जा सकता है। लेकिन मुझे लगता है कि यह बात याद आ रही होगी।

दोबारा विचार करें कि स्काला के पास "गूंगी वस्तुएं" क्यों हैं। यदि आप बिना किसी विधि के केस क्लास लिखते हैं:

case class NewInvite(user: User, league: League)

आपको किसी भी तरीके की आवश्यकता नहीं है, क्योंकि सदस्यों के प्रकार कुछ वादा करते हैं कि आप उनके साथ क्या कर सकते हैं। वास्तव में, वे सब कुछ वादा करते हैं । और, कार्यक्रम के भीतर हर दायरे में, दायरे के भीतर चर और उनके प्रकार इस बारे में कुछ वादा करते हैं कि कोड उस बिंदु पर कहां जा सकता है।

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


"प्रोग्रामर को क्या वादा किया गया है" - इसके पास एक प्यारी सी अंगूठी है ;-)
जैक

12

यूएमएल 80 के दशक के अंत और 90 के दशक की शुरुआत में "बबल वॉर्स" से उभरा। यह हमेशा संकेतन के लिए एक समझौता था , न कि एक डिजाइन विधि। यूएमएल के लिए जिम्मेदार कई पूर्वजों में गुप्त रूप से एक डिजाइन पद्धति का परिणाम है जो कहता है "चरण 1: एक वर्ग मॉडल ड्रा करें।"

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

जिम्मेदारियों

CRC स्कैला के लिए भी काम करता है जैसा कि यह किसी अन्य OO भाषा के लिए करता है, जिसका कहना है कि यह बहुत अच्छी तरह से काम करता है! एंथ्रोपोमोर्फिंग अभिनेताओं द्वारा जिम्मेदारियों के आवंटन को मॉडलिंग करना और उनके सहयोग को समझना अभी भी अच्छी तरह से काम करता है।

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

कार्यान्वयन को समझना

ऑब्जेक्ट डेटा सीमाओं को अन्य वस्तुओं के बजाय पास करें, और आप पाएंगे कि) किसी वस्तु के कण को ​​अंदर छिपाकर रखना आसान है, और b) वस्तु व्यवहार के कार्यात्मक कार्यान्वयन बहुत मायने रखते हैं।

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

प्रतिनिधित्व और संकेतन

तो, इस डिजाइन संरचना के भीतर, आपको अभी भी विचारों को अपने सिर से बाहर निकालने और किसी और के साथ साझा करने की आवश्यकता है।

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

विस्तार के बारीक अनाज पर, साक्षर प्रोग्रामिंग तकनीकों का प्रयास करें।

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


9

हम शुद्ध स्काला समाधान कैसे डिजाइन करते हैं?

मुझे लगता है कि आप इस प्रश्न के साथ गलत कोण ले रहे हैं। समाधान के लिए आपका समग्र डिजाइन किसी विशेष भाषा से बंधा नहीं होना चाहिए; बल्कि, यह हाथ में समस्या के अनुरूप होना चाहिए। स्काला के बारे में महान बात यह है कि जब आपके डिजाइन को लागू करने का समय आता है तो यह आपके रास्ते में नहीं आने के लिए पर्याप्त लचीला होता है। दूसरी ओर, जावा कुछ डिजाइन निर्णयों को लागू करता है (मुख्य रूप से, सब कुछ एक-वर्गीय मानसिकता है) जो इसे थोड़ा भद्दा महसूस करेगा

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

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

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


4

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

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

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


3

सवाल था: हम शुद्ध स्काला समाधान कैसे डिजाइन करते हैं?

जैसे उत्तर,

  1. हम XYZ का उपयोग करते हैं क्योंकि ...।
  2. हम एबीसी का उपयोग करते हैं लेकिन ऐसा करते हैं ...।
  3. हमने XYZ का उपयोग करना शुरू कर दिया, लेकिन फिर ABC को बेहतर पाया क्योंकि ...

इस तरह के एक उपकरण-सेट या समाधान की कुछ परिपक्वता, या आम तौर पर स्वीकृत अस्तित्व को इंगित करता है।

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

क्या यह कहना सुरक्षित है, कि हम प्रश्न का उत्तर जानते हैं:

"... क्या यह एक का आविष्कार करने का समय है?"

क्या यह हाँ हो सकता है ? (जहां ' हां ' समाधान के साधनों को नहीं लिखता है। इसे मौजूदा समाधान का विस्तार करके या जमीन से एक बनाकर हासिल किया जा सकता है। यह स्वीकार करता है कि मौजूदा डिजाइन विकल्पों में महत्वपूर्ण कमियां हैं)

यदि आप असहमत हैं तो मेरे जवाब को वोट करने के लिए आपका स्वागत है। मैं इसे एक आदमी की तरह लूंगा।


क्रांतिकारी? क्यूं कर? लिस्प दशकों से अनिवार्य और कार्यात्मक दृष्टिकोणों का एक आदर्श संयोजन था। स्काला अपने प्रकार की प्रणाली के कारण दिलचस्प है।
SK-तर्क

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

2

मैं भाषाओं के बीच अंतर नहीं करता, मैं इसे जावा में वैसे ही करूंगा। हालाँकि मैं कार्यात्मक (बीजगणितीय हास्केल वन या लिस्प वन) के बजाय ओओ स्कूल से हूं। हास्केल ऐप डिज़ाइन वास्तव में स्काला या क्लोजर से अलग है। इसके अलावा एक Scala.js ऐप डिज़ाइन स्टेटफुल DOM के कारण अलग है - यह आपके ऐप के एक स्टेटफुल पार्ट से लड़ना मुश्किल है जो अनिवार्य है। समय के साथ-साथ मुझे ओओ के तरीके को करने की आदत पड़ गई, जबकि राज्य और उत्परिवर्तन को यथासंभव समाप्त करने की कोशिश कर रहा था। अगर मैं एक टाइपलेवल या स्केलज़ फैन होता, तो शायद मेरे ऐप काफी अलग दिखते।

  1. प्रौद्योगिकी स्टैक और ग्राहक / सर्वर जिम्मेदारी, वितरित प्रकृति जैसे प्रमुख डिजाइन निर्णयों पर निर्णय लेना - क्या हमें वास्तव में डेटा दृढ़ता की आवश्यकता है? क्या हमारे आवेदन सबसे अच्छा सूट करता है? (निश्चित रूप से अभी तक पुस्तकालय या रूपरेखा नहीं)

  2. केवल एक App.scalaफ़ाइल से शुरू करना, जहाँ मैं प्रमुख प्रकारों (लक्षण और केस क्लासेस) और भूमिकाओं को परिभाषित करता हूँ - AFK होते हुए बहुत चिंतन और सोच। एक फाइल में रहते हुए इसके साथ खेलना इतना आसान है। यहां तक ​​कि अगर यह एक सरल अनुप्रयोग है, तो प्रोटोटाइप भी अस्तित्व में आ सकता है। मैं इस चरण के लिए बहुत समय समर्पित करता हूं क्योंकि सबसे सही और मुख्य रूप से पारदर्शी और समझदार प्रोटोटाइप संभव होने से ज्यादा महत्वपूर्ण कुछ भी नहीं है। यह सब हमारे आगे के चिंतन को अधिक सटीक बनाने में मदद करता है और यह सफलता की संभावना को बढ़ाता है।

  3. अब जब हमने अपने समाधान की शुद्धता साबित कर दी है, तो हमारे पास स्पष्ट दृष्टि है और सभी संभावित समस्याओं का पता चला है, यह सोचने का समय है कि किस तरह के तीसरे पक्ष के पुस्तकालयों या कार्यप्रणाली को लाया जाए? क्या हम इन राज्य के कलाकारों को बनाने जा रहे हैं, क्या हमें वास्तव में अक्का के लचीलेपन की आवश्यकता है, .., या शायद नहीं? क्या हम इन धाराओं के लिए Rx का उपयोग करते हैं? यूआई के लिए हम क्या उपयोग करते हैं ताकि हम 10 इंटरैक्टिव सुविधाओं के बाद पागल न हों?

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

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

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

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.