क्या अमूर्तता को कोड पठनीयता कम करना है?


19

एक अच्छा डेवलपर जो मेरे साथ काम करता है, उसने हाल ही में कुछ कठिनाईयों के बारे में बताया, जो हमें विरासत में मिले थे। उन्होंने कहा कि समस्या यह थी कि कोड का पालन करना मुश्किल था। उस से, मैंने उत्पाद में गहराई से देखा और महसूस किया कि कोड पथ को देखना कितना कठिन था।

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

मुझे पता है कि कुछ डेवलपर्स इस कारण से निर्भरता इंजेक्शन कंटेनरों को सख्ती से बंद कर देते हैं। यह सॉफ्टवेयर के पथ को इतना भ्रमित करता है कि कोड नेविगेशन की कठिनाई तेजी से बढ़ जाती है।

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

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

जवाबों:


17

यह वास्तव में @kevin cline के उत्तर पर एक लंबी टिप्पणी के अधिक है।

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

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

इसके विपरीत, जब आप इसे जावा में चलाते हैं, तो आप बहुत अच्छी तरह से ज्ञात "एंटरप्राइज हेलो वर्ल्ड" के कुछ संस्करण देख सकते हैं, जहां एक एकल तुच्छ वर्ग के बजाय जो कुछ सरल करता है, आपको एक सार बेस क्लास मिलता है। और एक ठोस व्युत्पन्न वर्ग जो इंटरफ़ेस X को लागू करता है, और एक डीआई फ्रेमवर्क, आदि में फैक्ट्री क्लास द्वारा बनाया जाता है। कोड की 10 लाइनें जो वास्तविक काम करती हैं, उन्हें बुनियादी ढांचे की 5000 लाइनों के नीचे दफन किया जाता है।

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

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


7

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


एकल संदर्भ बिंदुओं के साथ YAGNI और सार का उल्लेख करने के लिए +1। एक अमूर्त बनाने की प्राथमिक भूमिका कई चीजों के सामान्य बिंदु को बाहर कर रही है। यदि एक अमूर्तता केवल एक बिंदु से संदर्भित की जाती है, तो हम सामान्य सामान को बाहर करने की बात नहीं कर सकते हैं, इस तरह की एक अमूर्तता सिर्फ यो समस्या में योगदान देती है। मैं इसका विस्तार करूंगा क्योंकि यह सभी प्रकार के अमूर्त के लिए सही है: फ़ंक्शन, जेनेरिक, मैक्रोज़, जो भी ...
Calmarius

3

ठीक है, पर्याप्त अमूर्त नहीं और आपके कोड को समझना मुश्किल है क्योंकि आप अलग नहीं कर सकते हैं कि कौन से हिस्से क्या करते हैं।

बहुत अधिक अमूर्तता और आप अमूर्त को देखते हैं, लेकिन कोड ही नहीं, और फिर वास्तविक निष्पादन थ्रेड का पालन करना कठिन बनाता है।

अच्छा अमूर्त को प्राप्त करने, एक चुंबन करना चाहिए: इस सवाल के लिए अपने जवाब देखने में पता करने की समस्याओं के उन प्रकार से बचने के लिए पालन करने के लिए क्या

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

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


3
ठीक है, पर्याप्त अमूर्त नहीं और आपके कोड को समझना मुश्किल है क्योंकि आप अलग नहीं कर सकते हैं कि कौन से हिस्से क्या करते हैं। वह अतिक्रमण है, अमूर्तता नहीं। आप बहुत अमूर्त बिना ठोस वर्गों में भागों को अलग कर सकते हैं।
स्टेटमेंट

कक्षाएं केवल वे अमूर्तियाँ नहीं हैं जिनका हम उपयोग कर रहे हैं: फ़ंक्शंस, मॉड्यूल / लाइब्रेरीज़, सेवाएँ, आदि। आपकी कक्षाओं में आप आमतौर पर किसी फ़ंक्शन / विधि के पीछे प्रत्येक कार्यक्षमता को सार करते हैं, जो कि अन्य विधि को कह सकते हैं जो एक दूसरे को एक दूसरे को कार्य करते हैं।
Klaim

1
@Statement: डेटा को इनकैप्सुलेट करना बेशक एक अमूर्तता है।
एड एस।

नामपद पदानुक्रम वास्तव में बहुत अच्छे हैं, हालांकि।
JAB

2

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

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

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

बहुत सी चीजें कार्यात्मकता प्रदान करती हैं

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

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

अधिक डेटा, कम कार्यक्षमता

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

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


0

मेरा सवाल यह है कि जब कोई ढांचा या पैटर्न इतना ओवरहेड इस तरह पेश करता है, तो क्या यह इसके लायक है? क्या यह खराब तरीके से लागू किए गए पैटर्न का लक्षण है?

शायद यह गलत प्रोग्रामिंग भाषा चुनने का लक्षण है।


1
मैं नहीं देखता कि पसंद की भाषा के साथ इसका क्या संबंध है। सार एक उच्च स्तरीय भाषा-स्वतंत्र अवधारणा है।
एड एस।

@ ईडी: कुछ अमूर्त कुछ भाषाओं में दूसरों की तुलना में अधिक साकार होते हैं।
केविन क्लाइन

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

0

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


-1

मैं आईडीई सुविधाओं का उपयोग करने के खिलाफ भी चेतावनी देता हूं जो सामान को आसान बनाते हैं।

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