क्या टॉप डाउन या बॉटम डिज़ाइन करना बेहतर है?


31

जैसा कि मैं समझता हूं, ऊपर-नीचे डिजाइन अमूर्त उच्च स्तर की अवधारणा को छोटे ठोस और बोधगम्य भागों में परिष्कृत करके है, जब तक कि सबसे छोटे भवन ब्लॉक को परिभाषित नहीं किया जाता है। दूसरी तरफ, निचला स्तर निम्न स्तर को परिभाषित करता है, फिर धीरे-धीरे उच्च स्तर के ब्लॉक का निर्माण करता है जब तक कि पूरी प्रणाली नहीं बन जाती।

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

की प्रक्रिया:

  • आवश्यकता युक्ति बनाना
  • एक डिजाइन युक्ति बनाएं (चित्र के साथ)
  • लागू
  • उद्धार
  • दोहराएँ (पुनरावृत्ति विकास में, प्रत्येक चरण में एक पूरा हिस्सा करने के बजाय, हम प्रत्येक बार थोड़ा-थोड़ा करते हैं, और ग्राहक की गतिशील आवश्यकता के अनुकूल दैनिक बैठक करते हैं)

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

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

अपने निबंध प्रोग्रामिंग बॉटम अप में , पॉल ग्राहम पूरी तरह से नीचे से निर्माण को प्रोत्साहित करने के लिए लगता है, या नीचे से इसे प्रोग्राम करता है, लेकिन आवश्यकता विश्लेषण / डिजाइन चरण नहीं:

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

जहां तक ​​मुझे मिलता है, उसका क्या मतलब है कि लिस्पर अभी भी टॉप-डाउन डिज़ाइन करता है, लेकिन कार्यक्रम नीचे है, क्या यह सच है? उन्होंने लिखा एक और बिंदु:

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

क्या इसका मतलब यह है कि लिस्प में एक कार्यक्रम लिखने की अवधि के दौरान, आप एक सामान्य उपकरण के साथ समाप्त होते हैं?


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

@ S.Robins योग करने के लिए, मैंने सॉफ्टवेयर विकसित करने के लिए अपने सामान्य टॉप-डाउन दृष्टिकोण का प्रदर्शन किया। हालांकि, कुछ लोग नीचे से ऊपर पसंद करते हैं, और उनमें से एक पॉल ग्राहम है, जो एक प्रसिद्ध व्यक्ति है। मैं यह समझने के लिए कहता हूं कि नीचे का डिज़ाइन सामान्य रूप से और विशेष रूप से लिस्प में कैसे मदद करता है क्योंकि इसमें प्रोत्साहित करने के लिए विशेष विशेषताएं हैं (जैसा कि पॉल ने सुझाव दिया है)।
अमुमू

1
अमुमु मैंने उदाहरण प्रस्तुत किया है, क्योंकि दोनों जवाबों ने इसे वैसे भी छोड़ दिया है। कृपया अपने प्रश्नों को संक्षिप्त रखने का प्रयास करें, और प्रति प्रश्न केवल एक प्रश्न पूछें ।
यानि

जवाबों:


35

टॉप-डाउन उन चीजों का वर्णन करने का एक शानदार तरीका है जो आप जानते हैं, या उन चीजों को फिर से बनाने के लिए जो आपने पहले ही बनाई हैं।

टॉप-डाउन सबसे बड़ी समस्या यह है कि बहुत बार बस कोई "टॉप" नहीं होता है। आप अपना दिमाग बदल लेंगे कि सिस्टम को विकसित करते समय और डोमेन की खोज करते समय सिस्टम को क्या करना चाहिए। आपका शुरुआती बिंदु कुछ ऐसा कैसे हो सकता है जिसे आप नहीं जानते (यानी आप सिस्टम को क्या करना चाहते हैं)?

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

