फूला हुआ डोमेन ऑब्जेक्ट से परहेज


12

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

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

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

तो हमारे पास विकल्प हैं:

  1. ट्रेड क्लास में प्रोसेसिंग लॉजिक लगाएं। प्रसंस्करण तर्क अब व्यापार के प्रकार के आधार पर बहुरूपी है, लेकिन ट्रेड क्लास में अब कई जिम्मेदारियां (मूल्य निर्धारण, जोखिम, आदि) हैं और बड़ी है
  2. TradePricingService जैसे अन्य वर्ग में प्रसंस्करण तर्क रखें। ट्रेड इनहेरिटेंस ट्री के साथ अब पॉलिमॉर्फिक नहीं है, लेकिन कक्षाएं छोटी और परीक्षण करने में आसान हैं।

सुझाया दृष्टिकोण क्या होगा?


कोई समस्या नहीं - मुझे प्रवास स्वीकार करने में खुशी हो रही है!

1
रिवर्स से सावधान रहें: martinfowler.com/bliki/AnemicDomainModel.html
TrueWill

1
"वर्ग का आकार तेजी से बढ़ने वाला है क्योंकि अधिक सुविधाएँ जोड़ी जाती हैं" - किसी भी प्रोग्रामर को इस तरह "घातीय" शब्द का दुरुपयोग करने से बेहतर पता होना चाहिए।
माइकल बोर्गवर्ड 12

@Piskvor कि सिर्फ बेवकूफ है
आर्निस Lapsa

@ अर्निस एल .: अपनी विचारशील टिप्पणी के लिए धन्यवाद। ध्यान दें कि यह था, "मेरी टिप्पणी thence के साथ, stackoverflow.com से 22 नवंबर 22:19 पर प्रवासित"। मैंने अब अपनी टिप्पणी हटा दी है कि "यह प्रोग्रामर पर बेहतर होगा। ईएस"; अब, क्या आपके पास जोड़ने के लिए कुछ है, या केवल वही विचार है जिसे आप व्यक्त करना चाहते थे?
पिस्कोर ने इमारत का निर्माण

जवाबों:


8

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

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

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


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

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

4

आपका प्रश्न निश्चित रूप से मुझे रणनीति पैटर्न के बारे में सोचता है । फिर आप विभिन्न ट्रेडिंग / मूल्य रणनीतियों में स्वैप कर सकते हैं, जो आप कॉल कर रहे हैं उसी के समान TradePricingService

मुझे निश्चित रूप से लगता है कि आपको यहां मिलने वाली सलाह विरासत के बजाय रचना का उपयोग करना है।


2

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

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

interface IPriceCalculator {
  double getPrice(ITrader t);
}
interface ITrader {
  IPriceCalculator getPriceCalculator();
}
class Tracer implements ITrader {
  private IPriceCalculator myPriceCalculator = null;
  IPriceCalculator getPriceCalculator() {
    if (myPriceCalculator == null)
      myPriceCalculator = PriceCalculatorFactory.get(this);
    return myPriceCalculator;
  }
}

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

मैं आमतौर पर एडेप्टर कक्षाओं को रखने की कोशिश करता हूं - उदाहरण के लिए उप-उप-वर्ग IPriceCalculator- स्टेटलेस। यानी इन वर्गों में यदि संभव हो तो कोई भी स्थानीय डेटा नहीं होना चाहिए, जिससे उत्पन्न होने वाले उदाहरणों की संख्या को कम किया जा सके। तो मैं आमतौर पर सभी तरीकों में एक तर्क के रूप में मुख्य रूप से अनुकूलित वस्तु प्रदान करता हूं - जैसे getPrice(ITrader)ऊपर।


2

आपके डोमेन के बारे में बहुत कुछ नहीं कह सकता, लेकिन

हमारे पास एक केंद्रीय डोमेन वर्ग है जो हमारे अधिकांश कामों का ध्यान केंद्रित करता है - एक व्यापार।

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.