2008-11-19 13 views
9

क्या है सबसे खराब अमूर्त उलट है कि आप आज प्रोग्रामिंग में देखने का उदाहरण (या तो प्रसार या गंभीरता के कारण)?सबसे बुरे अमूर्त उलट

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

+1

समुदाय विकी? – wheaties

उत्तर

9

शायद कभी भी देखा गया अबास्ट्रक्शन दुरुपयोग का सबसे बुरा उदाहरण this fluent C# था, जो एक धाराप्रवाह इंटरफ़ेस में मूल प्रवाह नियंत्रण तत्वों (यदि, whiles, अनुक्रमित अभिव्यक्ति) लपेटा गया था।

तो अपने पूरी तरह से मुहावरेदार, स्वच्छ कोड:

var selectedTextBox = (TextBox)sender, 
if (IsAdmin) 
{ 
    selectedTextBox.Enabled = true; 
    selectedTextBox.Text = superSecretPassword; 
} 
else 
{ 
    selectedTextBox.Clear(); 
} 

इस गड़बड़ हो जाता है:

Cast<TextBox>(sender). 
    WithIf(IsAdmin, 
     With(selectedTextBox => selectedTextBox.Enabled = true). 
     With(selectedTextBox => selectedTextBox.Text = superSecretPassword), 
     With(selectedTextBox => selectedTextBox.Clear()); 

क्योंकि सब कुछ lambdas के साथ बेहतर!

1

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

IMHO, यह गणना की विडंबनाओं में से एक यह है कि चाहे कितना उच्च स्तरीय एक भाषा है, अगर यह सार्वभौमिक है, यह निम्नतम स्तर पर इस्तेमाल किया जा सकता है। परिष्कार परिष्कार की कोई गारंटी नहीं है।

+2

वास्तव में नहीं। उच्च स्तर की भाषाएं अक्सर डिज़ाइन की जाती हैं ताकि यदि आप उच्च स्तर पर जो चाहते हैं उसे व्यक्त करने का कोई अच्छा तरीका न हो तो आप निम्न स्तर पर प्रोग्राम कर सकते हैं। यह सिर्फ इसे बदलने के बजाय, एक अमूर्तता का उपयोग नहीं कर रहा है। – dsimcha

2

यह एक सुंदर मृत विषय की तरह लगता है। कुछ चर्चा शुरू करने के लिए मैं अपने स्वयं के प्रश्न का उत्तर दूंगा। मैं कहूंगा कि मैंने देखा है कि सबसे खराब अमूर्त उलटा कार्य बिंदुओं को दोहराने के लिए ओओपी-शैली सार वर्ग/इंटरफेस का उपयोग कर रहा है। उदाहरण के लिए:

interface foo { 
    int bar(); 
} 

class myClass1 implements foo { 
    // No member variables. 

    int bar() { 
     // Implementation 
    } 

    // No other methods. 
} 

class myClass2 implements foo { 
    // No member variables. 

    int bar() { 
     // Implementation 
    } 

    // No other methods. 
} 

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

+1

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

+4

सी #, एफ #, डेल्फी, सी ++, पायथन, रूबी, ओकैमल, पर्ल, जावास्क्रिप्ट, स्कैला, लिस्प + क्लॉस, डी, और अन्य ओओपी भाषाओं का एक बोतलबंद लैम्ब्डा और प्रथम श्रेणी के कार्यों का समर्थन करता है। जावा फ़ंक्शन पॉइंटर्स के लिए समर्थन जोड़ने के लिए वास्तव में एकमात्र "बड़ी" भाषा है। – Juliet

0

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

EDT: मैं केवल पूछ रहा हूँ क्योंकि मैंने देखा है लोगों को "ठोस" मुद्दों पर उनके नाक बारी, यह सोच कर जंगल के पेड़ से ज्यादा महत्वपूर्ण है।

0

मुझे यकीन नहीं है कि यह वास्तव में योग्य है, लेकिन ऐसा लगता है। जब एसक्यूएल सर्वर 2005 सीएलआर क्षमताओं के साथ आया, मैंने डेवलपर्स का एक समूह सुना, जैसे "अच्छी तरह से, अब हम सीधे हमारी संग्रहीत प्रक्रियाओं से वेब सेवा कॉल को बंद कर सकते हैं!" मैंने ऐसा करने पर कई ट्यूटोरियल भी देखे। वे अमूर्तता के कुछ विरोधाभासी स्तर हैं।

1

एसक्यूएल परिणाम सेट पर कार्रवाई करने के लिए क्लाइंट-साइड प्रक्रियात्मक संग्रह पुस्तकालयों का उपयोग।

0

सबसे खराब (या तो प्रसार या गंभीरता के कारण) अमूर्त उलट है कि आप आज प्रोग्रामिंग में देखने का उदाहरण क्या है?

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

  • CustomerFactory
  • DecisionTreeVisitor
  • AbstractWindowDecorator
  • JsonDataAdapter
  • TabbedDocumentImpl
  • ConcreteListHandler

"फैक्टरी", "आगंतुक" , "सजावट", "एडाप्टर", "आईएमपीएल", "कंक्रीट" - कौन परवाह करता है कि इसका कार्यान्वयन कैसे किया जाता है, इसका क्या उपयोग किया जाता है?

+3

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

1

ध्वज बूलियन चर के उपयोग के माध्यम से संरचनात्मक प्रोग्रामिंग में गोटो सिमुलेट करने के बारे में कैसे? हालांकि, संरचनात्मक प्रोग्रामिंग आम तौर पर स्वीकार कर लिया गया है। क्या यह एक संकेत नहीं है कि अमूर्त उलटा हमेशा एक बुरी चीज नहीं है ??

+0

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

संबंधित मुद्दे