2017-02-14 8 views
5

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

चलो कहते हैं कि मैं दो घिरा संदर्भों करते हैं: Store और Invoicing

उनमें से प्रत्येक दो डोमेन इकाइयां हैं: स्टोर ईसा पूर्व यह FirstTimeCustomer और RecurrentCustomer है चालान ईसा पूर्व के लिए के लिए यह VatCustomer और NonVatCustomer

अब

, में है मेरी आधारभूत संरचना परत मैं चाहता हूं कि उन सभी को सामान्य UserId (यूयूआईडी) द्वारा संदर्भित करने में सक्षम होने के लिए समान (कम से कम आधार) तालिका में सहेजा जाए। मेरे लिए समस्या यह है कि, यह कैसे करें, इसलिए मैं अपने भंडार कार्यान्वयन में सिद्धांत स्वैपिंग का लाभ उठा सकता हूं।

मैं सिंगल टेबल विरासत या Class Table Inheritance कि समाधान हो सकता है के बारे में पढ़ा है, लेकिन:

मैं एक ही UUID की User के रूप में यह प्रत्येक संदर्भ में विभिन्न प्रकार था के साथ काम करने में सक्षम होना चाहिए।

मुझे स्टोर बीसी में $storeCustomerRepository->find(1); पर कुछ AbstractStoreCustomer उर्फ ​​FirstTimeCustomer या RecurrentCustomer वापस करने में सक्षम होना चाहिए।

और चालान ईसा पूर्व में $invoicingCustomerRepository->find(1); पर VatCustomer या NonVatCustomer उर्फ ​​कुछ AbstractInvoicingCustomer वापस जाने के लिए।

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

मैं भी Mapped Superclasses के बारे में पढ़ा है कि विकल्प की तरह भी दिखता है, लेकिन:

इसका मतलब यह है कि एक-से-अनेक संघों बिल्कुल एक मैप की गई सुपर क्लास पर संभव नहीं हैं।

और मैं Customer जरूरत आदेश के संबंध, कि दोनों संस्थाओं में उपलब्ध होना चाहिए करने के लिए (एक भी संभवतः नहीं यह उपलब्ध करना चाहते हैं नई ईसा पूर्व में User इकाई के कुछ नए प्रकार है)।

मैं निष्कर्ष पर आया कि मुझे संदेह होना चाहिए कि मुझे कुछ याद आ रहा है, है ना? मैं छोटे संदर्भ विशिष्टताओं में तोड़ने वाली ईश्वर इकाई को कैसे प्राप्त करूं?

+0

आपके मामले में 'उपयोगकर्ता' क्या है? क्या कोई शरीर प्रमाणित करता है? कुछ उपयोगकर्ता 'ग्राहक' बन जाएंगे? –

+0

हां, उपयोगकर्ता कोई भी है जो प्रमाणित करता है और कोई भी उपयोगकर्ता अन्य बीसी में ग्राहक (विशिष्ट प्रकार का) भी होता है। – Tom

उत्तर

5

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

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

कहा जा रहा है, अपने व्यापार के बारे में बात करते हैं। Authentication ईसा पूर्व में, Users हैं जो कुछ प्रमाण-पत्रों के साथ प्रमाणीकृत कर सकते हैं। Store ईसा पूर्व में Customers हैं जो चीजें खरीदते हैं। Invoice ईसा पूर्व में, Customers भी हैं लेकिन एक अलग मॉडल (यदि आप चाहें तो एक अलग वर्ग)। Shipping ईसा पूर्व में भी Customers हैं लेकिन फिर से, एक अलग मॉडल। ये Customer मॉडल बीसी के साथ कुछ गुण साझा करते हैं, जैसे name और id। इसलिए, आप वास्तविक जीवन से किसी व्यक्ति की पहचान करने के लिए id का उपयोग करते हैं लेकिन संदर्भ के आधार पर अपने व्यवहार को समाहित करने के लिए विभिन्न मॉडल का उपयोग करते हैं।