नीचे-ऊपर होना चाहिए (विश्व स्तर पर) दृष्टिकोण जब तक आप समस्या का 100% नहीं जानते हैं, आपको कोडित होने के लिए बस ज्ञात समाधान की आवश्यकता है और आप संभावित वैकल्पिक समाधानों की तलाश में परवाह नहीं करते हैं।

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

लेकिन भयानक कोड किसी भी भाषा में लिखा जा सकता है। यहां तक ​​कि भाषाओं में जो मन के लिए पिंजरे के आकार का होता है, इस उम्मीद के साथ बनाया गया है कि उन भाषाओं के साथ भी बंदरों को अच्छे कार्यक्रम मिल सकते हैं और चल रहे हैं (इतने स्तरों पर एक विचार इतना गलत है कि यह सिर्फ इसके बारे में सोचने पर भी दर्द होता है)।

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

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

कई मामलों में हालांकि डॉट्स को जोड़ने के लिए उपयोग किए जाने वाले कोई भी सिद्ध-ज्ञात दृष्टिकोण नहीं है। वास्तव में बहुत बार यह कहना मुश्किल है कि डॉट्स क्या हैं।

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

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

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

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

निश्चित रूप से अन्य कंपनियों ने भी इसी समस्या को हल किया ... लेकिन जब तक आप इन कंपनियों में से एक हैं, तब तक शायद आपकी टॉप-डाउन विस्तृत परियोजना एक मजाक होगी। हम इसे ऊपर-नीचे डिज़ाइन कर सकते हैं। आप ऐसा नहीं कर सकते क्योंकि आपने पहले कभी ऐसा नहीं किया था।

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

नए जटिल सॉफ्टवेयर सिस्टम विकसित किए गए हैं, डिज़ाइन नहीं किए गए हैं। हर अब और फिर कोई व्यक्ति खरोंच से एक बड़ा नया जटिल बीमार-निर्दिष्ट सॉफ़्टवेयर सिस्टम डिज़ाइन करना शुरू कर देता है (ध्यान दें कि एक बड़े जटिल सॉफ़्टवेयर प्रोजेक्ट के साथ केवल तीन संभावनाएँ हैं: a] विनिर्देशन अस्पष्ट है, b] विनिर्देश गलत है और आत्म-विरोधाभासी है या सी] दोनों ... और सबसे अधिक बार [सी] मामला है)।

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

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

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

उदाहरण के लिए कीवर्ड पैरामीटर पहले से मौजूद हैं, लेकिन अगर वे मौजूद नहीं थे तो उन्हें जोड़ा जा सकता है। मैंने ऐसा किया था (एक संकलन समय पर खोजशब्द सत्यापन सहित) एक खिलौना लिस्प कंपाइलर के साथ मैं प्रयोग कर रहा हूं और यह ज्यादा कोड नहीं लेता है।

सी ++ के बजाय सबसे अधिक आप प्राप्त कर सकते हैं सी ++ विशेषज्ञों का एक समूह है जो आपको बता रहा है कि कीवर्ड पैरामीटर उपयोगी नहीं हैं, या एक अविश्वसनीय रूप से जटिल, टूटा हुआ, आधा समर्थित टेम्पलेट कार्यान्वयन है जो वास्तव में उपयोगी नहीं है। क्या C ++ क्लास प्रथम श्रेणी की वस्तुएं हैं? नहीं और इसके बारे में आप कुछ नहीं कर सकते। क्या आप रनटाइम पर या संकलन के समय आत्मनिरीक्षण कर सकते हैं? नहीं और इसके बारे में आप कुछ नहीं कर सकते।

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


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

स्पष्ट रूप से ज्ञात तरीके से स्पष्ट रूप से ज्ञात किसी चीज़ को फिर से बनाने के लिए ऊपर-नीचे ठीक है। आपका वेब ब्राउज़र इसका एक उदाहरण है। यहां तक ​​कि सी ++ जैसी भाषा का उपयोग करना जो आपको पूर्वानुमान लगाने और औपचारिक रूप से निर्दिष्ट करने के लिए मजबूर करता है (एक भयानक वाक्यविन्यास का उपयोग करके) आपके कार्यक्रम के सभी चर में रखे गए मूल्यों के लिए सभी प्रकार अभी भी एक व्यवहार्य विकल्प है।
१५५२

