मोटी मॉडल बनाम। व्यापार तर्क, आप भेद कहाँ आकर्षित करते हैं?


16

आज मैं अपने संगठन के किसी अन्य डेवलपर के साथ एक गर्म बहस में पड़ गया कि डेटाबेस मैप्ड क्लासेस के तरीकों को कहाँ और कैसे जोड़ा जाए। हम उपयोग करते हैं sqlalchemy, और हमारे डेटाबेस मॉडल में मौजूदा कोड बेस का एक बड़ा हिस्सा वर्ग नाम के साथ मैप किए गए गुणों के बैग से थोड़ा अधिक है, डेटाबेस टेबल से अजगर वस्तुओं तक लगभग यांत्रिक अनुवाद।

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

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


tl; dr: ओआरएम का उपयोग करते समय मैप किए गए वर्ग में किस तरह की चीजें या एक विधि में जाना चाहिए, और क्या छोड़ना चाहिए, अमूर्तता की एक और परत में रहने के लिए?


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

जवाबों:


10

मैं ज्यादातर तुम्हारे साथ हूँ; आपके सहयोगी को एनीमिक डोमेन मॉडल एंटीपैटर के लिए या किसी स्पष्ट लाभ के साथ "दृढ़ता मॉडल" में मॉडल को डुप्लिकेट करने के लिए बहस करने लगता है (मैं एक जावा परियोजना पर काम कर रहा हूं जहां यह किया गया था, और यह एक बड़े पैमाने पर रखरखाव सिरदर्द है, जैसा कि हो सकता है) यह तीन बार काम का मतलब है जब भी मॉडल में कुछ भी बदलता है)।

ओआरएम का उपयोग करते समय मैप किए गए वर्ग में किस तरह की चीजें हो सकती हैं या एक विधि में जाना चाहिए, और क्या छोड़ना चाहिए, अमूर्तता की एक और परत में रहने के लिए?

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


+1, आपके उत्तर के दूसरे भाग के लिए। पहले भाग के रूप में, मुझे यकीन है कि आप क्यों कहते हैं कि एनीमिक डोमेन मॉडल को परिवर्तन के मामले में बहुत अधिक 'अतिरिक्त' काम करने की आवश्यकता है। मेरी समझ यह है कि परिवर्तन किसी भी तरह से होगा, लेकिन कई अलग-अलग वर्गों में (जो कि खराब है) लेकिन यह परिवर्तन की लगभग समान मात्रा है; मेरा अनुमान?
NoChance

1
@ ईमद करीम: यह टिप्पणी भाले की दृढ़ता और डोमेन मॉडल रखने के बारे में थी। मॉडल में एक संपत्ति जोड़ना फिर इसे दो मॉडल वर्गों (एक के बजाय) के साथ-साथ उन दोनों के बीच जो भी नक्शे हैं, उन्हें जोड़ना आवश्यक है (जो सिद्धांत में स्वचालित हो सकता है, लेकिन आमतौर पर जो सोचा था कि यह एक अलग विचार है "दृढ़ता मॉडल" उन्हें अलग-अलग बनाकर उस अलगाव को सही ठहराने का फैसला करता है, जैसे कि डेटाटाइप होते हैं जो डीबी प्रकार के मॉडल से अधिक निकटता से मेल खाते हैं) ताकि 2 + X बार परिवर्तन की मात्रा हो, एक्स 0 के बीच भिन्न हो और अस्पष्ट उत्पादकता के कारण खोई हुई उत्पादकता के घंटे। मानचित्रण मुद्दे।
माइकल बोर्गवर्ड

3

यह एक निर्णय कॉल है जो वास्तव में आपके अनुमानित आकार और आपके द्वारा विकसित किए जा रहे पैमाने पर निर्भर करता है। सबसे कठोर दृष्टिकोण ओआरएम प्रकारों को एक डेटा एक्सेस घटक तक सीमित करना और एक सामान्य पुस्तकालय में पीओसीओ का उपयोग करना है जैसा कि संदर्भित और सभी परतों द्वारा उपयोग किया जाता है। यह भविष्य में शारीरिक अलगाव के साथ-साथ तार्किक अलगाव की अनुमति देगा। आप यह भी तय कर सकते हैं कि UI और व्यावसायिक तर्क परत के बीच एक अतिरिक्त परत मौजूद होनी चाहिए। इसे आमतौर पर एक मुखौटा या व्यावसायिक इंटरफ़ेस परत कहा जाता है। यह अतिरिक्त परत वह जगह है जहां आपका "उपयोग-केस कोड" रहता है। अलग-अलग शिथिल युग्मित कोड को Facade / BI लेयर द्वारा बुलाया जाता है (जैसे Facade में एक ProcessOrder () फ़ंक्शन है, जो व्यावसायिक तर्क 1: M को वास्तव में ऑर्डर को संसाधित करने के लिए आवश्यक सभी चरणों को पूरा करने के लिए कॉल करता है)।

हालाँकि, कहा जा रहा है कि: कई बार आर्किटेक्चरिंग की यह राशि केवल अनावश्यक ओवरकिल है। उदाहरण के लिए, विशेष रूप से एक साधारण वेब साइट के लिए कोड जहां आपके पास पुन: उपयोग के लिए इसके घटकों की पैकेजिंग का कोई इरादा नहीं है। यह MVC वेब साइट बनाने और इस प्रकार के समाधान के लिए EF ऑब्जेक्ट्स का उपयोग करने के लिए पूरी तरह से मान्य है। यदि साइट को बाद में स्केल करने की आवश्यकता होती है, तो आप क्लस्टरिंग में देख सकते हैं या एक प्रक्रिया अक्सर खो जाती है जिसे "रिफैक्टरिंग" कहा जाता है।


3

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

तो क्यों न केवल एक ही मॉडल वर्ग में इन सभी विभिन्न पहलुओं की रचना की जाए? आपको निरंतर वस्तुओं से निपटने के लिए वर्ग विधियों का एक गुच्छा चाहिए - उन्हें एक कक्षा में रखें; आपके पास सत्यापन से निपटने के तरीकों का एक समूह है - उन्हें दूसरे में डालें। अंत में, इन दोनों को मिलाएं और वॉयला करें! आपने अपने आप को एक स्मार्ट, आत्म-जागरूक और पूरी तरह से मॉडल प्रतिनिधित्व प्राप्त किया।


1

अन्य उत्तरों के अलावा, ओआरएम के साथ समृद्ध डोमेन मॉडल का उपयोग करते समय छिपे हुए गुफाओं पर ध्यान दें।

जब निम्नलिखित स्यूडोडोड की तरह कुछ हासिल करने की कोशिश कर रहा था, तब मैंने लगातार मॉडल कक्षाओं में बहुरूपी सेवाओं को इंजेक्ट करने के मुद्दे थे:

Person john = new Person('John Doe')
Organisation company = organisation_repository.find('some id')
Employee our_collegue_john = company.hire(john)

इस मामले में, एक संगठन HRServiceको एक निर्माता निर्भरता (उदाहरण के लिए) के रूप में आवश्यकता हो सकती है । ORM का उपयोग करते समय आप आमतौर पर आसानी से अपने मॉडल कक्षाओं के नियंत्रण को नियंत्रित नहीं कर सकते।

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

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