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


63

आज मेरी किसी से बहस हो गई थी।

मैं एनीमिक डोमेन मॉडल के विपरीत एक समृद्ध डोमेन मॉडल होने के लाभों की व्याख्या कर रहा था। और मैंने एक साधारण वर्ग की तरह अपनी बात का प्रदर्शन किया:

public class Employee
{
    public Employee(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastname;
    }

    public string FirstName { get private set; }
    public string LastName { get; private set;}
    public int CountPaidDaysOffGranted { get; private set;}

    public void AddPaidDaysOffGranted(int numberOfdays)
    {
        // Do stuff
    }
}

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

मुझे यह दावा वास्तव में आश्चर्यजनक लगा, इस तर्क के बाद, किसी भी वर्ग के पास एक संपत्ति और एक विधि SRP का उल्लंघन करती है, और इसलिए सामान्य रूप से OOP SOLID नहीं है, और कार्यात्मक प्रोग्रामिंग स्वर्ग का एकमात्र तरीका है।

मैंने उसके कई तर्कों का जवाब नहीं देने का फैसला किया, लेकिन मैं उत्सुक हूं कि इस सवाल पर समुदाय क्या सोचता है।

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

आपने क्या कहा होगा?

अपडेट: उदाहरण को विधि को अधिक यथार्थवादी बनाने के लिए उदारता से अपडेट किया गया है और अंतर्निहित चर्चा पर ध्यान केंद्रित करने में हमारी मदद करता है।


19
यह वर्ग SRP का उल्लंघन करता है, क्योंकि यह तर्क के साथ डेटा को मिलाता है, लेकिन क्योंकि इसमें कम सामंजस्य है - संभावित ईश्वर वस्तु
gnat

1
क्या उद्देश्य कर्मचारी को छुट्टियां जोड़ रहा है? शायद एक कैलेंडर क्लास या ऐसा कुछ होना चाहिए जिसमें छुट्टियां हों। मुझे लगता है कि आपका दोस्त सही है।
जेम्स ब्लैक

9
कभी भी किसी ऐसे व्यक्ति की न सुनें जो कहता है कि "मैं एक्स में विश्वास करता हूं"।
स्टिग

29
यह बहुत ज्यादा नहीं है कि यह एसआरपी का उल्लंघन है या नहीं क्योंकि यह बिल्कुल अच्छा मॉडलिंग है। मान लीजिए मैं एक कर्मचारी हूं। जब मैं अपने प्रबंधक से पूछता हूं कि क्या यह उसके साथ ठीक है यदि मैं स्कीइंग करने के लिए एक लंबा सप्ताहांत लेता हूं, तो मेरा प्रबंधक मेरे लिए छुट्टियों को नहीं जोड़ता है । यहां कोड उस वास्तविकता से मेल नहीं खाता है जो इसे मॉडल करने का इरादा रखता है, और इसलिए संदिग्ध है।
एरिक लिपर्ट

2
कार्यात्मक प्रोग्रामिंग के लिए +1 स्वर्ग का एकमात्र तरीका है।
erip

जवाबों:


68

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

आपका सहकर्मी गलत चीज़ पर ध्यान केंद्रित कर रहा है। सवाल यह नहीं है कि "इस वर्ग के सदस्य क्या हैं?" लेकिन "इस वर्ग ने कार्यक्रम के भीतर क्या उपयोगी संचालन किया है?" एक बार यह समझ में आ जाने के बाद, आपका डोमेन मॉडल ठीक लग रहा है।


यदि ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग बनाई गई थी और इसका उद्देश्य वास्तविक जीवन की वस्तुओं और कक्षाओं (क्रियाओं + विशेषताओं) को मॉडल करना है तो कोड क्लास को कई जिम्मेदारियां (क्रियाएं) क्यों नहीं लिखनी चाहिए ? एक वास्तविक विश्व वस्तु में कई जिम्मेदारियां हो सकती हैं। उदाहरण के लिए एक पत्रकार समाचार पत्रों में संपादकीय लिखता है और एक टीवी कार्यक्रम में राजनेताओं का साक्षात्कार लेता है। एक वास्तविक जीवन वस्तु के लिए दो जिम्मेदारियां! अगर मैं एक क्लास जर्नलिस्ट लिखने जा रहा हूँ तो क्या होगा?
user1451111

41

सिंगल रिस्पांसिबिलिटी सिद्धांत केवल इस बात से संबंधित है कि कोड का एक टुकड़ा (ओओपी में, आमतौर पर हम कक्षाओं के बारे में बात कर रहे हैं) में कार्यक्षमता के एक टुकड़े पर जिम्मेदारी है । मुझे लगता है कि आपके मित्र ने कहा था कि फ़ंक्शंस और डेटा सह-मिलन वास्तव में उस विचार को समझ नहीं सकते थे। अगर उसे Employeeअपने कार्यस्थल के बारे में जानकारी होती है, तो उसकी कार कितनी तेजी से चलती है, और उसका कुत्ता किस प्रकार का भोजन करता है, तो हमें समस्या होगी।

