जावा अनुप्रयोग संरचना: क्षैतिज बनाम ऊर्ध्वाधर विभाजन


15

एक बड़े जावा अनुप्रयोग के लिए प्रारंभिक परियोजना संरचना (मावेन / ग्रहण का उपयोग करके) के बारे में थोड़ी बहस।

विकल्प 1:

entities (i.e. the whole database using Hibernate classes-first)
services (i.e. sets of read/write operations on the entities)
app (perhaps split up more further down the line)

विकल्प 2:

area1-entities
area1-services
area1-app
area2-entities
area2-services
area2-app
...
(where area1, area2 etc. are functional areas of the system)

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


3
न तो। IMHO (यहां हम जाते हैं) हमें तकनीकी परतों पर अलग करने के साथ छोड़ देना चाहिए जो बस मिट्टी की एक बड़ी गेंद की ओर जाता है। इसके बजाय कार्यात्मक रूप से पैकेज करें। बस area1 / area2 जिसमें आपके एप्लिकेशन (इकाइयां, सेवाएं (सार्वजनिक इंटरफ़ेस और पैकेज निजी कार्यान्वयन में विभाजन), रिपॉजिटरी (यदि आवश्यक हो) का कोर होना चाहिए। अब आपको अपने वेब / ws / मैसेजिंग परत को उस कोर से कनेक्ट करना चाहिए। यहाँ और यहाँ

यह अभी भी है :)। लेकिन मैं इसे एक जवाब में डालने के लिए कुछ पॉलिशिंग करूंगा।


धन्यवाद, लेकिन यह सवाल पैकेज संरचना के बजाय प्रोजेक्ट संरचना के बारे में है
स्टीव चैम्बर्स

जवाबों:


29

मैं न तो करने का सुझाव दूंगा।

एक पैकेज संरचना के साथ तकनीकी स्तर को लागू करने की कोशिश करने से आपके आवेदन में बहुत अधिक उलझाव हो जाता है। इस तथ्य का उल्लेख नहीं करने के लिए कि हम एक सेवा इंटरफ़ेस के पीछे सब कुछ छिपाने की इतनी कोशिश करते हैं और पहली चीज जो हम करते हैं (ज्यादातर पैकेजिंग के कारण) सब कुछ एक है public class। यह दर्दनाक हो जाता है जब एक x.y.z.serviceऔर x.y.z.repositoryपैकेज के बीच एक तकनीकी अलगाव होता है , अब सब कुछ भंडार तक पहुंच सकता है। बूम वहाँ आपकी परत सेवा परत के अंदर चला जाता है।

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

  1. एक साथ बदलने वाली चीजें एक साथ पैक की जाती हैं
  2. एक साथ उपयोग की जाने वाली चीजें एक साथ पैक की जाती हैं

ओलिवर गिएर्के ने जावा में एक साथ पैकेजिंग घटकों पर एक अच्छी पोस्ट लिखी है । साइमन ब्राउन ने इस विषय पर एक और सामान्य कहानी लिखी है ।

मैं आपके आवेदन का मूल रखने के लिए निम्नलिखित की तरह एक कोर पैकेज संरचना के लिए प्रयास करूंगा:

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 संसाधन से एक उद्धरण का उपयोग करने के लिए

एकल मॉडल का उपयोग करके लेनदेन की खोज, रिपोर्टिंग और प्रसंस्करण के लिए एक इष्टतम समाधान बनाना संभव नहीं है।

एक ही (डोमेन) मॉडल में सब कुछ डालने की कोशिश मत करो, जिम्मेदारियों को अलग करें। आप शायद अधिक (छोटे) वर्गों के साथ समाप्त होते हैं, लेकिन आपके एप्लिकेशन की परतों के बीच एक क्लीनर जुदाई।

अंतिम नोट

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

अस्वीकरण

हां मैंने भी एक मॉडल में सब कुछ डालने की कोशिश की, और हां मैंने अपने अनुप्रयोगों में एक तकनीकी अलगाव का उपयोग करने की भी कोशिश की। हालाँकि, उलझी हुई एप्लिकेशन लेयरिंग बनाने में कुछ वर्षों के अनुभव के बाद (पहले तो यह एक अच्छा विचार लगता है, फिर आवेदन बढ़ने लगता है ...) मुझे लगा कि एक और तरीका होना चाहिए।

लिंक

  1. क्लीन आर्किटेक्चर, अंकल बॉब मार्टिन
  2. हेक्सागोनल आर्किटेक्चर (उर्फ पोर्ट्स एंड एडेप्टर), एलिस्टेयर कॉकबर्न
  3. वूप्स मेरी वास्तुकला कहां गई, ओलिवर गिएर्के
  4. ओओडी के सिद्धांत, चाचा बॉब मार्टिन
  5. डीडीडी, उदी दहन को लागू करते समय गलतियाँ
  6. बाउंडेड कॉन्टेक्ट्स, मार्टिन फाउलर
  7. आर्किटेक्चरली एविडेंट कोडिंग स्टाइल, साइमन ब्राउन

पुस्तकें

  1. बढ़ते हुए ऑब्जेक्ट-ओरिएंटेड सॉफ्टवेयर, टेस्ट द्वारा निर्देशित
  2. जावा एप्लिकेशन आर्किटेक्चर: OSGi (रॉबर्ट सी। मार्टिन सीरीज़) का उपयोग कर उदाहरणों के साथ मॉड्यूलर पैटर्न
  3. डोमेन-चालित डिजाइन: सॉफ्टवेयर के दिल में जटिलता का सामना करना
  4. डेवलपर्स के लिए सॉफ्टवेयर आर्किटेक्चर
  5. डोमेन संचालित डिजाइन को लागू करना

1
अच्छा उत्तर :) मैं इस विषय से निपटने के लिए एक अवश्य पढ़ता
हूं

1
अच्छा है, मेरे मूल उत्तर में कुछ और जोड़ा।

1
यह मेरे द्वारा पढ़ी गई डिज़ाइन के बारे में अब तक की सबसे अच्छी किताब है;) आप वॉन वर्नोन पुस्तक का उल्लेख कर सकते हैं, बहुत अच्छा भी: amazon.com/Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/-
Mik378

संदर्भ के लिए @ M.Deinum +1 ग्रेट!

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