क्या मुझे अपने डोमेन को व्यावसायिक डोमेन या तकनीकी डोमेन द्वारा व्यवस्थित करना चाहिए?


19

उदाहरण के लिए, यदि मैं कुछ MVC जैसी वास्तुकला का उपयोग कर रहा हूं, तो मुझे किस फ़ोल्डर संरचना का उपयोग करना चाहिए:

domain1/
    controller
    model
    view
domain2/
    controller
    model
    view

या:

controllers/
    domain1
    domain2
models/
    domain1
    domain2
views/
    domain1
    domain2

मैंने इस प्रश्न को भाषा-अज्ञेय रखने के लिए जानबूझकर फ़ाइल एक्सटेंशन छोड़ दिया है।

व्यक्तिगत रूप से, मैं व्यावसायिक डोमेन (आंत की भावना) द्वारा अलग करना पसंद करूंगा, लेकिन मैं देखता हूं कि तकनीकी डोमेन द्वारा अधिकांश / कई ढांचे अलग हैं। क्यों मैं एक दूसरे के ऊपर चुनते हैं?


2
फ्रेमवर्क डेवलपर्स पर लक्षित हैं, न कि व्यावसायिक उपयोगकर्ताओं पर। डेवलपर्स से अपेक्षा की जाती है कि वे तकनीकी रूप से उन्मुख दृष्टिकोण और फ्रेमवर्क को ध्यान में रखें - जो कि आपके द्वारा देखे जाने का कारण हो सकता है
gnat

जवाबों:


15

मुझे लगता है कि यह विशिष्ट परियोजना पर निर्भर करता है।

उदाहरण के लिए, यदि अलग-अलग व्यावसायिक डोमेन एक दूसरे से पूरी तरह से स्वतंत्र हैं, तो मैं व्यवसाय डोमेन द्वारा व्यवस्थित करूँगा।

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

दो-स्ट्रिप आउट साझा कोड के बीच एक (सुनहरा) मध्य-मार्ग भी है, यह स्वयं का डोमेन है और अन्य डोमेन में इसका उपयोग करते हैं। यह आपको आपकी आंत की भावना से संचालित लेआउट देता है, लेकिन व्यापार डोमेन के बीच साझा कोड की अनुमति देता है।

Domain1              # This domain changes bits of standard MVC code
  controllers
  models
  views
Domain2              # this domain only modifies views, all else is standard
  views
Shared               # Here is the better part of code base
  controllers
  models
  views

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

संपादित करें:

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

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

उदाहरण के लिए, यदि जेनेरिक प्रोजेक्ट केवल आइटम JSON को ही निर्यात करता है, तो डोमेन 1 नियंत्रक को उप-वर्ग कर सकता है और इसे हाल ही में वितरण की समस्याओं को भी निर्यात कर सकता है।

और अगर आपको बाद में पता चलता है कि Domain1 में एक घटक है जो Domain2 के लिए भी मान्य है, तो आप इसके साझा संस्करण को साझा कर सकते हैं।

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


मुझे लगता है कि विचार महान है, लेकिन मैं एक व्यावहारिक उदाहरण की कल्पना करने में विफल हूं। आप एक सरल अभी तक एक ज्ञान दे सकता है?
फ्लोरियन मार्गाइन

@FlorianMargaine - मैं आपको एक वास्तविक दुनिया का उदाहरण दूंगा। रियल एस्टेट वेबसाइट। मेरी आखिरी नौकरी में हमने कई रियल एस्टेट वेबसाइट को कई ग्राहकों को बेचा। हमारे पास सभी 50+ ग्राहकों के लिए एक केंद्रीकृत डेटाबेस था। प्रत्येक बैक-एंड व्यवस्थापक ने मॉड्यूल के साझा सेट का उपयोग किया। सामना करने वाले प्रत्येक ग्राहक ने अद्वितीय चित्र और नेविगेशन का उपयोग किया। प्रत्येक खोज और ड्रिल डाउन पेज उन मामलों को छोड़कर साझा मॉड्यूल का उपयोग करते हैं, जहां ग्राहक एक-एक सुविधाएँ चाहते थे। उन वन-ऑफ्स के लिए हमने कोड को अलग किया और उन्हें अपना मॉड्यूल दिया। (ड्राबैक: अपग्रेड्स को आम मॉड्यूल्स में किया जाना था और एक-ऑफ मॉड्यूल में डुप्लिकेट किया गया था)
माइकल रिले - AKA Gunny

8

मुझे लगता है कि यह पूछना ज्ञानवर्धक है, "क्या मैं नियमित रूप से, अधिक डोमेन या अधिक तकनीकी प्रभागों को जोड़ने की संभावना रखता हूं?" फिर जो भी जवाब हो, उसे शीर्ष स्तर पर रखें।

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

यदि आपने अपना GUI ढांचा बदल दिया है, तो इसका मतलब है कि आपके परिवर्तन पूरे अनुप्रयोग में फैल जाएंगे, लेकिन फिर, आप शायद ही कभी अपने GUI ढांचे को बदलते हैं, लेकिन आप हमेशा अपने डोमेन तर्क को बदल रहे हैं।

अगर वे एक ही समय में बदलने की संभावना रखते हैं तो चीजों को एक साथ रखें।


सबसे अच्छी सलाह है, लेकिन मैं यह नहीं देखता कि मैं किस तरह के डोमेन का अनुमान लगाऊं कि मैं सबसे अधिक किस तरह का डोमेन जोड़ने जा रहा हूं।
फ्लोरियन मार्गाइन