चूंकि यह वर्ग केवल एक के साथ काम करता है Employee, मुझे लगता है कि यह कहना उचित है कि यह एसआरपी का स्पष्ट रूप से उल्लंघन नहीं करता है, लेकिन लोग हमेशा अपनी राय रखते हैं।

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


20

मेरे विचार से इस वर्ग के संभावित SRP का उल्लंघन करता है, तो यह दोनों एक प्रतिनिधित्व करने के लिए जारी रखा जा सकता था Employeeऔर EmployeeHolidays

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


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

1
@ निक्लाश सहमत। व्यक्तिगत रूप से मैं बेतरतीब ढंग से नहीं देखूंगा और कोशिश करूँगा और अनुमान
लगाऊंगा

4
सच। लेकिन क्या होगा अगर इसे इस नई प्रणाली में "अवकाश" नहीं कहा जाता है, लेकिन "अवकाश" या "खाली समय" है। लेकिन मैं सहमत हूं, इसके साथ आप आमतौर पर इसे खोजने की क्षमता रखते हैं, या सहकर्मी से पूछ सकते हैं। मेरी टिप्पणी मुख्य रूप से ओपी को मानसिक रूप से मॉडल बनाने के लिए प्राप्त करने के लिए थी और जहां तर्क के लिए सबसे स्पष्ट स्थान होगा :-)
निकल्स एच

मैं आपके पहले कथन से सहमत हूं। हालांकि, अगर यह सहकर्मी की समीक्षा करने के लिए आया था, तो मुझे नहीं लगता कि मैं क्योंकि SRP का उल्लंघन एक फिसलन ढलान है और यह कई टूटी हुई खिड़कियों में से पहला हो सकता है। चीयर्स।
जिम स्पीकर

20

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

SOLID, SRP और OCP में पहले दो अक्षर, दोनों इस बारे में हैं कि आवश्यकताओं में परिवर्तन के जवाब में आपका कोड कैसे बदलता है। SRP की मेरी पसंदीदा परिभाषा है: "एक मॉड्यूल / वर्ग / फ़ंक्शन को बदलने का केवल एक कारण होना चाहिए।" आपके कोड को बदलने के संभावित कारणों के बारे में तर्क देना इस बात पर बहस करने की तुलना में अधिक उत्पादक है कि आपका कोड SOLID है या नहीं।

आपके कर्मचारी वर्ग को बदलने के कितने कारण हैं? मुझे नहीं पता, क्योंकि मैं उस संदर्भ को नहीं जानता जिसमें आप इसका उपयोग कर रहे हैं, और मैं भविष्य को नहीं देख सकता। मैं जो कर सकता हूं वह पिछले दिनों मैंने जो देखा है, उसके आधार पर संभावित परिवर्तनों पर विचार-मंथन कर सकता है और आप संभावित रूप से यह बता सकते हैं कि वे कितने संभावित हैं। यदि "यथोचित संभावना" और "मेरा कोड पहले से ही उस सटीक कारण के लिए बदल गया है" के बीच एक से अधिक स्कोर हैं, तो आप उस तरह के बदलाव के खिलाफ एसआरपी का उल्लंघन कर रहे हैं। यहां एक है: दो से अधिक नामों वाला कोई व्यक्ति आपकी कंपनी में शामिल होता है (या एक वास्तुकार इस उत्कृष्ट W3C लेख को पढ़ता है )। यहां एक और है: आपकी कंपनी बदलती है कि वह छुट्टी के दिनों को कैसे आवंटित करती है।

ध्यान दें कि यदि आप AddHolidays विधि निकालते हैं, तो भी ये कारण समान रूप से मान्य हैं। एनीमिक डोमेन के बहुत सारे मॉडल एसआरपी का उल्लंघन करते हैं। उनमें से कई सिर्फ डेटाबेस-टेबल-इन-कोड हैं, और डेटाबेस टेबल के बदलने के लिए 20+ कारण होना बहुत आम है।

यहां कुछ चबाया जाना है: क्या आपके कर्मचारी वर्ग को कर्मचारी के वेतन को ट्रैक करने के लिए आवश्यक है, तो आपका कर्मचारी वर्ग बदल जाएगा? पतों? आपातकालीन संपर्क जानकारी? यदि आपने उनमें से दो को "हां" (और "होने की संभावना") कहा है, तो आपकी कक्षा एसआरपी का उल्लंघन कर रही होगी, भले ही उसमें कोई कोड न हो! SOLID प्रक्रियाओं और वास्तुकला के बारे में है जितना कि यह कोड के बारे में है।


