2015-09-15 9 views
5

सरल उदाहरण:क्या कक्षा में आधार वर्ग के रूप में खाली कक्षा होने का बुरा अभ्यास है, उम्मीद है कि कक्षा में भविष्य में सदस्य हो सकते हैं?

public class Food 
{ 
    public virtual void Eat() 
    { 
     StuffInMouth(); 
    } 
} 

public class Fruit : Food 
{ 
    // Nothing here yet, but likely could be in the future 
    // Is this bad from a .NET/C# style guidelines perspective? 
} 

public class Apple : Fruit 
{ 
    public virtual void Eat() 
    { 
     Clean(); 
     base.Eat(); 
    } 
} 

public class Orange : Fruit 
{ 
    public virtual void Eat() 
    { 
     Peel(); 
     base.Eat(); 
    } 
} 
+1

यही मतलब कर सकते हैं। इस तथ्य के बाद कक्षा पदानुक्रम बदलना निर्भर कोड पर एक तोड़ने वाला परिवर्तन हो सकता है। – usr

उत्तर

7

के रूप में सरल रूप में मैं इसे रख सकते हैं, यह Speculative Generality कहा जाता है।

समस्या के कारण: कभी-कभी कोड अनुमानित भविष्य की सुविधाओं का समर्थन करने के लिए "बस मामले में" बनाया जाता है जो कभी लागू नहीं होता है। नतीजतन, कोड समझने और समर्थन करने के लिए मुश्किल हो जाता है।


स्टीव McConnell कोड पूरा में बताते हैं के रूप में - 2,

प्रोग्रामर्स अनुमान लगा क्या कार्यक्षमता किसी दिन की आवश्यकता हो सकती पर बेहद खराब हैं।

1. आवश्यकताओं नहीं जाना जाता है, इसलिए प्रोग्रामर लगता है कि होना चाहिए: गलत अनुमान मतलब होगा कोड फेंक दिया जाना चाहिए।

2. यहां तक ​​कि एक करीबी अनुमान विवरण के बारे में गलत हो जाएगा: इन पेचीदगियों प्रोग्रामर के मान्यताओं को कमजोर करेगा - कोड होना चाहिए (या होना चाहिए) फेंक दिया।

3. अन्य/भविष्य प्रोग्रामर सट्टा कोड बेहतर काम करता है या की तुलना में यह अधिक आवश्यक है मान सकते हैं: वे सट्टा कोड के आधार पर कोड का निर्माण, लागत बढ़ जाती है जब सट्टा कोड होना चाहिए हटाया या बदला जा सकता है।

4. सट्टा व्यापकता जटिलता ला देता है और अधिक परीक्षण और रखरखाव की आवश्यकता है: यह लागत के लिए कहते हैं और पूरी परियोजना को धीमा कर देती।


क्रेडिट: कोड पूरा - 2 | Pluralsight course on refactoring

+0

@Rollie: बस बिंदु आगे समझाने के लिए ... आप 'Fruit' कक्षा में कुछ भी नहीं है, क्योंकि आपके कोड जानने के लिए कि एप्पल और भिंडी हैं' Fruit' या 'Vegetable' जरूरत नहीं है। 'फलों' के लिए कक्षा जोड़ना अब अप्रयुक्त कोड बन जाएगा जिसे आपको बनाए रखने की आवश्यकता है और जिसके लिए आपको इकाई परीक्षण आदि भी बनाए रखना होगा। भविष्य की आवश्यकता की आशा में उन्हें जोड़ने और बनाए रखने के बजाय कक्षाओं को परीक्षण और जोड़ने के लिए बेहतर है। – displayName

+1

डाउनवॉटर, कृपया समझाएं। – displayName

+0

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

1

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

1

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

चीजों को बहुत जल्दी लागू करने के रखरखाव ओवरहेड भी है।

1

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

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

+0

जो कुछ भी चलता है उसे एशिया में भोजन माना जा सकता है (: पी, कोई अपराध नहीं) –

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