मुझे नहीं लगता कि मेरा उदाहरण एक स्पष्ट रूप से ज्ञात तरीका है, क्योंकि मुझे लगता है कि यह किसी व्यक्ति द्वारा डेटा संचार के बुनियादी ज्ञान के साथ बनाया गया है, और सी ++ कोड डोमेन ज्ञान (इस मामले में, नेटवर्किंग) से बहुत ही मूल डिजाइन का परिणाम है। । यह विकास के डिजाइन का एक उदाहरण है। अगले पुनरावृत्ति में, डेवलपर को डोमेन ज्ञान के बारे में अधिक पता चलता है, इसलिए वह विकसित डिजाइन (जैसे वेब सर्वर की प्रत्येक परत में अतिरिक्त सुरक्षा पहलुओं) को फिट करने के लिए अपने डिजाइन का विस्तार करता है। फिर वह नए डिजाइन के अनुसार कार्यान्वयन को परिष्कृत करता है।
अमुमू

यहां मुद्दा यह है कि एक वास्तविक स्वतंत्र भाषा (जैसे प्राकृतिक भाषा, गणित भाषा ... डोमेन पर निर्भर करती है) से प्राप्त वास्तविक समाधान। कोडिंग का कार्य उत्पन्न समाधान से कोड तक एक विस्तृत मानचित्रण है।
अमुमू

1
हाय मि .6502। एक साल के बाद, जैसा कि मैंने और चीजें सीखीं, मैंने यह देखना शुरू कर दिया कि आपने जो कहा वह ट्रूअर हो गया। मैंने एक और धागा बनाया: programmers.stackexchange.com/questions/179000/… । यदि आपके पास समय है, तो मुझे आशा है कि आप मेरी सोच को फिर से स्पष्ट करेंगे: डी।
अमुमू

6

मुझे यकीन नहीं है कि यह उत्तर लिस्प पर कैसे लागू होगा, लेकिन मैंने अभी एजाइल प्रिंसिपल्स, पैटर्न और प्रैक्टिस को पढ़ना समाप्त किया है , और लेखक, अंकल बॉब , सी # के लिए शीर्ष-डाउन दृष्टिकोण की दृढ़ता से वकालत करते हैं (सी ++ के लिए भी लागू होता है) जिसके साथ पूरी तरह से। इस बात से सहमत।

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

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

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

यदि आप एक्सपी और विकासवादी डिजाइन के बारे में अधिक पढ़ना चाहते हैं, तो यहां एक और महान लेखक मार्टिन फाउलर का अच्छा पढ़ा गया है: "क्या डिज़ाइन डेड है?"


उत्तम। यह वही है जिसके बारे में बात कर रहा हूं। इसके अलावा SOLID सिद्धांत के बारे में जानना अच्छा है, और Agile शीर्ष-डाउन दृष्टिकोण का समर्थन करता है (मुझे लगा कि TDD और XP के साथ, लोग कोड asap और दस्तावेज़ से बचने के लिए कूदते हैं)।
अम्मू

