क्या डोमेन इकाई एकल जिम्मेदारी सिद्धांत का उल्लंघन कर रही है?


14

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

एरिक इवान की डीडीडी पुस्तक, पृ। 93:

Entities की सबसे बुनियादी जिम्मेदारी निरंतरता स्थापित करना है ताकि व्यवहार स्पष्ट और अनुमानित हो सके। वे यह सबसे अच्छा करते हैं अगर उन्हें अतिरिक्त रखा जाए। विशेषताओं या यहां तक ​​कि व्यवहार पर ध्यान केंद्रित करने के बजाय, एंटिटी ऑब्जेक्ट की परिभाषा को सबसे आंतरिक विशेषताओं तक नीचे ले जाएं, विशेष रूप से वे जो इसे पहचानते हैं या आमतौर पर इसे खोजने या मिलान करने के लिए उपयोग किया जाता है। केवल उस व्यवहार को जोड़ें जो उस व्यवहार के लिए आवश्यक अवधारणा और विशेषताओं के लिए आवश्यक है।

इसके अलावा, कोर एंटिटी से जुड़ी अन्य वस्तुओं में व्यवहार और विशेषताओं को हटाने के लिए देखें। पहचान के मुद्दों के अलावा, एंटिटीज उन वस्तुओं के संचालन का समन्वय करके अपनी जिम्मेदारियों को पूरा करते हैं।

1।

... सबसे आंतरिक विशेषताओं के लिए ईएनटीिटी ऑब्जेक्ट की परिभाषा को पट्टी करें, विशेष रूप से जो इसे पहचानते हैं या आमतौर पर इसे खोजने या मैच करने के लिए उपयोग किया जाता है। केवल वही व्यवहार जोड़ें जो अवधारणा के लिए आवश्यक है ...

एक बार जब किसी संस्था को एक विशिष्ट आईडी दी जाती है , तो उसकी पहचान स्थापित हो जाती है और इसलिए मुझे लगता है कि ऐसी इकाई को अपनी पहचान बनाए रखने या स्वयं की पहचान करने में मदद करने के लिए किसी व्यवहार की आवश्यकता नहीं है । इस प्रकार, मुझे समझ में नहीं आ रहा है कि लेखक " व्यवहार (जो कि अवधारणा के लिए आवश्यक है ) के साथ (इसके अलावा findऔर match संचालन ) किस तरह का व्यवहार कर रहा है ?"

2।

... सबसे आंतरिक विशेषताओं के लिए ईएनटीिटी ऑब्जेक्ट की परिभाषा को पट्टी करें, विशेष रूप से जो इसे पहचानते हैं या आमतौर पर इसे खोजने या मैच करने के लिए उपयोग किया जाता है। ... इसके अलावा, मुख्य ईएनटीआईटी से जुड़ी अन्य वस्तुओं में व्यवहार और विशेषताओं को हटाने के लिए देखें।

तो कोई भी व्यवहार जो इकाई की पहचान करने में मदद नहीं करता है, लेकिन हम उस व्यवहार को उस इकाई की आंतरिक विशेषता के रूप में चित्रित करेंगे (यानी भौंकना कुत्तों के लिए आंतरिक है, उड़ना हवाई जहाज के लिए आंतरिक है, अंडे देना पक्षियों के लिए आंतरिक है ..) ।), उस इकाई से जुड़ी अन्य वस्तुओं में डाल दिया जाना चाहिए (उदाहरण: हमें एक कुत्ते इकाई से जुड़ी वस्तु में भौंकने वाला व्यवहार करना चाहिए)?

3।

इसके अलावा, कोर ENTITY से जुड़ी अन्य वस्तुओं में व्यवहार और विशेषताओं को हटाने के लिए देखें।

क) क्रमशः MyEntityजिम्मेदारियों A_respऔर B_respवस्तुओं को सौंपता है aऔर b

