फ़ीचर इंटर्सेस से निपटना


11

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

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

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

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

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

  • विशिष्टता: जब आप एक नई सुविधा निर्दिष्ट करते हैं - आप यह कैसे सुनिश्चित करते हैं कि यह अन्य सभी बच्चों के साथ अच्छा खेले?

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

  • कार्यान्वयन: जब आप एक सुविधा को लागू करते हैं - आप सभी मामलों में अपने कोड को कैसे इंटरैक्ट / चौराहों पर ठीक से सुनिश्चित करते हैं।

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

  • सत्यापन: जब आप एक विशेषता का परीक्षण करते हैं - आप इस तथ्य से कैसे निपटते हैं, कि आप केवल इस सुविधा चौराहे के कुछ हिस्सों का परीक्षण कर सकते हैं?

    यह जानना काफी कठिन है कि अलगाव में किसी एक विशेषता का परीक्षण करना त्रुटि-रहित कोड के पास कहीं भी कुछ भी गारंटी नहीं देता है, लेकिन जब आप इसे कम कर देते हैं 2^-Nतो ऐसा लगता है कि सैकड़ों परीक्षण संयुक्त सागर में पानी की एक बूंद को भी कवर नहीं कर रहे हैं। । इससे भी बदतर, सबसे अधिक समस्याग्रस्त त्रुटियां वे हैं जो सुविधाओं के प्रतिच्छेदन से उपजी हैं, जो कि किसी भी समस्या के लिए नेतृत्व करने की उम्मीद नहीं कर सकता है - लेकिन अगर आप इस तरह के मजबूत चौराहे की उम्मीद नहीं करते हैं, तो आप कैसे इनका परीक्षण करेंगे?

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


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

जवाबों:


6

हम पहले से ही गणितीय रूप से जानते थे कि रुकने की समस्या के कारण एक कार्यक्रम का सत्यापन सबसे सामान्य स्थिति में सीमित समय में असंभव है। इसलिए इस तरह की समस्या कोई नई बात नहीं है।

व्यवहार में, अच्छा डिज़ाइन इस तरह से डिकूपिंग प्रदान कर सकता है कि इंटरसेक्टिंग सुविधाओं की संख्या 2 ^ N से कम है, हालांकि यह निश्चित रूप से अच्छी तरह से डिज़ाइन किए गए सिस्टम में भी N से ऊपर लगता है।

जहाँ तक सूत्रों की बात है, मुझे ऐसा लगता है कि सॉफ्टवेयर डिज़ाइन के बारे में लगभग हर किताब या ब्लॉग प्रभावी रूप से उस 2 ^ N को जितना संभव हो उतना कम करने की कोशिश कर रहा है, हालाँकि मुझे इस बात की कोई जानकारी नहीं है कि समस्या को उसी संदर्भ में बताएं जैसे आप करना।

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

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

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

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

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


0

यह किसी भी तरह से सबसे अच्छा जवाब नहीं होगा, लेकिन मैं कुछ चीजों पर सोच रहा हूं, जो आपके प्रश्न में अंकों के साथ अंतर करती हैं, इसलिए मैंने सोचा कि मैं इसका उल्लेख करूंगा:

संरचनात्मक समर्थन

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

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

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

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

डिज़ाइन

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

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

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

सरल!

मैं देर से डिजाइन पर एक न्यूनतावादी रुख ले रहा हूं, समस्या को सरल बनाने के साथ, फिर समाधान को सरल बना रहा है। अगर समय को एक परियोजना के लिए डिजाइन पुनरावृत्ति को सरल करते हुए एक दूसरे के लिए बनाया जा सकता है, तो मैं देख सकता था कि बाद में चीजों को जोड़ते समय बहुत मददगार रहा।

वैसे भी, यह मेरी 2 सी है।

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