मैं न तो करने का सुझाव दूंगा।
एक पैकेज संरचना के साथ तकनीकी स्तर को लागू करने की कोशिश करने से आपके आवेदन में बहुत अधिक उलझाव हो जाता है। इस तथ्य का उल्लेख नहीं करने के लिए कि हम एक सेवा इंटरफ़ेस के पीछे सब कुछ छिपाने की इतनी कोशिश करते हैं और पहली चीज जो हम करते हैं (ज्यादातर पैकेजिंग के कारण) सब कुछ एक है public class
। यह दर्दनाक हो जाता है जब एक x.y.z.service
और x.y.z.repository
पैकेज के बीच एक तकनीकी अलगाव होता है , अब सब कुछ भंडार तक पहुंच सकता है। बूम वहाँ आपकी परत सेवा परत के अंदर चला जाता है।
इसके बजाय आपको अधिक कार्यात्मक और प्याज आधारित दृष्टिकोण ( स्वच्छ वास्तुकला , हेक्सागोनल वास्तुकला ) का पालन करना चाहिए । यह एकल जिम्मेदारी सिद्धांत (जब पैकेज पर लागू होता है) और पैकेजिंग सिद्धांतों के अनुसार भी अच्छी तरह से है
- एक साथ बदलने वाली चीजें एक साथ पैक की जाती हैं
- एक साथ उपयोग की जाने वाली चीजें एक साथ पैक की जाती हैं
ओलिवर गिएर्के ने जावा में एक साथ पैकेजिंग घटकों पर एक अच्छी पोस्ट लिखी है । साइमन ब्राउन ने इस विषय पर एक और सामान्य कहानी लिखी है ।
मैं आपके आवेदन का मूल रखने के लिए निम्नलिखित की तरह एक कोर पैकेज संरचना के लिए प्रयास करूंगा:
x.y.z.area1
x.y.z.area2
अब अगर आपके पास एक वेब इंटरफेस है जिसे आप जोड़ते हैं, उदाहरण के लिए, एक web
वेबपार्क ws
या एक rest
पैकेज जो केवल रखने के लिए है। यह मूल रूप से कोर से जोड़ता है।
x.y.z.area1.web
x.y.z.area1.ws
x.y.z.area2.rest
अब आप अपने कोर के अंदर की वस्तुओं को अन्य परतों में पुन: उपयोग करने पर विचार कर सकते हैं, लेकिन IMHO के लिए उस परत के लिए एक विशिष्ट डोमेन का उपयोग करना बेहतर होता है। जैसा कि, SQL मैपिंग के ऑब्जेक्ट के साथ होता है, जैसा कि हम स्क्रीन पर दिखाना चाहते हैं या अक्सर वेबबेस में XML के रूप में उपयोग करते हैं और व्यवसाय तर्क कैसे लागू होता है, में एक बेमेल है। व्यापार और वेब डोमेन की जटिलता के आधार पर आप उन्हें अलग समस्या डोमेन के रूप में विचार कर सकते हैं जिसे हल करने के लिए कनेक्ट होने की आवश्यकता है, मूल रूप से 2 अलग-अलग बंधे हुए संदर्भ ।
एक CQRS संसाधन से एक उद्धरण का उपयोग करने के लिए
एकल मॉडल का उपयोग करके लेनदेन की खोज, रिपोर्टिंग और प्रसंस्करण के लिए एक इष्टतम समाधान बनाना संभव नहीं है।
एक ही (डोमेन) मॉडल में सब कुछ डालने की कोशिश मत करो, जिम्मेदारियों को अलग करें। आप शायद अधिक (छोटे) वर्गों के साथ समाप्त होते हैं, लेकिन आपके एप्लिकेशन की परतों के बीच एक क्लीनर जुदाई।
अंतिम नोट
याद रखें कि एक वास्तुकला का निर्माण एक समाधान से दूसरे के व्यापार-नापसंद पर निर्णय ले रहा है। यह डोमेन की जटिलता पर अत्यधिक निर्भर करता है और मुख्य रूप से आपके आवेदन की कार्यात्मक आवश्यकताओं द्वारा संचालित होना चाहिए। हालांकि यह गैर-कार्यात्मक (प्रदर्शन, सुरक्षा) और पर्यावरण संबंधी बाधाओं (उपयोग करने के लिए भाषा, मंच, अनुभव) से प्रभावित है। और आर्किटेक्चर, कोडिंग की तरह, प्रत्येक नई आवश्यकता को कभी भी समाप्त नहीं किया जा सकता है (और शायद चाहिए?) आवेदन को फिर से डिज़ाइन करना चाहिए।
अस्वीकरण
हां मैंने भी एक मॉडल में सब कुछ डालने की कोशिश की, और हां मैंने अपने अनुप्रयोगों में एक तकनीकी अलगाव का उपयोग करने की भी कोशिश की। हालाँकि, उलझी हुई एप्लिकेशन लेयरिंग बनाने में कुछ वर्षों के अनुभव के बाद (पहले तो यह एक अच्छा विचार लगता है, फिर आवेदन बढ़ने लगता है ...) मुझे लगा कि एक और तरीका होना चाहिए।
लिंक
- क्लीन आर्किटेक्चर, अंकल बॉब मार्टिन
- हेक्सागोनल आर्किटेक्चर (उर्फ पोर्ट्स एंड एडेप्टर), एलिस्टेयर कॉकबर्न
- वूप्स मेरी वास्तुकला कहां गई, ओलिवर गिएर्के
- ओओडी के सिद्धांत, चाचा बॉब मार्टिन
- डीडीडी, उदी दहन को लागू करते समय गलतियाँ
- बाउंडेड कॉन्टेक्ट्स, मार्टिन फाउलर
- आर्किटेक्चरली एविडेंट कोडिंग स्टाइल, साइमन ब्राउन
पुस्तकें
- बढ़ते हुए ऑब्जेक्ट-ओरिएंटेड सॉफ्टवेयर, टेस्ट द्वारा निर्देशित
- जावा एप्लिकेशन आर्किटेक्चर: OSGi (रॉबर्ट सी। मार्टिन सीरीज़) का उपयोग कर उदाहरणों के साथ मॉड्यूलर पैटर्न
- डोमेन-चालित डिजाइन: सॉफ्टवेयर के दिल में जटिलता का सामना करना
- डेवलपर्स के लिए सॉफ्टवेयर आर्किटेक्चर
- डोमेन संचालित डिजाइन को लागू करना