हालांकि के सबसे A_respऔर B_respकाम द्वारा किया जाता है aऔर bउदाहरणों, ग्राहकों को अभी भी सेवा कर रहे हैं A_respऔर B_respके माध्यम से MyEntity, जिसका मतलब है कि ग्राहक के नजरिए से दो जिम्मेदारियों से संबंध रखते हैं MyEntity। इस प्रकार, इसका मतलब MyEntityयह भी नहीं है कि जिम्मेदारियां भी हैं A_respऔर एसआरपीB_resp का उल्लंघन हो रहा है ?

ख) यहां तक कि अगर हम मान लेते हैं कि A_respऔर B_respसे संबंधित नहीं है MyEntity, MyEntityअभी भी एक जिम्मेदारी है AB_respवस्तुओं के संचालन के समन्वय की aऔर bएसआरपी काMyEntity उल्लंघन नहीं करता है क्योंकि कम से कम इसकी दो ज़िम्मेदारियाँ हैं - विशिष्ट रूप से स्वयं की पहचान करना और भी ?AB_resp

class MyEntity
{
    private A a = ...
    private B b = ...


    public A GetA()
    { ... }

    public B GetB()
    { ... }

    /* coordinates operations of objects a and b */
    public int AworkB()
    { ... }
}

/* A encapsulates a single responsibility resp_A*/
/* A is value object */
class A
{ ... }

/* B encapsulates a single responsibility resp_B*/
/* B is value object */
class B
{ ... }

अपडेट करें:

1।

इस संदर्भ में व्यवहार शब्दार्थ व्यवहार का उल्लेख है। उदाहरण के लिए, एक वर्ग पर एक संपत्ति (यानी एक डोमेन ऑब्जेक्ट पर विशेषता) जो विशिष्ट रूप से पहचानने के लिए उपयोग की जाती है, उसका व्यवहार होता है। जबकि यह सीधे कोड में दर्शाया नहीं गया है। अपेक्षित व्यवहार यह है कि उस संपत्ति के लिए कोई डुप्लिकेट मान नहीं होगा।

इसलिए कोड में हमें वास्तव में एक व्यवहार (यानी एक ऑपरेशन) को लागू करने की आवश्यकता नहीं होगी जो किसी भी तरह इकाई की पहचान बनाए रखेगा, क्योंकि जब तक आप इस तरह के व्यवहार को केवल एक डोमेन मॉडल में एक अवधारणा के रूप में मौजूद हैं (आईडी विशेषता के रूप में मौजूद हैं) एक इकाई), लेकिन जब हम इस आईडी विशेषता का कोड में अनुवाद करते हैं, तो इसके शब्दार्थ का एक हिस्सा खो जाता है (यानी वह हिस्सा जो यह सुनिश्चित करता है कि आईडी मान अद्वितीय है खो गया है)?

2।

फर्थमोर, एक संपत्ति जैसे कि आयु का एक व्यक्ति इकाई के बाहर कोई संदर्भ नहीं है, और इस तरह, एक अलग वस्तु में स्थानांतरित करने के लिए कोई मतलब नहीं है ... हालांकि यह जानकारी आसानी से एक अलग स्थान में संग्रहीत की जा सकती है जो अद्वितीय पहचानकर्ता, इसलिए व्यवहार के लिए भ्रामक संदर्भ। आयु एक आलसी भरी हुई कीमत हो सकती है।

a) यदि Ageसंपत्ति आलसी है, तो हम इसे एक व्यवहार कह सकते हैं, भले ही शब्दार्थ Ageसिर्फ एक विशेषता है?

3।

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

हालांकि मैं मानता हूं कि हम Ageअलग-अलग ऑब्जेक्ट में जाने से संदर्भ खो देंगे , अगर हम DateOfBirthएक अलग ऑब्जेक्ट में संपत्ति स्थानांतरित करते हैं , तो संदर्भ खो नहीं जाएगा , लेकिन हम आमतौर पर इसे स्थानांतरित नहीं करते हैं।

