5

स्मार्ट ऑब्जेक्ट से मैं किसी भी डोमेन ऑब्जेक्ट पर विचार करता हूं जो संपत्ति को बदलते समय इसकी मूल संपत्ति मान जानता है। स्मार्ट ऑब्जेक्ट्स में आमतौर पर बेस क्लास होता है और GetPropertyValue/SetPropertyValue विधियों का उपयोग कर गुणों को लागू करता है। दूसरी तरफ पीओसीओ ऑब्जेक्ट्स में आमतौर पर कोई बेस क्लास नहीं होगी और सरल गुण लागू होंगे।डोमेन ऑब्जेक्ट्स - "स्मार्ट ऑब्जेक्ट" बनाम पीओसीओ

public class SmartObject : BaseDomainObject 
{ 
    public int id 
    { 
     get { return (int)this.GetPropertyValue("Id"); } 
     set { this.SetPropertyValue("Id", value); } 
    } 
} 

public class POCO 
{ 
    public int id { get; set; } 
} 

मुझे स्मार्ट ऑब्जेक्ट पसंद है क्योंकि यह मेरे लिए बहुत मेहनत करता है। मैं आसानी से उन सभी उपयोगी सुविधाओं BaseDomainObject करने के लिए अपने सभी व्युत्पन्न डोमेन कक्षाओं में जोड़ने और उन्हें हो सकता है:

  • आम गुण (क्रमांक, स्थिति ...) की तरह
  • वस्तु राज्य ट्रैकिंग (नई, संशोधित, नहीं बदला गया)
  • सभी गुण गुण परिवर्तन पर घटनाओं (INotifyProperyChanged के कार्यान्वयन) जुटाने
  • व्युत्पन्न वर्ग किया जा सकता स्वचालित रूप से serializable
  • मैं यह सब अन्य ऐसे व्यवहार को उपयोगी हो सकता है हो सकता है (हालांकि मैं शायद ही कभी इस उपयोगी पाते हैं) - क्लोन/सिंक/IsPropertyDirty ...

दूसरी तरफ पीओसीओ बहुत सरल हैं और किसी भी बेस क्लास के लिए कोई निर्भरता नहीं है।

आजकल मैं यहाँ POCO का एक बहुत की तारीफ है क्योंकि:

  1. यह (आमतौर पर JSON के रूप में वेब ब्राउज़र के लिए) तार पर भेजा जा सकता
  2. यह शुद्ध

दूसरी ओर है हाथ मुझे लगता है कि उपरोक्त कारणों में कमी आई है क्योंकि:

  1. डीटीओ वायर ट्रांसफर के लिए हैं और डोमेन ऑब्जेक्ट्स नहीं हैं। जब डोमेन ऑब्जेक्ट JSON को क्रमबद्ध किया जाता है तो व्यवहार खोने पर व्यवहार encapsulating।
  2. शुद्धता सीमों के लिए यह पीछा भी अधिक एनीमिक डोमेन मॉडल के लिए पीछा करना है जिसमें तर्क नहीं है और न ही इससे जुड़ा कुछ भी स्मार्ट है।

इस सब दुखद के साथ, मुझे अभी भी वह पॉको पसंद है और यह मुझे खराब करता है। आप की राय क्या है?

+2

आप एक अमीर डोमेन मॉडल के लिए प्रयास कर रहे हैं, तो हैं, यह अपवित्र नहीं है तकनीकी बुनियादी ढांचे की चिंताओं के साथ। आपके द्वारा उल्लिखित सभी चीजें - राज्य ट्रैकिंग, संपत्ति ने घटनाओं को बदल दिया, क्रमबद्धता - इन चीजों में से कोई भी डोमेन के साथ कुछ भी नहीं करना है। वे मॉडल में व्यापार डोमेन की जटिलता को एन्कोड करने के लिए कुछ भी नहीं करते हैं। – MattDavey

+0

दूसरी ओर, एक POCO भी मॉडल में डोमेन जटिलता एन्कोड करने के लिए कुछ नहीं करता है। तो डीडीडी मानकों से, दोनों दृष्टिकोण बहुत खराब हैं। – MattDavey

+1

@MattDavey मैं आपकी पहली टिप्पणी से सहमत हूं लेकिन मुझे बाद वाले के बारे में निश्चित नहीं है। पोको! = एनीमिक, अगर आप यही कह रहे हैं। सादा पुराना ऑब्जेक्ट ओरिएंटेड * क्या व्यवहार शामिल है, और यदि लागू हो, तो डोमेन व्यवहार, डेटा के अतिरिक्त। – guillaume31

उत्तर

4
  • सामान्य गुणों

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