9

वह वर्ग जो डेटा का प्रतिनिधित्व करता है वह कक्षा की जिम्मेदारी नहीं है, यह एक निजी कार्यान्वयन विवरण है।

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

कार्यान्वयन आंतरिक है; ऐसा होता है कि इसके लिए कुछ निजी चर और कुछ तर्क चाहिए। इसका मतलब यह नहीं है कि वर्ग में अब कई जिम्मेदारियां हैं।


दिलचस्प विचारधारा, साझा करने के लिए बहुत बहुत धन्यवाद
tobiak777

अच्छा - OOP के इच्छित लक्ष्यों को व्यक्त करने का अच्छा तरीका।
user949300

5

किसी भी तरह से तर्क और डेटा को मिलाने का विचार हमेशा गलत होता है, यह इतना हास्यास्पद है कि यह योग्यता चर्चा भी नहीं करता है। हालांकि, वास्तव में उदाहरण में एकल जिम्मेदारी का स्पष्ट उल्लंघन है, लेकिन ऐसा नहीं है क्योंकि एक संपत्ति DaysOfHolidaysऔर एक फ़ंक्शन है AddHolidays(int)

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


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

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

3

"मैं एसओएलआईडी में विश्वास करता हूं। आप एकल जिम्मेदारी सिद्धांत (एसआरपी) का उल्लंघन कर रहे हैं क्योंकि आप दोनों एक ही कक्षा में डेटा का प्रतिनिधित्व कर रहे हैं और तर्क का प्रदर्शन कर रहे हैं।"

दूसरों की तरह, मैं इससे असहमत हूं।

मैं कहूंगा कि SRP का उल्लंघन किया जाता है यदि आप कक्षा में एक से अधिक तर्क-वितर्क कर रहे हैं । यह जानने के लिए कि तर्क का एक टुकड़ा अप्रासंगिक है, कक्षा के भीतर कितना डेटा संग्रहीत किया जाना चाहिए।


नहीं! एसआरपी का कई प्रकार के तर्क, डेटा के कई टुकड़े या दोनों के किसी भी संयोजन से उल्लंघन नहीं होता है। केवल आवश्यकता यह है कि वस्तु अपने उद्देश्य से चिपके रहना चाहिए। इसका उद्देश्य संभावित रूप से कई ऑपरेशन कर सकता है।
मार्टिन मात

@MartinMaat: कई ऑपरेशन, हाँ। परिणामस्वरूप तर्क का एक टुकड़ा। मुझे लगता है कि हम एक ही बात कह रहे हैं, लेकिन अलग-अलग शब्दों के साथ (और मुझे यह मानकर खुशी है कि आप सही हैं क्योंकि मैं इस सामान का अक्सर अध्ययन नहीं करता हूं)
कक्षा में लाइटनेस दौड़

2

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

न्यूनतम दुख सिद्धांत: कोड को या तो परिवर्तन की आवश्यकता की अपनी संभावना को कम करना चाहिए या परिवर्तित होने में आसानी को अधिकतम करना चाहिए।

सो कैसे? एक रॉकेट वैज्ञानिक को यह पता लगाने के लिए नहीं लेना चाहिए कि यह रखरखाव की लागत को कम करने में मदद क्यों कर सकता है और उम्मीद है कि यह अंतहीन बहस का मुद्दा नहीं होना चाहिए, लेकिन सामान्य रूप से एसओएलआईडी के साथ, यह हर जगह नेत्रहीन रूप से लागू करने के लिए कुछ नहीं है। ट्रेड-ऑफ को संतुलित करते हुए इस पर विचार करना चाहिए।

परिवर्तन की आवश्यकता की संभावना के रूप में, इस के साथ नीचे चला जाता है:

  1. अच्छा परीक्षण (बेहतर विश्वसनीयता)।
  2. केवल कुछ विशिष्ट करने के लिए आवश्यक नंगे न्यूनतम कोड को शामिल करना (इसमें अभिवाही कपलिंग को कम करना शामिल हो सकता है)।
  3. बस यह क्या करता है पर कोड बदमाश बनाने (देखें बदमाश सिद्धांत)।

परिवर्तन करने में कठिनाई के लिए, यह अपक्षय युग्मों के साथ ऊपर जाता है। परीक्षण में आकर्षक कपलिंग का परिचय दिया गया है लेकिन यह विश्वसनीयता में सुधार करता है। अच्छी तरह से किया, यह आम तौर पर नुकसान की तुलना में अधिक अच्छा करता है और न्यूनतम शोक सिद्धांत द्वारा पूरी तरह से स्वीकार्य और प्रचारित होता है।

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

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

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

