2011-10-24 8 views
15

मैं अक्सर देखा है और संलग्न गुण इस तरह के एक प्रदर्शन नाम या विवरण प्रदान करने के रूप में कुछ बुनियादी काम करने के साथ enums उपयोग किया है:"अपरिवर्तनीय समृद्ध वस्तु के रूप में enum": क्या यह एक विरोधी पैटर्न है?

public enum Movement { 
    [DisplayName("Turned Right")] 
    TurnedRight, 
    [DisplayName("Turned Left")] 
    [Description("Execute 90 degree turn to the left")] 
    TurnedLeft, 
    // ... 
} 

और विस्तार के तरीकों का एक सेट विशेषताओं का समर्थन करने के लिए किया है:

public static string GetDisplayName(this Movement movement) { ... } 
public static Movement GetNextTurn(this Movement movement, ...) { ... } 

इस पैटर्न के बाद, अतिरिक्त मौजूदा या कस्टम विशेषताओं अन्य काम करने के लिए क्षेत्रों के लिए लागू किया जा सकता।

public class Movement 
{ 
    public int Value { get; set; } // i.e. the type backing the enum 
    public string DisplayName { get; set; } 
    public string Description { get; set; } 
    public Movement GetNextTurn(...) { ... } 
    // ... 
} 

इस तरह, यह कर सकते हैं "यात्रा" एक सरल रूप में: यह लगभग रूप में अगर enum सरल enumerated मान प्रकार यह है के रूप में और खेतों के एक नंबर के साथ एक अधिक समृद्ध अपरिवर्तनीय मूल्य वस्तु के रूप में काम कर सकते हैं है क्रमिकरण के दौरान क्षेत्र, जल्दी से तुलना की जानी चाहिए, आदि। फिर भी व्यवहार "आंतरिक" (अला ओओपी) हो सकता है।

उसने कहा, मुझे लगता है कि इसे एक विरोधी पैटर्न माना जा सकता है। पर मुझे का एक ही समय हिस्सा इस उपयोगी समझता है पर्याप्त विरोधी भी सख्त हो सकता है।

+4

क्या आप पूछ रहे हैं कि इस पैटर्न का उपयोग उन जगहों पर करने का बुरा विचार है जहां आप अन्यथा enum का उपयोग नहीं करेंगे? मेटा-डेटा को मूल्यों को समेकित करने के लिए यह एक महान पैटर्न है।कक्षाओं के प्रतिस्थापन के रूप में यह इतना अच्छा नहीं है। –

+0

इसे भाषा का "दुरुपयोग" माना जा सकता है; उदाहरण के लिए जरूरी नहीं होने पर लगभग हर समय 'गतिशील' का उपयोग करना। – Kit

+1

बिल्कुल बिंदु पर नहीं (इसलिए टिप्पणी), लेकिन मुझे उस मामले के लिए किसी विशेषता में प्रदर्शित होने के लिए एन्कोडिंग टेक्स्ट के बारे में गलतफहमी है - या किसी इकाई वर्ग के पास कहीं भी। एक बात के लिए, मुझे लगता है कि यह "चिंताओं का पृथक्करण" का उल्लंघन करता है और दूसरे के लिए, इसे स्थानीयकृत करने का कोई स्पष्ट तरीका नहीं है। हां, एमएस इस तरह की चीज को प्रोत्साहित करता है, इसलिए शायद मैं दोपहर के भोजन के लिए बाहर हूं। –

उत्तर

6

मैं इस पर विचार करेंगे सी # में एक गरीब पैटर्न होने के लिए बस क्योंकि घोषित करने और विशेषताओं तो अपंग है तक पहुँचने के लिए भाषा का समर्थन; वे बहुत अधिक डेटा के स्टोर होने के लिए नहीं हैं। गैर-तुच्छ मूल्यों के साथ गुण घोषित करना दर्द है, और यह एक विशेषता का मूल्य प्राप्त करने के लिए दर्द है। जैसे ही आप कुछ दूर से दिलचस्प (एक विधि है कि enum पर कुछ गणना करता है, या एक विशेषता है जो एक गैर आदिम डेटा प्रकार शामिल हैं) की तरह अपने enum से संबद्ध करना चाहते के रूप में आप या तो एक वर्ग के लिए यह refactor या में दूसरी बात यह डाल करने के लिए की जरूरत है कुछ ऑफ-बैंड जगह।

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

+0

यह मुश्किल नहीं, नहीं, का एक enum बनाम की * घोषणा * संदर्भ में अपरिवर्तनीय, अमीर वस्तु, और अमीर-enum के implementer के लिए दर्द नहीं होता, फिर क्या * उपयोग के बारे में *? यद्यपि * idiom * पर आपका बिंदु मेरे साथ अच्छी तरह से बैठता है। – Kit

+0

बेवकूफ कोड लिखने के बारे में अच्छा बिंदु। आप हमेशा उस कोड को लिखना चाहते हैं जो उस भाषा/ढांचे के साथ अच्छा खेलता है जिसमें वह रहता है। – FMM

5

मैं कहूंगा कि यह एक विरोधी पैटर्न है। यहाँ पर क्यों। के अपने मौजूदा enum ले (यहाँ संक्षिप्तता के लिए विशेषताएं अलग करना) करते हैं:

public enum Movement 
{ 
    TurnedRight, 
    TurnedLeft, 
    Stopped, 
    Started 
} 

अब मान लें कि जरूरत कुछ और भी अधिक सटीक होना करने के लिए फैलता है; कहते हैं, शीर्षक और/या वेग में परिवर्तन, अपने "छद्म वर्ग" में एक "क्षेत्र" मोड़ दो भागों में:

public sealed class Movement 
{ 
    double HeadingDelta { get; private set; } 
    double VelocityDelta { get; private set; } 
    // other methods here 
} 

तो, आप एक संहिताबद्ध enum अब है कि अपरिवर्तनीय वर्ग में तब्दील किया जा करने के लिए है क्योंकि अब आप दो ऑर्थोगोनल (लेकिन अभी भी अपरिवर्तनीय) गुणों को ट्रैक कर रहे हैं जो वास्तव में एक ही इंटरफ़ेस में एक साथ हैं। आपके "समृद्ध enum" के खिलाफ लिखे गए किसी भी कोड को अब गड़बड़ाना और पुन: कार्य करना होगा; जबकि, यदि आप इसे कक्षा के रूप में शुरू करेंगे, तो आपके पास कम काम करने की संभावना होगी।

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

कुछ और विचार करने के लिए भी। यदि वस्तु अपरिवर्तनीय है और एक struct बजाय एक class है, आप एक ही पास-दर-मूल्य अर्थ विज्ञान और क्रमबद्धता आकार में नगण्य मतभेद और आप enum के साथ होता है के रूप में वस्तु के क्रम आकार मिलता है।

+0

मैंने पहले इसमें भाग लिया है और अधिक सहमत नहीं हो सकता है। –

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