2013-08-15 5 views
8
public class Basket 
{ 
    private int _unitCount; 

    public int UnitCount 
    { 
     get { return _unitCount; } 
     set 
     { 
      _unitCount = Math.Max(0, value); 
      OnUnitCountChanged(new EventArgs()); 
     } 
    } 

    public event EventHandler UnitCountChanged; 
    public event EventHandler Depleted; 

    protected virtual void OnUnitCountChanged(EventArgs args) 
    { 
     var handler = UnitCountChanged; 
     if(handler!=null) { handler(this, args); } 
     if(_unitCount == 0) { OnDepleted(new EventArgs()); } 
    } 

    protected virtual void OnDepleted(EventArgs args) 
    { 
     var handler = UnitCountChanged; 
     if(handler!=null) { handler(this, args); } 
    } 
} 

वहाँ समाप्त हो गया के लिए शर्तों की जाँच और UnitCountChanged घटना के भीतर यदि आवश्यक हो तो है कि घटना को ऊपर उठाने के साथ एक समस्या है, या मैं दोनों UnitCount सेटर में करना चाहिए (और कहीं और एक गैर तुच्छ उदाहरण में)?क्या यह किसी अन्य घटना के भीतर से किसी ईवेंट को बढ़ाने के लिए सुगंधित है?

+1

यदि यह निर्धारित करने के लिए कि एक आइटम 'OnUnitCountChanged' घटना से समाप्त हो गया है गैर तुच्छ है, मैं करूंगा तर्क दें कि 'ऑनडेटेड' ईवेंट अनावश्यक है। – Matthew

+0

तकनीकी रूप से सच है, लेकिन मैं उन स्थानों की संख्या को कम करना चाहता था जिनमें मुझे उस सटीक कोड को लिखना होगा, यानी: अपूर्ण वस्तु को इसके कंटेनर से हटा देना, यूआई में प्रभाव प्रस्तुत करना आदि। लेकिन मैं देखता हूं कि यह कितना प्यार करता है नीचे उदाहरण आपकी टिप्पणी को संकेत देगा। –

उत्तर

9

जबकि मैंने इसे देखा है, तो मैं इसके खिलाफ अनुशंसा करता हूं और आपके UnitCount सेटर की तरह होने वाली विधियों में ईवेंट को बढ़ाऊंगा। चूंकि आपके पास virtual एक्सेस संशोधक कीवर्ड है, इसलिए कोई व्यक्ति विधि को ओवरराइड कर सकता है और यदि वे मूल ऑब्जेक्ट को कॉल नहीं करते हैं तो यह अपेक्षित काम नहीं करेगा।

मैं अपने कोड का उपयोग करने के लिए इसे और अधिक जटिल बनाने का प्रशंसक नहीं हूं।

6

ऐसे कई बार होते हैं जब यह उपयोगी हो सकता है (उदाहरण के लिए, यदि आप बेस क्लास का विस्तार कर रहे हैं और घटनाओं को बढ़ाने वाले तरीकों को ओवरराइड करने की क्षमता नहीं है), लेकिन सामान्य रूप से, मैं इसके खिलाफ अनुशंसा करता हूं ।

इस मामले में, मैं इसे UnitCount सेटर में दोनों घटनाओं को बढ़ाने के लिए बेहतर है कहेंगे:

public int UnitCount 
{ 
    get { return _unitCount; } 
    set 
    { 
     _unitCount = value; 
     OnUnitCountChanged(new EventArgs()); 
     if(_unitCount == 0) { OnDepleted(new EventArgs()); } 
    } 
} 
संबंधित मुद्दे