2009-01-28 12 views
8

सीएलआर/सी # कोड में कस्टम विशेषताओं के लिए कुछ अच्छे एप्लिकेशन क्या हैं जिन्हें आपने सुना या सुना है? मानक विशेषताओं के दिलचस्प नए उपयोग भी ठीक है!विशेषताएँ या एनोटेशन (सीएलआर या जावा) का कूल उपयोग?

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

उत्तर

12
  • postsharp, जो कोड (एओपी) इंजेक्ट करने के लिए विशेषताओं का उपयोग करता है?
  • [TypeDescriptionProvider] जो एक कस्टम क्रम संपत्ति मॉडल प्रदान करने के लिए इस्तेमाल किया जा सकता है - या तो पूरी तरह से अलग गुण, या शायद faster ones

और कुछ कोर जो कि अक्सर अनदेखी कर रहे हैं:

  • [TypeForwardedTo] - ले जाने के लिए इस्तेमाल किया
  • - सदस्यों को
पर सुरक्षा को स्वचालित रूप से लागू करने के लिए उपयोग किए जाने वाले असेंबली के बीच प्रकार
+0

डर्न, आपने मुझे इसे हराया! प्रिंसिपल प्रामिशन एट्रिब्यूट के लिए –

+0

+1 - मुझे विश्वास नहीं है कि मैंने इसे पहले मैन्युअल रूप से किया था। – Botz3000

8

कड़ाई से सी # नहीं होने पर, मुझे छात्र के असाइनमेंट को चिह्नित करने के लिए जावा एनोटेशन (= सी # विशेषताओं) का एक दिलचस्प उपयोग मिला है। प्रत्येक सेमेस्टर मैं छात्रों के लिए एक अंकन रोबोट प्रोग्राम करता हूं, और यह पता चला है कि किसी कारण से प्रथम वर्ष के छात्र निर्देशों का पालन करने में सक्षम नहीं हैं, जो निश्चित रूप से अंकन रोबोट को विफल करने का कारण बनता है। तो मैं उनके कोड के माध्यम से जाता हूं, उन सभी विधियों को ढूंढता हूं जो विनिर्देश को पूरा नहीं करते हैं और उन्हें ठीक करते हैं। फिर मैंने उन सभी विधियों पर एक एनोटेशन (= विशेषता) डाल दी जो गलत थे, उन्हें चिह्नित करने के लिए चिह्नित रोबोट को बताते हुए। ऐसा करने के लिए शायद यह सबसे सरल और सीधा तरीका है।

+0

प्रत्येक छात्र के कोड को मैन्युअल रूप से ठीक करने के लिए, हालांकि, सरल प्रतीत नहीं होता है? –

+0

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

1

मेरे पास एक मामला है, जहां मैं डेटा के रूप में इंटरफ़ेस के वास्तविक कार्यान्वयन को भी प्रस्तुत करना चाहता हूं। यह पाठ्यक्रम के प्रतिबिंब के माध्यम से किया जा सकता है, लेकिन सदस्यों पर एक विशिष्ट विशेषता का उपयोग करके मैं डेटा के रूप में खुलासा करना चाहता हूं, मैं ऐसा करने के लिए आवश्यक कार्य को समाहित कर सकता हूं।

अंतिम परिणाम यह है कि मैं अपना कार्यान्वयन करता हूं, वांछित सदस्यों को सजाने के लिए और फिर मैं प्रत्येक मामले में प्रतिबिंब कोड के बिना कोड और डेटा दोनों के माध्यम से सदस्यों से पूछताछ कर सकता हूं।

1

कभी-कभी, मैं वर्गों या विधियों को सजाने के लिए विशेषताओं का उपयोग करता हूं और 'जिम्मेदार' डेटा प्राप्त करने के लिए प्रतिबिंब का उपयोग करता हूं।

शायद समझाने में थोड़ा मुश्किल हो, लेकिन आखिरी चीज जिसके लिए मैंने विशेषताओं का उपयोग किया है, एक ऐसे सिस्टम में है जहां मेरे पास डेटाबेस में कुछ इकाइयां हैं।

प्रत्येक इकाई के पास कुछ प्रकार का 'कोड' होता है, और प्रत्येक इकाई में कुछ व्याख्या नियम भी हो सकते हैं।

मेरी परियोजना में, मेरे पास एक इकाई वर्ग है, जो डेटाबेस में मौजूद एक इकाई का प्रतिनिधित्व करता है, और मेरे पास 'नियम' वर्गों का एक सेट भी है। एक नियम वर्ग में किसी दिए गए इकाई की व्याख्या तर्क शामिल है।

मेरी इकाई के एक विशिष्ट उदाहरण के लिए एक निश्चित 'नियम' (व्याख्या) 'लिंक' करने के लिए, मैंने एक कस्टम विशेषता बनाई है।

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

कोड का एक छोटा सा बातें स्पष्ट करना:

public class MyEntity 
{ 
    public string Code 
    { 
     get; 
     private set; 
    } 

    public bool IsValidFor(...) 
    { 
     IRule rule = RuleRegistry.GetRuleFor(this); 

     if(rule.IsValid()) ... 
    } 

} 

[RuleAttrib("100")] 
public class MyRule : IRule 
{ 
    public bool IsValid() 
    { 
    } 
} 

यह सिर्फ एक छोटे से उदाहरण है, लेकिन मुझे लगता है कि आप बहाव को पकड़ने के लिए होगा।

MyRule क्लास पर नियम एट्रिब विशेषता, कहता है कि यह एक ऐसा नियम है जिसे MyClass के उदाहरण पर लागू किया जाना चाहिए जिसमें कोड "100" है।

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