मुझे लगता है कि आप एक AbstractStoreCustomer नहीं होना चाहिए, आप केवल Customer है और अलग करने के लिए क्या, सार वर्ग/इंटरफ़ेस में उन्हें अंतर के साथ BuyingHistoryProfile 2 कार्यान्वयन FirstTimeCustomer और RecurrentCustomer की तरह कोशिश करनी चाहिए। इस वर्ग में प्रोफ़ाइल खरीदने के संबंध में केवल व्यवहार होना चाहिए और इसे Store ईसा पूर्व में प्रत्येक Customer द्वारा संदर्भित किया जाना चाहिए। इसी प्रकार, मूल्य गणना के लिए Invoicing ईसा पूर्व में कक्षा निकालने का प्रयास करें।

अब हमने मॉडल बनाए हैं, हम दृढ़ता के बारे में सोच सकते हैं। हर घिरे संदर्भ के लिए एक Customer मेज, कि साझा गुण (name और id) और विशिष्ट गुण (Store ईसा पूर्व के लिए buyingHistoryProfile, priceCalculationStrategyInvoicing ईसा पूर्व आदि के लिए) शामिल हैं पैदा करते हैं।

यदि आपको आश्चर्य है कि डेटा डुप्लिकेशंस की एक डिग्री है तो आप सही हैं, लेकिन यह सामान्य है, मॉडल को डीक्यूपल करना आवश्यक है। यह डुप्लिकेट डेटा सिंक्रनाइज़ किया जाता है जब UserAuthentication ईसा पूर्व में अपना नाम बदलता है: आप तब अन्य सभी मॉडलों को अपडेट करते हैं। इस बिंदु से, Invoice और Store बीसी डाउन-स्ट्रीम हैं, वे Authentication ईसा पूर्व से डेटा का उपयोग करते हैं; जब अपडेट शुरू होता है तो यह आपके व्यवसाय पर निर्भर करता है।

इवेंट-संचालित आर्किटेक्चर के प्रशंसक होने के नाते, मैं आपको सीक्यूआरएस (और यहां तक ​​कि इवेंट सोर्सिंग) को देखने की सलाह देता हूं। मुझे लगता है कि ये आर्किटेक्चर इस एप्लिकेशन में अच्छी तरह फिट बैठते हैं। सीक्यूआरएस आपके मॉडल को 10 गुना क्लीनर बना सकता है, मैं आपको अपने अनुभव से बताता हूं। इवेंट सोर्सिंग के साथ यह बहुत संभव है कि आपको ORM का उपयोग भी नहीं करना पड़ेगा। यदि आप वास्तव में उन्हें पसंद करते हैं या नहीं छोड़ सकते हैं तो आप पढ़ने के पक्ष में ORM का उपयोग कर सकते हैं। मैं व्यक्तिगत रूप से पसंद नहीं करता (और उपयोग नहीं करता) ORM एस।

+1

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

+0

@ contininin-galbenu हाय, आपकी प्रतिक्रिया के लिए धन्यवाद। आप पहले मॉडल और दृढ़ता के बारे में सही हैं। दरअसल, मैं भूरे रंग के मैदान पर डीडीडी कर रहा हूं, इसलिए जब मैं नई सुविधा जोड़ रहा हूं, तो मैं बीसी में विरासत प्रणाली के बगल में ऐसा करता हूं। और मेरे पास सरल सीक्यूआरएस भी है (ईएस अभी तक लागू नहीं हुआ है) - मैंने सबकुछ कमांड और क्वेरीज़ में विभाजित किया है।लेकिन दुर्भाग्य से मैं अभी भी प्रत्येक बीसी के लिए उन एकाधिक तालिकाओं से संतुष्ट नहीं हूं। इसमें डेटा सिंक्रनाइज़ेशन शामिल है और मैं इसे अतिरंजित नहीं करना चाहता हूं, बस इसे भविष्य में रिफैक्टरिंग के लिए संभावना के रूप में छोड़ दें ... बहुत नया है और मैं जल्दी से अधिक नहीं जोड़ना चाहता – Tom

+1

@ टॉम 'सीक्यूआरएस' एक लंबी सड़क है और 'इवेंट सोर्सिंग' अब भी लंबा है लेकिन इनाम शानदार है। –

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

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