जब जिम्मेदारी साझा की जाती है तो एकल जिम्मेदारी कैसे प्रबंधित करें?


10

मेरे पास दो वर्ग हैं, Operationऔर Trigger। प्रत्येक में कई उपवर्ग होते हैं जो कुछ प्रकार के संचालन या ट्रिगर में विशेषज्ञ होते हैं। A Triggerविशिष्ट को ट्रिगर कर सकता है Operation। जबकि Operationएक विशिष्ट द्वारा ट्रिगर किया जा सकता है Trigger

मुझे उस कोड को लिखने की ज़रूरत है जो किसी दिए Operationगए Trigger(या इसके विपरीत) मैप करता है , लेकिन मुझे यकीन नहीं है कि इसे कहां रखा जाए।

इस मामले में कोड स्पष्ट रूप से एक वर्ग या अन्य वर्ग से संबंधित नहीं है। इसलिए एकल-जिम्मेदारी सिद्धांत के संदर्भ में मुझे यकीन नहीं है कि कोड कहां होना चाहिए।

मैं तीन विकल्प देख सकता हूं जो सभी काम करेंगे। जबकि 1 और 2 केवल शब्दार्थ का विकल्प प्रतीत होते हैं, 3 पूरी तरह से एक अलग दृष्टिकोण का प्रतिनिधित्व करता है।

  1. ट्रिगर पर, उदा bool Triggers(Operation o)
  2. ऑपरेशन पर, उदाहरण के लिए bool TriggeredBy(Trigger t)
  3. एक पूरी तरह से नए वर्ग में, जो मानचित्रण का प्रबंधन करता है, जैसे bool MappingExists(Trigger t, Operation o)

मुझे यह कैसे तय करना चाहिए कि एकल जिम्मेदारी सिद्धांत के संबंध में साझा मैपिंग कोड को कहां रखा जाए?

जब जिम्मेदारी साझा की जाती है तो एकल जिम्मेदारी कैसे प्रबंधित करें?


संपादित करें 1।

तो वास्तविक कोड इस तरह दिखता है। सभी गुण हैं, या तो एक string, Guid, collection<string>, या enum। वे मूल रूप से केवल डेटा के छोटे टुकड़ों का प्रतिनिधित्व करते हैं।

यहां छवि विवरण दर्ज करें

संपादित करें २।

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


क्यों बूल टाइप?
ट्यूलेंस कोर्डोवा

@ user61852 कॉलिंग कोड
जेम्स वुड

1
बुलियन के साथ कॉलिंग कोड क्या करता है? इस प्रश्न का उत्तर देने पर कि आपके पास इसका समाधान हो सकता है।
ट्यूलेंस कोर्डोवा

@ user61852, कृपया मेरे संपादन देखें।
जेम्स वुड

1
तो यह वास्तव में ऑपरेशन के ट्रिगर को क्रियान्वित करने के साथ कुछ नहीं करना है?
ट्यूलेंस कोर्डोवा

जवाबों:


4

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

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

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

उम्मीद है की यह मदद करेगा। यद्यपि प्रतिक्रिया उपयोगकर्ता 61852 के समान है, तर्क अलग है। नतीजतन, कार्यान्वयन अलग-अलग होगा (यानी बराबरी के ओवरराइड करने के बजाय स्पष्ट तरीके हैं, इसलिए तरीकों की संख्या समय के साथ जरूरतों के आधार पर विकसित हो सकती है)।


5

वहाँ किया गया था कि।

विकल्प # 3।

मुझे नहीं पता कि आप किस भाषा का उपयोग कर रहे हैं, लेकिन मैं एक छद्म कोड का उपयोग करूंगा जो कि जावा के लिए बहुत सीमिलर है। यदि आपकी भाषा C # है तो आपके पास संभवतः समान इंटरफेस और संरचनाएं हैं।

मानचित्रण वर्ग या इंटरफ़ेस रखें:

public interface Mapping {
    public void setObject1(Object o);
    public void setObject2(Object o);
    public Object getObjecto1();
    public Object getObjecto2();
}
  • इतने संग्रह की equals()विधि को ओवरराइड कर सकते हैं कि क्या वे दिए गए मैपिंग में शामिल हैं।MappingMapping
  • विशिष्ट वस्तुओं में विशेष equals()तरीके भी होने चाहिए ।
  • इंटरफ़ेस को भी लागू करें Comparable, ताकि आप रिपोर्ट को सॉर्ट कर सकें।

उन्हें आप बस एक संग्रह में एक मैपिंग डाल सकते हैं

List<Mapping> list = new ArrayList<Mapping>();
Hat hat = new Hat();
Bag bag = new Bag();
list.add(new Mapping(hat,bag));

बाद में आप पूछ सकते हैं:

// let's say you have a variable named x which is of type Mapping

if ( list.contains(x) ){
    // do some thing
}

0
  1. अपने कोड को छोटे-छोटे टुकड़ों में विभाजित करें।

वर्तमान में आपके पास क्लास ए के बारे में जानने के लिए क्लास ए है और क्लास ए के बारे में जानने के लिए क्लास ए।

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

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

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


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