2012-03-07 15 views
24

मैं एक ऐसा एप्लिकेशन बना रहा हूं जो कस्टम डेटा के लिए Enum एस का भारी उपयोग करता है। अनिवार्य रूप से, किसी ऑब्जेक्ट को डेटाबेस में 28 अलग-अलग विशेषताओं के साथ संग्रहीत किया जाता है। प्रत्येक विशेषता एक दो-वर्ण फ़ील्ड है जिसका अनुवाद एसक्यूएल से सीधे Enum तक किया जाता है।Enums खतरनाक के लिए कस्टम विशेषताएँ हैं?

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

ऐसा करने के लिए, मैंने दो कस्टम विशेषताओं को स्थापित किया है और उन्हें आवश्यक होने पर Enum पर लागू किया है। उदाहरण के लिए:

कस्टम विशेषता इंटरफ़ेस

public interface IAttribute<T> 
{ 
    T Value { get; } 
} 

उदाहरण कस्टम विशेषता

public sealed class AbbreviationAttribute: Attribute, IAttribute<string> 
{ 
    private readonly string value; 

    public AbbreviationAttribute(string value) 
    { 
     this.value = value; 
    } 

    public string Value 
    { 
     get { return this.value; } 
    } 
} 

कस्टम पुन: प्राप्त करने के लिए से Enum

public static R GetAttributeValue<T, R>(IConvertible @enum) 
{ 
    R attributeValue = default(R); 

    if (@enum != null) 
    { 
     FieldInfo fi = @enum.GetType().GetField(@enum.ToString()); 

     if (fi != null) 
     { 
      T[] attributes = fi.GetCustomAttributes(typeof(T), false) as T[]; 

      if (attributes != null && attributes.Length > 0) 
      { 
       IAttribute<R> attribute = attributes[0] as IAttribute<R>; 

       if (attribute != null) 
       { 
        attributeValue = attribute.Value; 
       } 
      } 
     } 
    } 

    return attributeValue; 
} 
गुण विधि

उदाहरण Enum यह पैटर्न

public enum Download 
{ 
    [Abbreviation("check")] 
    [Description("Certified")] 
    C = 1, 

    [Abbreviation("no-formal")] 
    [Description("No formal certification")] 
    NF = 2, 

    [Abbreviation("cert-prob")] 
    [Description("Certified with potential problems")] 
    CP = 3 
} 

दोनों Abbreviation और Description का उपयोग करते हुए कस्टम विशेषताओं कि IAttribute<T> को लागू कर रहे हैं। मेरे वास्तविक Enum में 11 संभावित मान हैं, और जैसा कि मैंने पहले बताया है कि यह मेरे कस्टम ऑब्जेक्ट में 28 अलग-अलग गुणों में उपयोग किया जाता है। कस्टम विशेषताओं का उपयोग करना इस जानकारी को आगे और आगे मैप करने का सबसे अच्छा तरीका प्रतीत होता है।

अब सवाल के लिए, यह करने के लिए यह सबसे अच्छा तरीका है? मैं डेटाबेस में Enum मान ("सी", "एनएफ", या "सीपी" ऊपर स्निपेट में) स्टोर करता हूं, लेकिन मुझे अपने कोड में संक्षेप और विवरण के मानों की आवश्यकता है। साथ ही, मुझे संदेह है कि यह कस्टम विशेषताओं का अंतिम सेट होगा जो मुझे चाहिए।

इससे पहले कि मैं इस पैटर्न के साथ आगे बढ़ता हूं ... क्या यह चीजों को करने का सही तरीका है? मैं बाद में ट्रैक और रिफैक्टर को ट्रैक करने के बजाय अब इस दृष्टिकोण के साथ संभावित समस्याओं को ठीक करना चाहता हूं।

+2

मैं कुछ स्थानीयकरण मुद्दों को देख सकता था क्योंकि यह – asawyer

+0

अच्छा बिंदु है। हालांकि, मैं 'gettext' शैली स्थानीयकरण सेटअप का समर्थन करने के लिए शायद 'IAttribute' को संशोधित कर सकता हूं। मैं स्केलेबिलिटी, प्रदर्शन और सर्वोत्तम प्रथाओं के बारे में अधिक चिंतित हूं जिनके बारे में मुझे पता नहीं हो सकता है। – EAMann

+0

'GetAttributeValue' पिछले विवरण टेक्स्ट के विपरीत एक एक्सटेंशन विधि नहीं है। –

उत्तर

13

यह वही विधि है जिसका मैं उपयोग करता हूं। एक नकारात्मक पक्ष serialization है। कस्टम विशेषता मान serialize नहीं है।

मैं डेटाबेस पद्धति पर कस्टम विशेषता विधि की तरह है क्योंकि यह बजाय एक लुकअप तालिका या वर्ग, आदि का उपयोग करने के

+1

दूसरा नकारात्मक पक्ष यह है कि यदि आप किसी वर्ण को – eouw0o83hf

+1

@ eouw0o83hf: true के रूप में कभी भी बदलते हैं, तो आपको एप्लिकेशन को पूरी तरह से पुन: नियोजित करना होगा। हालिया परिनियोजन विकल्पों (उर्फ क्लिकऑन) द्वारा कम किया गया, लेकिन आप सही हैं। मेरे अधिकांश ऐप्स वेब या चीजें हैं जो तैनाती चक्रों के बीच लंबी अवधि के साथ होते हैं जहां कई अन्य चीजें बदलने जा रही हैं, इसलिए कुछ विवरण अपडेट करना कोई बड़ा सौदा नहीं है। –

1

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

गुणों के बारे में खतरनाक बात यह है कि यदि इनमें से किसी भी तार को कभी भी बदलना है, तो यह ऐप का पूर्ण पुनर्वितरण है। यदि आप उन्हें डेटाबेस मान बनाते हैं, तो आप उन्हें एक सरल UPDATE के साथ बदल सकते हैं।

2

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

class SpecialType { 
    // include the fields and all attributes that you need to reference, ToString method for debugging, and any serialization you need 
    public string foo { get; set; } 
    public string bar { get; set; } 
    public ToString() { return "SpecialType with foo '" + foo + "' and bar '" + bar + "'"; } 
} 

Dictionary<int, SpecialType> myDict = new Dictionary<int, SpecialType> { 
    { 1, new SpecialType { foo = "XA1B2", bar = "XC3D4" } }, 
    { 2, new SpecialType { foo = "ZA1B2", bar = "ZC3D4" } }, 
    { 3, new SpecialType { foo = "YA1B2", bar = "YC3D4" } }, 
} 

तो मैं आसानी से स्मृति को बचाने का पता लगाना है, तो एक विशेष मान शब्दकोश की कुंजी, सभी कि जाज में अस्तित्व के लिए जाँच के द्वारा मान्य था करने के लिए अपने अन्य वर्गों में ints रख सकता है। यदि आप अंततः WPF का उपयोग करने या डिस्क पर पढ़ने/लिखने के लिए जा रहे हैं तो यह डेटाबेसिंग करना बहुत आसान होगा।

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