@ अम्मू: मैंने फाउलर द्वारा लिखे गए एक अन्य लेख का लिंक जोड़ा। आप बिना किसी डिज़ाइन / डॉक्यूमेंट के साथ काउबॉय कोडिंग के बीच अंतर के बारे में अधिक पढ़ सकते हैं कि वास्तव में XP / एजाइल क्या प्रचार कर रहा है। व्यक्तिगत रूप से, मेरा मानना ​​है कि प्रलेखन का मूल्य है और मैं अपने डिजाइन डॉक्स को बनाए रखने के लिए अपनी टीम को सक्रिय रूप से बढ़ावा दे रहा हूं, मैं धीरे-धीरे अपने विचारों को स्थानांतरित कर रहा हूं। अब हमारे "डिज़ाइन कार्य" सभी व्हाइटबोर्ड / नैपकिन प्रकार की चीजें हैं, जबकि वास्तविक डॉक्स केवल कहानी लिखे जाने के बाद अपडेट किए जाते हैं। हम यह भी देख रहे हैं कि वास्तव में क्या दस्तावेज है ताकि डॉक्स केवल उच्च-स्तरीय / वास्तुकला सामान को कवर करें
DXM

3

मेरे लिए, पॉल ग्राहम ने अपने लेख में सबसे महत्वपूर्ण टिप्पणी ये हैं:

[...] लिस्प प्रोग्रामर [...] एक सिद्धांत का पालन करते हैं, जिसे नीचे-ऊपर की डिजाइन कहा जा सकता है - समस्या के अनुरूप भाषा को बदलना। लिस्प में, आप अपने कार्यक्रम को केवल भाषा की ओर नहीं लिखते हैं, आप अपने कार्यक्रम की ओर भी भाषा का निर्माण करते हैं।

या, जैसा कि C ++ सर्किलों में जाना जाता है: लाइब्रेरी डिज़ाइन लैंग्वेज डिज़ाइन (Bjarne Stroustrup) है

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

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


2

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

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

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

ध्यान दें कि वास्तविक कारों और वास्तविक पहियों के विपरीत, यदि आपने एक सॉफ़्टवेयर "पहिया" बनाया है तो आपने उनकी अनंत संख्या बना ली है।

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

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

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


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

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

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

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

एक उदाहरण लेते हैं: मान लीजिए कि हम एक क्लाइंट / सर्वर एप्लिकेशन लिख रहे हैं। पहली बात हमें एक्सचेंज संदेशों को परिभाषित करके प्रोटोकॉल की पहचान करना है कि कैसे संदेश को मेमोरी में रखा गया है (यानी हेडर 16 बाइट्स, आईडी 4 बाइट्स ....)। आरेख मॉडलिंग / नियोजन के बराबर नहीं है: abstratt.com/blog/2009/05/03/on-code-being-model । हमें मॉडल के लिए UML या आरेख का उपयोग करने की आवश्यकता नहीं है, क्योंकि UML बहुत ही OOP पर केंद्रित है, और UML वर्ग आरेख में टाइप करने का समय वास्तविक कोड टाइप करने से कम नहीं है, यदि अधिक नहीं है।
अमुमु

1

पुनरावृत्ति विकास के साथ संयोजन में टॉप-डाउन दृष्टिकोण में क्या गलत है?

पुनरावृत्ति विकास के साथ एक टॉप-डाउन दृष्टिकोण का उपयोग करने से पहले पुनरावृत्तियों में कोई कार्य कोड वितरित नहीं होता है। यह डिज़ाइन दस्तावेज़ों को वितरित करता है और ऐसे ग्राहक जिनके पास प्रतिक्रिया देने के साथ एक कठिन समय होगा। जैसे जवाब, "हाँ मुझे लगता है (यह मेरे लिए बहुत सार है)" ग्राहक द्वारा वांछित प्रणाली की बारीकियों को निर्दिष्ट करने में आपकी मदद नहीं करेगा।

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

क्या पॉल ग्राहम ने पूरी तरह से नीचे से निर्माण को प्रोत्साहित किया? या बस इसे नीचे से प्रोग्राम करें, लेकिन आवश्यकता विश्लेषण / desing चरण नहीं?

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

इसका मतलब है, लिस्प में एक कार्यक्रम लिखने की अवधि के दौरान, आप एक सामान्य उपकरण के साथ समाप्त होते हैं, जिसका उपयोग मूल एक के समान कार्यक्रमों को लिखने के लिए किया जा सकता है, है न?

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


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