आखिरी वाक्य यह नाखून।
हकन डेरिल

@FlorianMargaine - मुझे नहीं लगता कि डोमेन मामलों का "प्रकार" है। यदि आप नए तकनीकी "चीज़ें" जोड़ने से अधिक डोमेन जोड़ते हैं, तो पहले डोमेन द्वारा सब कुछ समूहित करें।
स्कॉट व्हिटलॉक

3

एक और विकल्प है और वह है प्लग में अलग हिस्सों को स्थानांतरित करना। CakePHP उदाहरण के लिए करता है। यह आपको पूर्ण MVC भागों को उत्पन्न करने की अनुमति देगा जो कि पुन: प्रयोज्य हैं जिन्हें आप किसी भी तर्क के आधार पर क्रमबद्ध कर सकते हैं।

आपका मुख्य एप्लिकेशन बस उनका उपयोग करेगा और उनसे लिंक करेगा।

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

इसे ध्यान में रखते हुए: यदि आप डोमेन से अलग हो जाते हैं तो आप अपने आवेदन के हिस्सों का पुन: उपयोग कैसे करेंगे? उदाहरण के लिए एक webshop लें: एक अनुरोध / आदेश / दृश्य / 1 के लिए आता है ताकि आपको आदेश एनआर दिखाने की आवश्यकता हो। 1. यदि आप पहले से ही अन्य "डोमेन" के कुछ हिस्सों की आवश्यकता होगी, तो आप उत्पादों और आदेशों के अनुसार डोमेन को अलग कर देंगे।

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

प्लगइन बिल्कुल वही करेगा जो उसे करने की आवश्यकता है। यह इनपुट पर निर्भर करेगा और अन्य "भागों / डोमेन / क्षेत्रों" पर नहीं।


अच्छा विचार। यह अनिवार्य रूप से मेरे उत्तर का टॉप-डाउन है। मैंने शीर्ष पर साझा कोड डाला और मूल रूप से डोमेन बारीकियों में प्लग किया गया। आपने Domain को सबसे ऊपर रखा और Shared code में प्लग किया। मुझे लगता है कि दोनों डी-कपलिंग और परीक्षण क्षमता के बारे में समान रूप से अच्छे दृष्टिकोण हैं।
लाओस

2

Microsoft ASP.Net MVC 3 में "क्षेत्र" की अवधारणा है। जब आप अपने MVC प्रोजेक्ट में "क्षेत्र" पेश करते हैं, तो वे इसे तोड़ देते हैं:

area1/
   models
   views
   controllers
area2/
   models
   views
   controllers

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

हमने नामस्थान का उपयोग मैच के लिए किया, एफडब्ल्यूआईडब्ल्यू।


2
आपके योगदान के लिए धन्यवाद, लेकिन यह मेरे सवाल का जवाब कैसे देता है? (दोनों समाधानों की तुलना करते हुए)
फ्लोरियन मार्गाइन

@FlorianMargaine: मैं यह बता रहा हूं कि Microsoft ने यह कैसे किया (संभवतः त्रुटिपूर्ण) यह मानते हुए कि उन्होंने इंजीनियरिंग के बहुत से प्रयासों को अधिक समझदार तरीके से उठाया। आशा है कि यह कुछ इनपुट देता है।
गहोआ

ठीक है, लेकिन यह व्यवसाय उन्मुख तरीका है जो मैंने अपने प्रश्न में दिखाया ...
फ्लोरियन मार्गाइन

1

कोड के 300 000 लाइनों से युक्त एक वेब शॉप के साथ अपने व्यक्तिगत अनुभव से, मैं हमेशा व्यापार डोमेन द्वारा आयोजन के लिए जाऊंगा। इस तरह, आप सभी प्रासंगिक कक्षाओं का त्वरित अवलोकन नहीं कर सकते हैं जब आप एक कार्यात्मक क्षेत्र पर काम करते हैं, तो जावा में आप पैकेज दृश्यता का उपयोग भी कर सकते हैं।

रुचि रखने वालों के लिए कुछ विवरण: जब परियोजना 5 साल पहले शुरू की गई थी, तो डेवलपर्स ने निम्नलिखित पैकेज संरचना बनाई:

com
  example
    web
      struts
        action
        form
      shared
      functionality1
      functionality2

प्रत्येक दुकान का कार्य जैसे शॉपिंग कार्ट, उत्पाद खोज आदि में कई कार्य होते हैं, प्रत्येक अपने स्वयं के रूप वर्ग (MVC फ्रेमवर्क द्वारा अनिवार्य संरचना) के साथ। हमने एक्शन पैकेज में 200 से अधिक कक्षाएं लीं, जिनमें से प्रत्येक को उनके संबंधित फॉर्म क्लास से पूरी तरह अलग कर दिया गया। इससे भी बुरी बात यह है कि क्रियाएं बहुत अधिक तर्क को लागू नहीं करती हैं, लेकिन फ़ंक्शन-विशिष्ट सेवाओं को कॉल करती हैं जो अभी तक किसी अन्य पैकेज में रहती हैं।

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


0

मैं सहमत हूं कि तकनीकी डोमेन द्वारा कई फ्रेमवर्क अलग होते हैं और इसलिए मैं अक्सर एक नए ढांचे का उपयोग करते समय इस तरह से शुरू करता हूं। हालाँकि, मैं व्यावसायिक संगठन को फ़ोल्डर संगठन के प्राथमिक स्तर के रूप में उपयोग करने के लिए लगातार समझौता करता हूँ।

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

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