क्या मुख्य कारण है कि हम Addressकिसी अन्य वस्तु में चले जाएँगे, लेकिन नहीं DateOfBirth? क्योंकि इकाई के DateOfBirthलिए अधिक आंतरिक है Personया क्योंकि कम संभावनाएं हैं कि भविष्य में कहीं हमें परिचालन के लिए विशिष्ट परिभाषित करने की आवश्यकता हो सकती है DateOfBirth?

4. मैं कहना होगा मैं अभी भी नहीं पता कि MyEntityयह भी है A_respऔर B_respजिम्मेदारियों और क्यों MyEntityभी होने AB_respका उल्लंघन नहीं माना जाता है SRP

EULERFX

1)

लेखक जिन व्यवहारों की बात कर रहा है, वे इकाई से जुड़े व्यवहार हैं। ये ऐसे व्यवहार हैं जो इकाई की स्थिति को संशोधित करते हैं

a) यदि मैं आपको सही तरीके से समझता हूं, तो आप कह रहे हैं कि इकाई में केवल उन व्यवहारों को शामिल करना चाहिए जो इसकी विशेषताओं (अर्थात इसकी स्थिति ) को संशोधित करते हैं ?

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

2)

जहां तक ​​अन्य वस्तुओं के साथ व्यवहार करने की बात है, लेखक विशेष रूप से मूल्य वस्तुओं का उल्लेख कर रहा है।

हालाँकि मेरे उद्धरण में इसे शामिल नहीं किया गया है, लेकिन लेखक उसी पैराग्राफ में उल्लेख करता है कि कुछ मामलों में व्यवहार (और विशेषताएँ ) अन्य संस्थाओं में भी स्थानांतरित हो जाएंगे (हालांकि मैं वीओ के व्यवहार को समझने के लाभों को समझता हूं )

3) यह मानते हुए MyEntity(प्रश्न देखें 3. अपने मूल पोस्ट में) SRP का उल्लंघन नहीं है, हम कहते हैं कि एक करता जिम्मेदारी की MyEntityअन्य बातों के भी शामिल में से एक है:

ए। A_resp + B_resp + AB_resp ( AB_respनिर्देशांक वस्तुओं aऔर b)

या

ख। AB_resp + प्रतिनिधि A_respऔर B_respवस्तुओं ( aऔर b) के साथ जुड़े MyEntity?

4) एरिक इवान की डीडीडी पुस्तक, स्नातकोत्तर। 94:

CustomerID ग्राहक ENTITY (आंकड़ा 5.5) का एक और एकमात्र पहचानकर्ता है, लेकिन ग्राहक को खोजने या मिलान करने के लिए अक्सर फ़ोन नंबर और पते का उपयोग किया जाएगा। नाम किसी व्यक्ति की पहचान को परिभाषित नहीं करता है, लेकिन अक्सर इसे निर्धारित करने के साधन के हिस्से के रूप में उपयोग किया जाता है।

इस उदाहरण में, फ़ोन और पता विशेषताएँ ग्राहक में चली गईं, लेकिन एक वास्तविक परियोजना पर, यह विकल्प इस बात पर निर्भर करेगा कि डोमेन के ग्राहक आमतौर पर कैसे मेल खाते हैं या प्रतिष्ठित हैं। उदाहरण के लिए, यदि किसी ग्राहक के पास विभिन्न उद्देश्यों के लिए कई संपर्क फोन नंबर हैं, तो फोन नंबर पहचान से जुड़ा नहीं है और उसे बिक्री संपर्क के साथ रहना चाहिए।

ए)

CustomerID ग्राहक ENTITY (आंकड़ा 5.5) का एक और एकमात्र पहचानकर्ता है, लेकिन ग्राहक को खोजने या मिलान करने के लिए अक्सर फ़ोन नंबर और पते का उपयोग किया जाएगा। नाम किसी व्यक्ति की पहचान को परिभाषित नहीं करता है, लेकिन अक्सर इसे निर्धारित करने के साधन के हिस्से के रूप में उपयोग किया जाता है।

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