एसआरपी के दृष्टिकोण से एक वर्ग जो मुश्किल से कुछ करता है निश्चित रूप से केवल एक (कभी-कभी शून्य) कारणों को बदलना होगा:

class Float
{
public:
    explicit Float(float val);
    float get() const;
    void set(float new_val);
};

व्यावहारिक रूप से परिवर्तन का कोई कारण नहीं है! यह एसआरपी से बेहतर है। यह ZRP है!

सिवाय इसके कि मैं सुझाव दूंगा कि यह बदमाश सिद्धांत का उल्लंघन है। यह भी बिल्कुल बेकार है। जो कुछ बहुत कम करता है वह बदमाश होने की उम्मीद नहीं कर सकता है। इसकी बहुत कम जानकारी (TLI) है। और स्वाभाविक रूप से जब आपके पास कुछ ऐसा है जो टीएलआई है, तो यह वास्तव में कुछ भी सार्थक नहीं कर सकता है, न कि उस जानकारी के साथ भी जो इसे एनकैप्सुलेट करता है, इसलिए इसे बाहरी दुनिया में इस उम्मीद में लीक करना होगा कि कोई और वास्तव में कुछ सार्थक और बदमाश करेगा। और यह रिसाव उस चीज़ के लिए ठीक है जो केवल डेटा एकत्र करने के लिए है और इससे अधिक कुछ नहीं है, लेकिन यह सीमा वह अंतर है जैसा कि मैं "डेटा" और "ऑब्जेक्ट्स" के बीच देखता हूं।

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

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


1

इसके विपरीत, मेरे लिए एनीमिक डोमेन मॉडल कुछ ओओपी मुख्य अवधारणाओं (जो विशेषताओं और व्यवहार को एक साथ जोड़ते हैं) को तोड़ता है, लेकिन वास्तुशिल्प विकल्पों के आधार पर अपरिहार्य हो सकता है। एनीमिक डोमेन सोचना आसान है, कम जैविक और अधिक अनुक्रमिक।

कई सिस्टम ऐसा करते हैं जब कई परतों को एक ही डेटा (सर्विस लेयर, वेब लेयर, क्लाइंट लेयर, एजेंट्स ...) के साथ खेलना चाहिए।

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

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

आप आसानी से किसी भी ऑब्जेक्ट कॉन्सेप्ट / जिम्मेदारी के बारे में चिंता किए बिना "ऑब्जेक्ट" डेटा, या उनमें से कुछ या किसी अन्य फॉर्मेट (json) ... पर आसानी से अनुक्रमित / डिस्क्राइब कर सकते हैं। यह सिर्फ डेटा पासिंग है। आप हमेशा दो वर्गों (Employee, EmployeeVO, EmployeeStatistic…) के बीच डेटा मैपिंग कर सकते हैं लेकिन कर्मचारी का यहां वास्तव में क्या मतलब है?

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

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


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

मुझे नहीं लगता कि मेरे पास अमीर डोमेन ओओपी की गलत धारणा है, मैंने इस तरह से बहुत सारे सॉटवेयर तैयार किए हैं, और यह सच है कि यह रखरखाव / विकास के लिए वास्तव में अच्छा है। लेकिन मुझे यह बताने के लिए खेद है कि यह चांदी की गोली नहीं है।
विंस

मैं यह नहीं कह रहा हूँ। एक कंपाइलर लिखने के लिए यह संभवतः नहीं है, लेकिन व्यवसाय / सास अनुप्रयोगों के अधिकांश लाइन के लिए, मुझे लगता है कि यह आपके सुझाव के मुकाबले बहुत कम कला / विज्ञान है। डोमेन मॉडल की आवश्यकता को गणितीय रूप से सिद्ध किया जा सकता है, आपके उदाहरण मुझे OOP में सीमाओं के दोषों के बजाय बहस योग्य डिजाइनों के बारे में सोचते हैं
tobiak777

0

आप एकल जिम्मेदारी सिद्धांत (एसआरपी) का उल्लंघन कर रहे हैं क्योंकि आप दोनों एक ही कक्षा में डेटा का प्रतिनिधित्व कर रहे हैं और तर्क का प्रदर्शन कर रहे हैं।

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


0

आप सिंगल रिस्पांसिबिलिटी सिद्धांत का उल्लंघन नहीं कर सकते क्योंकि यह सिर्फ एक एस्थेटिक मानदंड है, न कि एक प्रकृति का नियम। वैज्ञानिक रूप से लगने वाले नाम और अपरकेस अक्षरों से गुमराह न हों।


1
यह शायद ही एक वास्तविक उत्तर है, लेकिन यह प्रश्न के लिए एक टिप्पणी के रूप में बहुत अच्छा होगा।
जे एलस्टन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.