2009-08-26 14 views
9

मान लीजिए कि मैं ठेठ इकाई कारDDD: उपवर्गों और जड़ संस्थाओं

class Car : Entity 
{ 
    public double MaxSpeed { get; set; } 
    public Color Color { get; set; } 
    /* ... */ 
} 

इस इकाई करते हैं, मेरे डोमेन मॉडल में, जड़ एक सकल की इकाई होगा।

अब मान लें कि मैं कारों का विशेषज्ञ हूं। कंपनी इकाई

class Ferrari : Car 
{ 
    public string Nickname { get; set; } 
} 

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

class President : Person 
{ 
    public Ferrari Ferrari { get; set; } 
} 

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

क्या यह डीडीडी के संदर्भ में सही है? क्या मुझे रूट इकाइयों के विशेषज्ञता को समान योग की मूल संस्थाओं के रूप में स्वयं पर विचार करना चाहिए? मेरा मतलब है, मैंने जो डोमेन बताया है, वह इकाई फेरारी भी कार समेकित की मूल इकाई है (क्योंकि फेरारी भी एक कार है)?


अब मान लीजिए कि एक डाटाबेस को यह मॉडल लागू करने के लिए मेरे पास करते हैं। मुझे लगता है कि मेरा प्रश्न ओआर/एम ढांचे पर निर्भर नहीं है जिसका मैं उपयोग करूंगा।

मुझे कारों को रखने वाली तालिका को कैसे बनाना चाहिए? क्या मुझे "कारटाइप" कॉलम (संभावित मान: "कार", "फेरारी") के साथ एक एकल टेबल कार बनाना चाहिए, और एक निरर्थक उपनाम कॉलम?

या क्या मुझे कारों के लिए एक टेबल और फेरारिस के लिए एक टेबल बनाना चाहिए, बाद वाले व्यक्ति को पीके का कारों का एफके होना चाहिए?

धन्यवाद!

उत्तर

2

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

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

मैं किसी भी तरह से डीडीडी विशेषज्ञ नहीं हूं, और मैं कुछ अवधारणाओं (या कुछ अवधारणाओं की कई व्याख्याओं के साथ संघर्ष करने की तरह) के साथ संघर्ष कर रहा हूं। मुझे लगता है कि 100% शुद्ध कार्यान्वयन नहीं है, और यह कि मैंने जो कार्यान्वयन देखा है, उसके लिए बारीकियां हैं।

संपादित

मुझे लगता है कि मैं तुम क्या लिखा था का हिस्सा पढ़ने में भूलना अनुसरण करता है। मुझे लगता है कि उपनाम सभी वाहनों के लिए नहीं है, बल्कि केवल फेरारी: कार के लिए है। मुझे लगता है कि जवाब वास्तव में "यह निर्भर करता है"। आपके शेष मॉडल में आपके पास कितनी डोमेन विशेषज्ञता है? उपनाम होने के कारण फेरारी इकाइयों में प्रचलित हो सकता है, लेकिन क्या यह अनन्य है? यह न केवल वास्तविक डेटा, बल्कि आवश्यकताओं के बारे में है। असल में यह नीचे आता है कि इन संस्थाओं में आप कितनी विशेषज्ञता की उम्मीद कर रहे हैं।

+0

शानदार! धन्यवाद! दरअसल, मेरी "असली" प्रणाली में, "कारें" बहुत महत्वपूर्ण हैं, लेकिन "फेरारी" मेरे डोमेन में सबसे अधिक अपमानजनक चीज है, कि मैं ट्रैक को ढीला नहीं कर सकता, मुझे इसके आंकड़े करना चाहिए। –

4

आपको अपने डोमेन को मॉडल करने के लिए विरासत का उपयोग नहीं करना चाहिए क्योंकि मॉडल जटिल होने के बाद आप जल्द ही परेशानी में भाग लेंगे।

राष्ट्रपति केवल व्यक्ति की भूमिका है और व्यक्ति की कई भूमिकाएं हो सकती हैं। शायद राष्ट्रपति को केवल एक भूमिका मिली लेकिन गलत उदाहरण चुनकर यह केवल आकस्मिक है।

फेरारी को कार से विरासत में नहीं मिला जाना चाहिए। फेरारी उदाहरण पर यह स्पष्ट नहीं है, क्योंकि वे केवल एक प्रकार की कारें करते हैं लेकिन कंपनी को वैन, सेडान, हैचबैक, ट्रक आदि जैसे कई प्रकार के बनाने पर विचार करें। आप शायद हर प्रकार के वर्गों को कक्षा बनाना चाहते हैं जो कार वर्ग से प्राप्त होंगे। और फिर क्या ... क्या आप पांच टोयोटा कक्षाएं बनाने जा रहे हैं जो प्रत्येक प्रकार से उत्तराधिकारी होंगे? जैसे ...

Car -> Sedan -> ToyotaSedan 
Car -> Truck -> ToyotaTruck 
Car -> Hatchback -> ToyotaHatchback 

यह हास्यास्पद होगा।

अस्वीकरण: मुझे कारों के बारे में कुछ भी पता नहीं है। हालांकि ...

अपने डोमेन को मॉडल करने के लिए विरासत का उपयोग न करें। कभी।

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

+0

धन्यवाद, लुब्स।लेकिन इस मामले में, मेरे "वास्तविक" डोमेन में, मेरे पास * "कारें" हैं, और "जेनेरिक" कारें और 2 विशेष प्रकार की कारें हैं, "फेरारी" और "पोर्श" जिन्हें ट्रैक किया जाना चाहिए, हालांकि वे हैं अनिवार्य रूप से "कारें"। –

+3

अभी भी, विरासत से बचें। भले ही आप नहीं करते हैं, आपको एक या दो साल में रहना होगा क्योंकि भविष्य में नई मॉडल को पकड़ने के लिए आपका मॉडल अधिक जटिल हो जाएगा और विरासत आपके डिजाइन में बहुत दर्द का कारण बन जाएगी। बिल्ली और कुत्ते जैसे विरासत को समझाने के लिए पाठ्यपुस्तक उदाहरण दोनों पशु और मंडल और स्क्वायर दोनों हैं, आकार दोनों गलत प्रभाव दे रहे हैं वास्तव में विरासत क्या है और प्रोग्रामर अक्सर मॉडलिंग डोमेन के लिए इस शक्तिशाली अवधारणा का दुरुपयोग करते हैं। यहां और पढ़ें: http://www.geocities.com/tablizer/oopbad.htm#overeng (मैं लेखक नहीं हूं) –

+0

बहुत अच्छा लेख! धन्यवाद! –

3

आम तौर पर जब आप रूट समेकित सीमाओं को पार करते हैं तो आप केवल संदर्भ को अन्य रूट कुल के आईडी की अनुमति देते हैं। फिर आप उस आईडी का उपयोग अपने भंडार में अन्य कुल देखने के लिए करते हैं।

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

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

+0

आप अकेले हैं जिन्होंने वास्तव में प्रश्न का उत्तर दिया –

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