ख) लेकिन अन्य विशेषताओं को कैसे / कहां स्थानांतरित किया जाना चाहिए ? उदाहरण के लिए (यहाँ धारणा यह है कि पता लगाने या मिलान करने के लिए पता विशेषता का उपयोग नहीं किया जाता है Customerऔर इस प्रकार हम पता विशेषता को बाहर ले जाना चाहते हैं Customer):

यदि हमारे पास Customer.Address(प्रकार का string) होने के बजाय , हम Customer.Addressप्रकार की संपत्ति बनाते हैं Address, तो क्या हमने पते की विशेषता को संबद्ध VO ऑब्जेक्ट (जो प्रकार का है Address) में स्थानांतरित किया है या हम कहेंगे कि Customerअभी भी पता विशेषता शामिल है ?

सी)

इस उदाहरण में, फ़ोन और पता विशेषताएँ ग्राहक में चली गईं, लेकिन एक वास्तविक परियोजना पर, यह विकल्प इस बात पर निर्भर करेगा कि डोमेन के ग्राहक आमतौर पर कैसे मेल खाते हैं या प्रतिष्ठित हैं। उदाहरण के लिए, यदि किसी ग्राहक के पास विभिन्न उद्देश्यों के लिए कई संपर्क फोन नंबर हैं, तो फोन नंबर पहचान से जुड़ा नहीं है और उसे बिक्री संपर्क के साथ रहना चाहिए।

क्या यहाँ लेखक गलत नहीं है, क्योंकि यदि हम कई कॉन्टेक्ट फ़ोन नंबरों में से प्रत्येक को मानते हैं जो Customerकेवल उस विशेष से संबंधित हैं Customer, तो मैं कहूंगा कि ये फ़ोन नंबरों की पहचान के साथ जुड़े हुए हैं जब Customerकेवल एक फोन नंबर था। ?

5)

लेखक द्वारा इकाई को छीनने का कारण यह बताया गया है कि जब कोई प्रारंभ में ग्राहक इकाई बनाता है, तो उसे किसी भी विशेषता के साथ आबाद करने की प्रवृत्ति होती है जिसे कोई ग्राहक के साथ जुड़ा होने के बारे में सोच सकता है। यह एक डेटा-केंद्रित दृष्टिकोण है जो अंत में एनीमिक डोमेन मॉडल के लिए व्यवहार को अनदेखा करता है।

विषय से बाहर, लेकिन मुझे लगा कि एनीमिक डोमेन मॉडल एक इकाई से बाहर व्यवहार करने से परिणाम देता है , जबकि आपका उदाहरण एक इकाई को बहुत सारी विशेषताओं के साथ आबाद कर रहा है , जिसके परिणामस्वरूप बहुत अधिक व्यवहार होगा (क्योंकि हम शायद उन व्यवहारों में भी शामिल होंगे जो इन अतिरिक्त विशेषताओं को संशोधित करें ) और इस तरह एसआरपी का उल्लंघन?CustomerCustomer

धन्यवाद


2
मैं अत्यधिक रॉबर्ट रॉबर्ट्स क्लीन कोड वीडियो श्रृंखला, cleancoders.com की अत्यधिक सिफारिश करूंगा। वह इस बात पर बहुत विस्तार से बताता है कि विभिन्न सिद्धांत या तो समस्याओं का कारण बन सकते हैं या एक-दूसरे को संतुलित कर सकते हैं। अन्यथा मुझे लगता है कि आपके उदाहरण के लिए फॉर्मूला का हिस्सा उस समय को देखना होगा जब व्यक्ति वस्तु से संबंधित है। यदि खरीद की तरह इसका संक्षिप्त समय है, तो खरीद के लिए उपयोग किया जाने वाला बिलिंग पता इसका हिस्सा होगा और अपरिवर्तनीय होगा। यदि इसकी लाइब्रेरी खाते के लिए है तो पता बदलने में सक्षम होना चाहिए।
कार्टाल

