क्या बहुत अधिक अमूर्तता बुरी हो सकती है?


46

प्रोग्रामर के रूप में मुझे लगता है कि हमारा लक्ष्य दिए गए डोमेन मॉडल और व्यावसायिक तर्क पर अच्छा सार प्रदान करना है। लेकिन यह अमूर्तता कहाँ रुकनी चाहिए? अमूर्त और सभी के बीच व्यापार बंद कैसे करें (यह लचीलापन, परिवर्तन की आसानी आदि) और कोड और सभी लाभों को समझने में आसानी है

मेरा मानना ​​है कि मैं कोड को अधिकता से लिखना चाहता हूं और मुझे नहीं पता कि यह कितना अच्छा है; मैं अक्सर इसे लिखना पसंद करता हूं, यह किसी प्रकार का सूक्ष्म ढांचा है, जिसमें दो भाग होते हैं:

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

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

नोट: यह कोड पठनीयता के बारे में नहीं है! 1 और 2 दोनों कोड पढ़ने योग्य हैं, लेकिन 2 पर कोड अधिक जटिल सार के साथ आता है जबकि कोड 1 सरल सार के साथ आता है।


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

25
"बहुत ज्यादा" परिभाषा से बुरा है।
जॉन पूर्डी

@ जिमीहॉफ्ता: उन प्रकारों को अपनी जगह पर रखना होगा। और ईर्ष्या मत करो — मुझे सारा दिन हास्केल लिखना नहीं आता । यह वास्तव में ज्यादातर PHP, जावास्क्रिप्ट और OCaml है।
जॉन पूर्डी

जवाबों:


78

TC ++ PL4 के पहले शब्द:

कंप्यूटर विज्ञान में सभी समस्याओं को अप्रत्यक्ष के एक और स्तर से हल किया जा सकता है, सिवाय अप्रत्यक्ष की कई परतों की समस्या के। - डेविड जे व्हीलर

(डेविड व्हीलर मेरे थीसिस सलाहकार थे। महत्वपूर्ण अंतिम पंक्ति के बिना बोली को कभी-कभी "कंप्यूटर विज्ञान का पहला कानून" कहा जाता है।)


6
और आपको कैसे पता चलेगा जब आपके पास अप्रत्यक्ष के कई स्तर हैं? मैं यह कहना चाहता हूं कि यह अनुभव के साथ आता है, लेकिन एक अधिक अनुभवी प्रोग्रामर आसानी से अधिक अप्रत्यक्षता को समझता है इसलिए बहुत अधिक स्तरों के साथ समस्या नहीं देखता है।
m3th0dman

2
@ m3th0dman - आपके पास अमूर्तता का सही स्तर है जब भविष्य में बदलाव करना आसान हो जाता है। बेशक, आप यह भी पूछ सकते हैं कि आप कैसे जानते हैं कि कब क्या होगा जो केवल एक अलग तरीके से प्रश्न चक्र को दोहराता है।


1
यह प्रश्न प्रोग्रामर-स्तरीय आश्रित की तरह है। आपके पास जटिल प्रोग्रामर होंगे जो आपके पागल 8-स्तरीय परत वास्तुकला को समझेंगे और इसे शानदार पाएंगे, जबकि अन्य सरल लेकिन चिकनी कोडर्स इसे हास्यास्पद और आपके पागल 8-स्तरीय के बारे में तर्क देंगे। स्तरित परियोजना .. यह वह जगह है जहाँ प्रलेखन भुगतान करता है, न केवल यह आपको अपने कोड को दस्तावेज़ करने की अनुमति देता है, बल्कि आपको इसका बचाव करने की अनुमति देता है
रयान

1
मेरी अज्ञानता को क्षमा करें, लेकिन मैं "टीसी ++
पीएल 4

30

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

और यहीं से असली समस्या सामने आती है। जब अमूर्तताएं विफल हो जाती हैं, तो उनमें से जितना आपने लिखा था, उसके बीच में स्तरित हो गया है और वास्तव में क्या चल रहा है, इस समस्या का पता लगाना और इसे ठीक करना कठिन है, क्योंकि अधिक स्थान हैं जहां समस्या हो सकती है। और जितनी अधिक परतें हैं, उतने ही आपको इसे ट्रैक करने के लिए जानना होगा।


1
"और इसका मतलब है कि किसी बिंदु पर, हर अमूर्त किसी तरह से लीक होने जा रहा है।": सच है। एक बेहतर अमूर्तता वह है जो कम बार लीक करता है।
जियोर्जियो

11
बज़्ने के उत्तर (और डेविड व्हीलर के विकी पेज का संदर्भ ) के प्रकाश में , शायद आप अपनी बोली के अटेंशन को बदल सकते हैं? :)
कॉंगसबोंगस

2
@ कोंगोक्सू: Btw मैं दूसरे छोर से इस पर चला गया: "बजरने स्ट्रॉस्ट्रुप कोट्स" के लिए गुगली करना और बंजर का एक भी संदर्भ नहीं मिला है, जिसमें "अप्रत्यक्षता की एक और परत जोड़ना" कहा गया है ... निश्चित रूप से निर्णायक नहीं यह अत्यधिक संभावना नहीं है कि वह इसे बोलने वाला पहला व्यक्ति था।
मार्जन वेनेमा

1
अमूर्तता की अधिक परतों का मतलब है सरल अमूर्तता और इस प्रकार प्रति अमूर्त रिसाव कम होना। तो एक गणितीय सूत्रीकरण में (निश्चित रूप से, बिना किसी प्रमाण के) अमूर्त रिसाव का योग निरंतर हो सकता है क्योंकि अमूर्त स्तरों की संख्या बदल जाती है।
m3th0dman

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

15

हाँ बिल्कुल।

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

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

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

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

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

विषय पर वापस जाना।

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

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

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

अंत में, जटिल कोड जटिल होने जा रहा है। वहाँ अक्सर उस के आसपास कोई रास्ता नहीं है। लेकिन जिस कोड पर निर्भरता कम होती है, उसे समझना आसान होता है, जो विभिन्न बाहरी राज्यों पर निर्भर करता है।


2
+1 के लिए "अच्छा दर्जी प्रत्येक सीम पर कपड़े के अहसास को नहीं छोड़ता है बस आप एक तीसरी बांह उगाने के लिए, या गर्भवती हो जाते हैं"। हम अक्सर इस तरह से सॉफ्टवेयर डिजाइन करते हैं, दुख की बात है।
केमोडा

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

13

मुझे लगता है कि हमारा लक्ष्य दिए गए डोमेन मॉडल और व्यापार तर्क पर अच्छा सार प्रदान करना है।

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

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