स्थिति, और अधिक बहस का मुद्दा है कि आप द्वारा क्या मतलब है कि यह वास्तव में अपने उद्देश्य यह है कि यह गैर POCO बनाता में अतिरिक्त जिम्मेदारी का परिचय हो सकता है पर निर्भर करता है।

अधिकांश अन्य गुण आप मुझे लगता है कि बाहरी वस्तुओं, न कि डोमेन वस्तु अपने आप में संभाला जाना चाहिए का उल्लेख है।

  • वस्तु राज्य ट्रैकिंग (नई, संशोधित, अपरिवर्तित)

बेहतर होगा कि आपके डोमेन वस्तुओं के परिवर्तन ट्रैकिंग-विशिष्ट प्रॉक्सी के लिए इस संभाल (यह आम तौर पर है ORMs क्या करना)।

  • सभी गुण गुण परिवर्तन पर घटनाओं (INotifyProperyChanged के कार्यान्वयन)

मैं देख रहा हूँ बढ़ा कि के रूप में ज्यादातर यूआई से संबंधित सामान है कि आपके डोमेन वस्तुओं अपनी प्रस्तुति वस्तुओं में नहीं बल्कि चला जाता है। आप शायद अपनी संस्थाओं में प्रत्येक संपत्ति को देखने योग्य नहीं देखना चाहेंगे - कुल मिलाकर परिवर्तनों को सिग्नल करने के लिए, डोमेन ईवेंट का उपयोग करें।

  • मैं यह सब अन्य ऐसे व्यवहार को उपयोगी हो सकता है हो सकता है - क्लोन/सिंक/IsPropertyDirty ...

क्लोन आम तौर पर बिना उन्हें विचार किया जा रहा मूल्य वस्तुओं की एक बुनियादी व्यवहार हो सकता है गैर Pocos। क्लोनिंग इकाइयां आपके कभी-कभी डोमेन विशिष्ट आवश्यकता को छोड़कर मेरे लिए कम उपयोगी लगती हैं। सिंक/IsPropertyDirty फिर से संस्करण/परिवर्तन ट्रैकिंग की तरह लगता है और एक विशेष वस्तु को सौंप दिया जाना चाहिए।

और भी अधिक कमजोर डोमेन मॉडल है जो तर्क और न ही कुछ स्मार्ट इसे से जुड़ी नहीं है के लिए पीछा की तरह पवित्रता तेजी के लिए इस लक्ष्य का पीछा।

समस्या यहां "संलग्न" के बारे में है। ऐसा नहीं है कि SRP अनुरूप वस्तुओं स्मार्ट नहीं हैं, बल्कि यह है कि वे कुछ भी स्मार्ट शामिल नहीं हैं कि नहीं उनके प्राकृतिक जिम्मेदारी इसमें नहीं है। इसी तरह, POCO के बेवकूफ नहीं हैं, वे सिर्फ वस्तुओं है कि बाहरी स्रोतों से व्यवहार के साथ प्रत्यारोपित नहीं किया गया है (3 डी पक्ष के पुस्तकालयों, ढांचा extenstions ...)

+1

+1 "आप शायद अपनी संस्थाओं में हर संपत्ति को देखने योग्य नहीं दिखाना चाहते हैं - कुल मिलाकर परिवर्तनों को सिग्नल करने के लिए, इसके बजाय डोमेन ईवेंट का उपयोग करें।" – MattDavey

+0

मुझे विशेष रूप से यह पसंद है कि ** "संलग्न" ** कैसे समस्या स्वयं प्रकट हुई। – Vukoje

+0

इसके अलावा मुझे लगता है कि एमएसआईएल पीढ़ी के साथ, क्लोनिंग जैसी चीजें आसानी से अन्य घटकों को सौंपी जा सकती हैं, बिना किसी वस्तु के डेटा को संग्रहीत करने के तरीके को बदलने के लिए। जैसे [EmitMapper] (http://emitmapper.codeplex.com/)। मैं यह भी मानता हूं कि ऑब्जेक्ट के अंदर राज्य ट्रैकिंग परेशानी पैदा करती है लेकिन मुझे ओआरएम राज्य ट्रैकिंग पर पूर्ण निर्भरता भी पसंद नहीं है क्योंकि इसे आमतौर पर कुछ चरम तकनीकों की आवश्यकता होती है। लेकिन सौभाग्य से आईडी संपत्ति जो नई वस्तुओं के लिए 0 है, एक लॉग रास्ता है। – Vukoje

1

मैं मॉडल के अंदर पीओसीओ के साथ रहूंगा क्योंकि उन "स्मार्ट ऑब्जेक्ट्स" इतनी जटिलता पेश करते हैं। आदर्श होना चाहिए क्योंकि यह केवल व्यावसायिक तर्क लेता है, उपयोगी हो सकता है। विशेष रूप से तकनीकी एक ...

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