2
मुझे लगता है कि यह सवाल एसआरपी का उल्लंघन हो सकता है ...;)
इंटेलीडाटा

जवाबों:


7

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

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

तो आपके सवाल का जवाब देने के लिए। नहीं, यह एकल उत्तरदायित्व सिद्धांत का उल्लंघन नहीं करता है। यह स्पष्ट रूप से कहा जाता है कि एक व्यक्ति के पास केवल व्यक्ति सामान होना चाहिए, न कि पता जैसी कोई चीज, जो अधिक जटिल है और किसी व्यक्ति से संबंधित है, उसे अपनी इकाई के रूप में मौजूद होना चाहिए।

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

अपडेट: 1) ज्यादातर मामलों में यह पहचान सत्यापन किसी वस्तु को डेटा स्टोर में सहेजने पर किया जाता है। जिसका अर्थ है कि इकाई सत्यापन का प्रतिनिधित्व करने वाला कोड मौजूद है, लेकिन यह कहीं और मौजूद है। यह आमतौर पर उस कोड के साथ मौजूद होता है जो पहचान मूल्य जारी करने के लिए जिम्मेदार होता है। यही कारण है कि मैं बताता हूं कि इकाई के लिए कोड में सीधे विशिष्टता का प्रतिनिधित्व नहीं किया जाता है।

2) सही कथन यह होगा कि Ageएक विशेषता है जिसमें व्यवहार है। आपको इस तथ्य को प्रलेखित करने की आवश्यकता होगी कि आयु आलसी है ताकि एक डेवलपर उस संपत्ति का उपभोग कर उस संपत्ति का उपभोग करने के बारे में सटीक निर्णय ले सके।

3) DateOfBirthआमतौर पर एक अलग वस्तु है; एक तिथि वस्तु जो पहले से ही उस पर परिचालन पूर्वनिर्धारित है। कुछ भाषाओं में दिनांक ऑब्जेक्ट में पहले से ही एक संपूर्ण डोमेन मॉडल है जो उस पर परिभाषित है। उदाहरण के लिए c # में आप टाइमजोन को निर्दिष्ट कर सकते हैं, यदि तारीख UTC है, तो टाइमपास पाने के लिए तारीखों को जोड़ें और घटाएं। इसलिए आपके हिलने के बारे में धारणा DateOfBirthसही होगी।

4) अगर केवल एक चीज जो MyEntityडेलिगेशन और कोऑर्डिनेशन है तो यह एसआरपी का उल्लंघन नहीं करता है। इसकी एकल जिम्मेदारी प्रतिनिधि और समन्वय की है और इसे मुखौटा पैटर्न के रूप में संदर्भित किया जाता है


क्या आप मेरे द्वारा किए गए अपडेट को देख सकते हैं?
एडविरज

मेरा जवाब अपडेट किया गया
चार्ल्स लैम्बर्ट

4

बहुत अच्छा सवाल है। SRP को बहुत ही गहन रूप से नहीं लिया जाना चाहिए। एसआरपी के संबंध में पहचान / खोज इकाई की जिम्मेदारी नहीं है। कोई अन्य व्यक्ति इसे एक आईडी देने के लिए जिम्मेदार है (अर्थात् स्टोर) और इसे देखने के लिए (अर्थात् रिपॉजिटरी )।

एक इकाई का प्राथमिक उद्देश्य मॉडल द्वारा उजागर अवधारणाओं का प्रतिनिधित्व करना है। एक इकाई और एक मूल्य वस्तु के बीच एकमात्र अंतर यह है कि इकाई का अर्थ अपनी गैर-पहचान विशेषताओं से परे है। उदाहरण के लिए यदि कोई व्यक्ति अपना नाम बदलता है, तो वह अभी भी एक ही व्यक्ति है, बस एक अलग नाम के साथ।