जहाँ मैं प्रयोग किया जाता है गुण है, Postsharp के साथ संयोजन में में एक और उदाहरण, एक 'ताला' प्रणाली के कार्यान्वयन है: http://fgheysels.blogspot.com/2008/08/locking-system-with-aspect-oriented.html

+0

दिलचस्प विचार वहाँ –

1

हम कुछ तरीकों में से विशेष प्रयोजनों चिह्नित करने के लिए कस्टम जावा एनोटेशन का उपयोग, ज्यादातर लक्षित डेवलपर्स पर:

  • @ScriptingAPI - टी पर निशान तरीकों - कि हमारे पटकथा एपीआई के भाग के रूप सामने आ रहा है निशान कोड
  • @Transaction (डेवलपर्स कि परिवर्तनों को सार्वजनिक एपीआई को प्रभावित कर सकता चेतावनी दी है) वह डाटाबेस मुखौटा जो एक लेनदेन शुरू कर रहा है/शुरू कर रहा है (हमारे पास एक समर्पित लेनदेन हैंडलर क्लास है जो इस एनोटेशन का सम्मान करता है)
  • @NeedsAttentionToSupportFoo - अगर हम जानते हैं कि फीचर एक आवश्यकता है जिसे हमें निकट भविष्य में संबोधित करने की आवश्यकता होगी, हम कोड को चिह्नित करने के लिए एक एनोटेशन का उपयोग करें जिसे हमें इसका समर्थन करने के लिए स्पर्श करने की आवश्यकता होगी, यानी जब हम कोड के एक टुकड़े में आते हैं जो हमें सोचता है "आह, इसे फू का समर्थन करने के लिए बदला जाना होगा", हम इसे एनोटेट करते हैं। यदि फू के कार्यान्वयन को स्थगित कर दिया गया है या कभी नहीं होगा, तो कोड में चारों ओर बिखरे पूर्व-परिपक्व अनुकूलन को वापस करने के बजाय एनोटेशन को हटाना आसान है।

कस्टम एनोटेशन का एक और अच्छा उदाहरण उपयोग this java specialist newsletter में शामिल है: सभी उप वर्गों में सार्वजनिक नो-Args कन्स्ट्रक्टर को लागू करना।

3

xUnit देखें और देखें कि अपेक्षित व्यवहार के लिए यूनिट परीक्षणों के साथ-साथ परीक्षण डेटा को परीक्षण करने के लिए विशेषताओं का उपयोग कैसे किया जाता है। गुणों का उपयोग एमएसटीएस्ट या एनयूनीट की तुलना में अधिक सार्थक तरीके से किया जाता है।

Samples\TestMethodExtensibility\Example.cs से:

public class Example 
{ 
    static int val; 

    [RepeatTest(5, Timeout=250)] 
    public void RepeatingTestMethod() 
    { 
     Thread.Sleep(100); 
     Assert.Equal(2, 2); 

     if (val == 0) 
     { 
      val++; 
      Thread.Sleep(1000); 
     } 
    } 
} 

test.xunit.extensions\DataTheories\TheoryAttributeTests.cs से:

internal class TestMethodCommandClass 
{ 
    public static IEnumerable<object[]> EmptyData 
    { 
     get { return new object[0][]; } 
    } 

    public static IEnumerable<object[]> NullData 
    { 
     get { return null; } 
    } 

    public static IEnumerable<object[]> TheoryDataProperty 
    { 
     get { yield return new object[] { 2 }; } 
    } 

    [Theory, PropertyData("EmptyData")] 
    public void EmptyDataTheory() { } 

    [Theory, PropertyData("NullData")] 
    public void NullDataTheory() { } 

    [Theory, OleDbData(
     @"Provider=Microsoft.Jet.OleDb.4.0; Data Source=DataTheories\UnitTestData.xls; Extended Properties=Excel 8.0", 
     "SELECT x, y, z FROM Data")] 
    public void TestViaOleDb(double x, 
          string y, 
          string z) { } 

    [Theory, PropertyData("TheoryDataProperty")] 
    public void TestViaProperty(int x) { } 

    [Theory, ExcelData(@"DataTheories\UnitTestData.xls", "SELECT x, y, z FROM Data")] 
    public void TestViaXls(double x, 
          string y, 
          string z) { } 

} 

जानकारी के लिए देखें:

http://www.codeplex.com/xunit

+0

आह हाँ, यही वह है जो मैं एनोटेशन के सबसे उचित उपयोगों में से एक मानता हूं। –

2

निश्चित रूप से nunit

+०१२३५१६४१०

गुणों के उपयोग को केंट बेक द्वारा समर्थित किया गया है:

NUnit 2.0 बेवकूफ डिजाइन का एक उत्कृष्ट उदाहरण है। अधिकांश लोग जो पोर्ट xUnit को केवल स्मॉलटाक या जावा संस्करण का अनुवादित करते हैं। हमने पहले भी न्यूटिट के साथ ऐसा किया था। यह नया संस्करण न्यूटिट है क्योंकि यह किया गया होगा सी # में शुरू होने के साथ किया गया था।

स्रोत: http://www.nunit.org/

1

महल के ActiveRecord विशेषताओं का उपयोग करता। यह आपके मॉडल ऑब्जेक्ट्स को सजाने वाले गुणों के साथ NHibernate की कुछ सेट-अप जटिलता को छुपाता है जो कक्षाओं और फ़ील्ड को इंगित करता है जो डेटाबेस (और कैसे) पर बने रहना चाहिए। ActiveRecord में मॉडल-आधारित सत्यापन और Monorail स्टैक जोड़ने के लिए सत्यापन घटक के भीतर विशेषताओं का भी उपयोग किया जाता है।

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