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();
}
}
उत्तर
के रूप में सरल रूप में मैं इसे रख सकते हैं, यह Speculative Generality कहा जाता है।
समस्या के कारण: कभी-कभी कोड अनुमानित भविष्य की सुविधाओं का समर्थन करने के लिए "बस मामले में" बनाया जाता है जो कभी लागू नहीं होता है। नतीजतन, कोड समझने और समर्थन करने के लिए मुश्किल हो जाता है।
स्टीव McConnell कोड पूरा में बताते हैं के रूप में - 2,
प्रोग्रामर्स अनुमान लगा क्या कार्यक्षमता किसी दिन की आवश्यकता हो सकती पर बेहद खराब हैं।
1. आवश्यकताओं नहीं जाना जाता है, इसलिए प्रोग्रामर लगता है कि होना चाहिए: गलत अनुमान मतलब होगा कोड फेंक दिया जाना चाहिए।
2. यहां तक कि एक करीबी अनुमान विवरण के बारे में गलत हो जाएगा: इन पेचीदगियों प्रोग्रामर के मान्यताओं को कमजोर करेगा - कोड होना चाहिए (या होना चाहिए) फेंक दिया।
3. अन्य/भविष्य प्रोग्रामर सट्टा कोड बेहतर काम करता है या की तुलना में यह अधिक आवश्यक है मान सकते हैं: वे सट्टा कोड के आधार पर कोड का निर्माण, लागत बढ़ जाती है जब सट्टा कोड होना चाहिए हटाया या बदला जा सकता है।
4. सट्टा व्यापकता जटिलता ला देता है और अधिक परीक्षण और रखरखाव की आवश्यकता है: यह लागत के लिए कहते हैं और पूरी परियोजना को धीमा कर देती।
क्रेडिट: कोड पूरा - 2 | Pluralsight course on refactoring।
@Rollie: बस बिंदु आगे समझाने के लिए ... आप 'Fruit' कक्षा में कुछ भी नहीं है, क्योंकि आपके कोड जानने के लिए कि एप्पल और भिंडी हैं' Fruit' या 'Vegetable' जरूरत नहीं है। 'फलों' के लिए कक्षा जोड़ना अब अप्रयुक्त कोड बन जाएगा जिसे आपको बनाए रखने की आवश्यकता है और जिसके लिए आपको इकाई परीक्षण आदि भी बनाए रखना होगा। भविष्य की आवश्यकता की आशा में उन्हें जोड़ने और बनाए रखने के बजाय कक्षाओं को परीक्षण और जोड़ने के लिए बेहतर है। – displayName
डाउनवॉटर, कृपया समझाएं। – displayName
मुझे बिंदु दिखाई देता है, हालांकि मेरी भावना यह है कि यह वास्तव में मामला-दर-मामला है। एक तरफ उदाहरण, एक ही परिदृश्य की कल्पना करें, लेकिन एक बड़ी विरासत पदानुक्रम/परियोजना के साथ। एक बड़े कोडबेस के दौरान कई विधियां इत्यादि एक खाद्य वस्तु स्वीकार करती हैं, लेकिन वास्तव में वे केवल फल के बारे में परवाह करते हैं। इस वर्ग के बिना (या एक समान खाली इंटरफ़ेस), उन्हें एक खाद्य तर्क स्वीकार करना होगा। हालांकि, जैसा व्यक्त किया गया है, यह संभव है कि फल में कार्यक्षमता होगी * उस समय उन सभी स्थानों को अपडेट किया जाना चाहिए। यदि इसकी आवश्यकता नहीं है, तो इसकी आवश्यकता होने पर बड़े लाभ के लिए यह एक छोटा सा बलिदान है। – Rollie
इम्हो यह कोई अतिरिक्त मूल्य के बिना एक अतिरिक्त अमूर्त परत है। यह अनावश्यक जटिलता को जोड़ता है, इसलिए मेरी राय में यह बुरी प्रैक्टिस और यागनी का एक उदाहरण है।
हाँ, यह जानना महत्वपूर्ण है कि यह इस तरह की चीजों को करने के लिए समय बचा सकता है (यदि इसका उपयोग किया जाता है) तो यह तुरंत भविष्य के लिए कोड करना बेहतर होता है, या कम से कम समझते हैं कि आप भविष्य के लिए कोडिंग कर रहे हैं वह कभी नहीं आएगा।
चीजों को बहुत जल्दी लागू करने के रखरखाव ओवरहेड भी है।
कोई भी नहीं कहा कि किसी वर्ग के पास कोई सदस्य होना चाहिए।एक वर्ग वस्तुओं की एक श्रेणी का प्रतिनिधित्व करता है, इसलिए यदि उनके पास कोई उपयोगी गुण नहीं है (भाषा के अर्थ में नहीं) तो यह खाली होने के लिए बिल्कुल ठीक है। तो महत्वपूर्ण बात यह है कि क्या कक्षा आपके ऑब्जेक्ट्स के साथ काम करने की ज़रूरत वाले वस्तुओं की सार्थक श्रेणी का प्रतिनिधित्व करती है या नहीं।
आपके मामले में, अपने कोड आम तौर पर भोजन पर काम करना चाहिए, फिर भी एक आम Food
पूर्वज समझ में आता है। हालांकि, एक बेहतर अवधारणा एक IFood
इंटरफेस शुरू किया जा सकता है, प्रभावी रूप से वास्तविक विरासत से खाना अनुबंध decoupling पदानुक्रम। उदाहरण के लिए, एक सार्थक पदानुक्रम एक Animal
वर्ग के साथ शुरू हो सकता है, लेकिन हर पशु भोजन (अस्वीकरण: इस किसी न किसी उदाहरण है) माना जाता है।
जो कुछ भी चलता है उसे एशिया में भोजन माना जा सकता है (: पी, कोई अपराध नहीं) –
- 1. क्या खाली कक्षा घोषित करना बुरा है?
- 2. क्या कक्षा में वर्चुअल डेटा सदस्य हो सकते हैं?
- 3. कक्षा सदस्य प्रारंभिकरण के रूप में संदर्भ
- 4. क्या कक्षा में हार्डकोड सेटिंग्स के लिए यह बुरा है?
- 5. क्या कक्षा के सदस्य के रूप में std :: thread होने का कोई सुरक्षित तरीका है?
- 6. कक्षा के बिना सी # में अकेले खड़े हो सकते हैं?
- 7. कोटलिन में खाली कक्षा का उद्देश्य क्या है?
- 8. PHP में कक्षा क्या है?
- 9. कक्षा के दूसरे वर्ग में
- 10. कक्षा :: डीबीआई का भविष्य क्या है?
- 11. क्या आप एक कक्षा में दो कक्षाएं बढ़ा सकते हैं?
- 12. PHP में कक्षा क्या है?
- 13. क्या वीबी 6 कक्षा में विनाशक है?
- 14. सर्वश्रेष्ठ अभ्यास: पहचानकर्ता के रूप में कक्षा या डेटा विशेषता
- 15. वर्ग निकाय में कक्षा का पायथन नाम
- 16. संपत्ति के रूप में कक्षा संदर्भ
- 17. कक्षा में @param का क्या अर्थ है?
- 18. जावा में कक्षा के हस्ताक्षरकर्ता क्या हैं?
- 19. जावा में कक्षा का आविष्कार क्या है?
- 20. कक्षा सदस्य
- 21. क्या कक्षा के सदस्य के रूप में ब्लॉक को परिभाषित करना संभव है?
- 22. कक्षा के सदस्य
- 23. परीक्षण के तहत कक्षा में नकली कक्षा
- 24. यूएमएल: कक्षा आरेख में आंतरिक कक्षा
- 25. जावा में कक्षा शाब्दिक क्या है?
- 26. डी में कक्षा मॉनिटर क्या है?
- 27. क्या सी ++ कक्षा में खुद को सदस्य के रूप में शामिल किया जा सकता है?
- 28. कक्षा डिजाइन सवाल वर्ग के सदस्य कंटेनर
- 29. जावा में स्ट्रक्चर खराब अभ्यास के रूप में कक्षा का उपयोग क्यों कर रहा है?
- 30. कक्षा के नाम में "+" होने के बाद?
यही मतलब कर सकते हैं। इस तथ्य के बाद कक्षा पदानुक्रम बदलना निर्भर कोड पर एक तोड़ने वाला परिवर्तन हो सकता है। – usr