2

टीएल; डीआर: आप यह सोच रहे हैं। हालाँकि, मुझे आपके साथ इसे खत्म करने में मज़ा आया। इतना बक-बक करो…।

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

नहीं, यह सही नहीं है। एक इकाई की एकल जिम्मेदारी निरंतरता है।

पहचान निरंतरता का एक आकस्मिक परिणाम है। एक अलग विचार के रूप में मॉडलिंग की पहचान एक प्रदर्शन अनुकूलन है।

यहाँ एक उदाहरण है: एक रेस्तरां संरक्षक देता है वैलेट को कार। एक घंटे बाद, एक रेस्तरां संरक्षक कार के लिए पूछता है। क्या वैलेट देना चाहिए?

यह कहना आसान है कि वैलेट को कार देनी चाहिए अगर संरक्षक "समान" है। लेकिन असल में उसका क्या अर्थ है? यह निर्धारित करने का सही तरीका "अब" संरक्षक के साथ शुरू करना है, और उस संरक्षक के इतिहास के माध्यम से पीछे की ओर देखना है कि क्या कार को वॉलेट में देना उस इतिहास का हिस्सा है या नहीं।

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

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

मॉडलिंग संस्थाओं के दौरान, हम एक अनुरूप अनुकूलन का उपयोग करते हैं। हम सभी संस्थाओं को आम जिम्मेदारियां देते हैं

  1. यह सुनिश्चित करना कि इतिहास की शुरुआत में वस्तु की स्थिति के लिए एक अपरिवर्तनीय पहचानकर्ता का असाइनमेंट शामिल है
  2. यह सुनिश्चित करना कि अगले राज्य में हमेशा पिछले राज्य के पहचानकर्ता की एक वफादार प्रतिलिपि शामिल है।

मैं यहां इकाई की दूसरी जिम्मेदारी का वर्णन नहीं कर रहा हूं; इकाई निरंतरता के लिए अभी भी जिम्मेदार है - यह सुनिश्चित करना कि इतिहास एक सुसंगत कथा है। पहचानकर्ता की ज़िम्मेदारियाँ केवल एक सबसेट हैं जो सभी संस्थाओं के लिए सामान्य हैं।

हमारे पास अभी तक विशिष्टता का कोई प्रवर्तन नहीं है। यह एक इकाई के भीतर संभव नहीं है, क्योंकि विशिष्टता को सभी संस्थाओं की स्थिति तक पहुंच की आवश्यकता होती है; जहाँ एक एकल इकाई की अपनी पहुँच होती है।

एक बार फिर, हर बार सभी पहचानकर्ताओं की जाँच करना व्यावहारिक नहीं है, इसलिए इसके बजाय हम अद्वितीय तरीके से संतुष्टि को पूरा करते हैं: अगले पहचानकर्ता को उत्पन्न करने वाले कोड को कभी नहीं दोहराना चाहिए।

अंत में, इसका मतलब है कि हम स्मृति में राज्य के दो अलग-अलग टुकड़ों के समतुल्यता का परीक्षण करके निरंतरता को सत्यापित कर सकते हैं, जिससे एसाइक्लिक ग्राफ को क्वेरी करने की बहुत सारी परेशानियों से बचा जा सके।

आपको लगता है कि परमाणु जिम्मेदारी सिद्धांत के साथ एकल जिम्मेदारी सिद्धांत (जो वास्तव में अच्छा विचार है) को भ्रमित किया गया है। एक जिम्मेदारी को छोटे, अधिक आसानी से प्रबंधित भागों में बंद करना SRP के साथ संगत है।


1

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

यदि पहचान स्थापित की जाती है, तो हाँ इकाई को पहचानने के लिए और कुछ नहीं चाहिए। लेखक जिन व्यवहारों की बात कर रहा है, वे इकाई से जुड़े व्यवहार हैं। ये ऐसे व्यवहार हैं जो इकाई की स्थिति को संशोधित करते हैं। उदाहरण के लिए, एक Customerइकाई का एक MakePreferredव्यवहार हो सकता है । लेखक द्वारा इकाई को छीनने का कारण यह बताया गया है कि जब कोई प्रारंभ में एक Customerइकाई बनाता है , तो उसे किसी भी विशेषता के साथ आबाद करने की प्रवृत्ति होती है जिसे कोई ग्राहक के साथ जुड़ा होने के बारे में सोच सकता है। यह एक डेटा-केंद्रित दृष्टिकोण है जो अंत में एनीमिक डोमेन मॉडल के लिए व्यवहार को अनदेखा करता है।

जहां तक ​​अन्य वस्तुओं के साथ व्यवहार करने की बात है, लेखक विशेष रूप से मूल्य वस्तुओं का उल्लेख कर रहा है। वीओ के व्यवहार को स्थानांतरित करने के लिए यह एक अच्छा विचार है क्योंकि वीओ आमतौर पर संस्थाओं की तुलना में "छोटे" होते हैं, जिससे अधिक ध्यान केंद्रित होता है। इसके अलावा, अपरिवर्तनीयता और संचालन को बंद करने जैसे पहलू कोड के बारे में तर्क को सरल बनाते हैं जबकि इसे और अधिक ठोस बनाते हैं ।

VOs के साथ मिलकर, एक इकाई एक प्रकार के लंगर के रूप में कार्य करती है जो विभिन्न VOs को समन्वित करती है जो इसके व्यवहार को लागू करती है।

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

दूसरी समस्या यह है कि, एक हद तक, एसआरपी एक गुणात्मक उपाय हो सकता है। कोई भी एकल जिम्मेदारी की परिभाषा के साथ आ सकता है जो कुछ वर्ग का उल्लंघन करता है। कोई कह सकता है कि इकाई की जिम्मेदारी उस इकाई के लिए आवश्यक व्यवहारों को लागू करना है। उस लिहाज से इसकी एक ही जिम्मेदारी है। इसके अलावा, जब कोई संस्था व्यवहार को VOs में प्रस्तुत करती है, तो वह SRP का उल्लंघन नहीं करती है। SRP इस तरह की रचना के लिए मना नहीं करता है। यह वस्तुओं को एक न्यूनतम न्यूनतम के बीच युग्मन को कम करने के लिए सावधानी बरतता है, इंटरफेस को यथासंभव नंगे रखें, आदि।

अपडेट करें

a) यदि मैं आपको सही तरीके से समझता हूं, तो आप कह रहे हैं कि इकाई में केवल उन व्यवहारों को शामिल करना चाहिए जो इसकी विशेषताओं (अर्थात इसकी स्थिति) को संशोधित करते हैं?

हां, हालांकि इसके कुछ अपवाद भी हैं ...

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

संस्थाओं के लिए कारखाने के तरीकों को शामिल करने के लिए स्वीकार्य है संस्थाओं के उदाहरणों को प्रभावी ढंग से बाल संस्थाएं होती हैं, लेकिन जहां ट्रैवर्सल के लिए ऑब्जेक्ट संदर्भ का उपयोग नहीं किया जाता है। इस मामले में, बाल इकाई को आवेदन सेवा द्वारा बनाए रखने की आवश्यकता है। एप्लिकेशन सेवा चाइल्ड इकाई के निर्माण के लिए मूल इकाई का उपयोग करती है।

3) MyEntity (प्रश्न 3. मेरी मूल पोस्ट में देखें) को मानने से SRP का उल्लंघन नहीं होता है, क्या हम कहेंगे कि MyEntity की एक जिम्मेदारी अन्य चीजों में भी शामिल है:

आप कार्यान्वयन के दृष्टिकोण से जिम्मेदारी देख रहे हैं। इसके बजाय, इकाई को जिम्मेदारियों के साथ एक ब्लैक बॉक्स के रूप में मानें। यह कैसे संभालती है जो आपके हित में नहीं है क्योंकि कोई बाहर से देख रहा है। वीओ या अन्य संस्थाओं के बीच जिम्मेदारियों का विभाजन एक कार्यान्वयन चिंता है।

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

अधिक विशेष रूप से, विशेषताएँ जो व्यवहार के लिए आवश्यक नहीं हैं और न ही देखने के लिए इकाई का हिस्सा नहीं होना चाहिए। क्यों परेशान? इसके अलावा, रीड-मॉडल पैटर्न की तरह कुछ के साथ , संस्थाओं को व्यवहार के लिए आवश्यक विशेषताओं से परे कुछ भी नहीं चाहिए।

अगर ग्राहक के पास होने के बजाय। एड्रेस (टाइप स्ट्रिंग के) हम एक प्रॉपर्टी बनाते हैं। टाइप एड्रेस के अनुसार, क्या हमने एड्रेस फीचर को एक संबद्ध VO ऑब्जेक्ट (जो टाइप एड्रेस का है) में स्थानांतरित किया है या हम कहेंगे कि ग्राहक के पास अभी भी एड्रेस है विशेषता?

हां, वास्तव में, स्ट्रिंग पते या एड्रेस VO पते के बीच कोई अंतर नहीं है।

क्या यहाँ लेखक गलत नहीं है, क्योंकि यदि हम ग्राहक के उस विशेष ग्राहक से जुड़े कई संपर्क फोन नंबरों में से प्रत्येक को मान लेते हैं, तो मैं कहूंगा कि ये फोन नंबर पहचान के साथ जुड़े हुए हैं, जब ग्राहक केवल था एक फोन नंबर?

मैं लेखक के इरादे पर 100% नहीं हूं, लेकिन मुझे लगता है कि वह सिर्फ यह बता रहा है कि इकाई की खोज की आवश्यकताएं कैसे बदल सकती हैं कि इकाई और उसके अनुरूप VO कैसे संरचनाएं हैं।

विषय से बाहर, लेकिन मैंने सोचा कि एनीमिक डोमेन मॉडल एक इकाई से बाहर व्यवहार करने से परिणाम देता है, जबकि आपका उदाहरण एक इकाई को बहुत सारी विशेषताओं के साथ आबाद कर रहा है, जिसके परिणामस्वरूप ग्राहक बहुत अधिक व्यवहार करेगा (क्योंकि हम शायद ग्राहक में भी शामिल होंगे। व्यवहार जो इन अतिरिक्त विशेषताओं को संशोधित करता है) और इस प्रकार एसआरपी का उल्लंघन?

बहुत सारी विशेषताओं का व्यवहार बहुत अधिक नहीं होता है। वास्तव में, यह आमतौर पर विपरीत का सुझाव देता है। गेटर्स और सेटर के साथ बहुत सारी विशेषताएँ, लेकिन कोई भी व्यवहार नहीं करता है।


मैंने एक अद्यतन किया
EdvRusj

-3

खैर, यह इस बात पर निर्भर करता है कि आप इसे कैसे देखना चाहते हैं।

एक और तरीका है: "क्या एकल जिम्मेदारी सिद्धांत डोमेन एंटिटी का उल्लंघन कर रहा है?"

दोनों दिशा-निर्देश हैं। सॉफ्टवेयर डिजाइन में कहीं भी "सिद्धांत" नहीं है। हालांकि, अच्छे डिजाइन और बुरे डिजाइन हैं। इन दोनों अवधारणाओं का उपयोग विभिन्न तरीकों से किया जा सकता है, ताकि एक अच्छा डिज़ाइन प्राप्त किया जा सके।


अस्पष्टीकृत डाउनवोट्स == एसआरपी फैनबॉयस
एच बोब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.