जावा परियोजनाओं को अलग करना


12

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

मैं इस बड़ी परियोजना को छोटे विशिष्ट परियोजनाओं में अलग करने के बारे में सोच रहा हूं, जैसे कि 'अंतिम' उप-परियोजना (या कई उप-परियोजनाएं) विभिन्न उप-परियोजनाओं को उठाएगा जिनकी इसे आवश्यकता होगी।

मेरी सोच इस प्रकार है:

  • यदि मैं बड़ी परियोजना को विभिन्न उप-परियोजनाओं में अलग करता हूं, तो यह स्पष्ट करता है कि प्रत्येक परियोजना की जिम्मेदारी क्या है।
  • उप-परियोजनाओं में अलग करके, मैं तब प्रत्येक उप-परियोजना के परीक्षण को व्यक्तिगत रूप से साफ कर सकता हूं, और मावेन बिल्ड चक्र में उस उप-परियोजना के लिए परीक्षण चालू कर सकता हूं।

मैं इस बात से थोड़ा चिंतित हूं कि निर्माण समय पर इसका क्या प्रभाव पड़ सकता है।

  • बड़ी परियोजना (यानी छोटी उप-परियोजनाओं में) संरचना को लागू करने से कंपाइलर धीमा हो जाएगा?

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

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

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

  • उप-परियोजना ए - में इंटरफेस है
  • उप-प्रोजेक्ट बी - इंटरफेस और पुराने बाहरी जार के लिए ए पर निर्भर करता है
  • उप-परियोजना सी - बी पर निर्भर करता है (और इस तरह ए और पुराने बाहरी जार), और इसमें एक कारखाना वर्ग शामिल है जो बी के कार्यान्वयन के इंटरफेस का उपयोग करता है

अगर मुझे B के बाहरी जार को बदलने की आवश्यकता है, तो मैं कर सकता हूं:

  • उप-प्रोजेक्ट B_ii बनाएं - फिर से A पर निर्भर करता है, और अब नया बाहरी जार
  • एक बार पूरी तरह कार्यात्मक होने के बाद, मैं B_ii में C की निर्भरता जोड़ सकता हूं, और इंटरफेस के नए कार्यान्वयन का उपयोग करने के लिए फ़ैक्टरी वर्ग को बदल सकता हूं।
  • जब यह सब काम कर रहा है, तो मैं मूल बी में सी की निर्भरता को हटा सकता हूं, और यदि वांछित हो, तो उप-परियोजना बी को हटा दें।

  • क्या इस बारे में जाने का एक समझदार तरीका है?

तो, सामान्य तौर पर, मेरे प्रश्न हैं:

  • क्या किसी के पास बड़ी परियोजनाओं को तोड़ने का कोई अनुभव नहीं है? क्या कोई सुझाव / तरकीब है जिसे आप साझा करने के लिए तैयार होंगे?
  • आपके विकास और निर्माण समय पर इसका क्या प्रभाव पड़ा?
  • ऐसी परियोजना के टूटने की संरचना पर आप क्या सलाह दे सकते हैं?

ध्यान दें कि आप A, B और C के साथ एक पेरेंट प्रोजेक्ट बना सकते हैं जो एक-दूसरे के बगल में अलग से चेक किया गया हो। यह उदाहरण के लिए इंटेलीजे को एक ही समय में सभी तीन मेमोरी में रखने की अनुमति देता है, और मॉड्यूल सीमाओं पर रिफैक्टोरिंग करता है।
थोर्बोजर्न रेवन एंडरसन

जवाबों:


10

मैं इस (महान क्यू BTW!) पर एक त्वरित पहली कटौती लेने जा रहा हूँ:

बड़ी परियोजना (यानी छोटी उप-परियोजनाओं में) संरचना को लागू करने से कंपाइलर धीमा हो जाएगा?

पर्याप्त नहीं है कि यह मायने रखता है, ओवरहेड वास्तव में मावेन के आक्रमण में है।

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

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

मुझे लगता है कि मैं इन दिनों हालांकि कम और कम कर रहा हूँ। SSD ड्राइव होने से यहाँ BTW का भारी अंतर पड़ता है।

स्निप फैक्टरी वर्ग पैराग्राफ

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

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

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

तो, सामान्य तौर पर, मेरे प्रश्न हैं:

क्या किसी के पास बड़ी परियोजनाओं को तोड़ने का कोई अनुभव नहीं है? क्या कोई ऐसी युक्तियां / तरकीबें हैं जिन्हें आप साझा करना चाहते हैं?

  • इंटरफेस और डिपेंडेंसी इंजेक्शन आपके दोस्त हैं।
  • विरासत कोड के साथ प्रभावी ढंग से निपटने पर माइकल फेदर की पुस्तक को अवश्य पढ़ा जाना चाहिए।
  • एकीकरण परीक्षण आपके मित्र हैं
  • उप-परियोजनाओं को फू-अपी में विभाजित करना (केवल इंटरफेस!) और फू-कोर और मॉड्यूल केवल foo-api पर निर्भर करते हैं और एक बड़ी मदद करते हैं और जुदाई को लागू करते हैं
  • Jboss मॉड्यूल और / या OSGi साफ जुदाई को लागू करने में मदद कर सकते हैं

आपके विकास और निर्माण समय पर इसका क्या प्रभाव पड़ा?

देव और निर्माण समय पर बहुत मामूली प्रभाव - हमारे समग्र सतत वितरण पाइपलाइन के लिए समय में भारी लाभ।

ऐसी परियोजना के टूटने की संरचना पर आप क्या सलाह दे सकते हैं?

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

विभाजन से पहले एकीकरण परीक्षण लिखें - आपको विभाजन के बाद कम या ज्यादा समान परिणाम प्राप्त करना चाहिए।

आपके पास अभी और जहां आप प्राप्त करना चाहते हैं, उस प्रतिरूपता के आरेख बनाएं। मध्यवर्ती चरणों को डिज़ाइन करें।

हार मत मानो - कुछ याक शेविंग अब बेन और आई के द-वेल-ग्राउंडेड जावा डेवलपर से " शियरलेस प्लग -> बिना किसी डर के" तेजी से निर्माण और रिफ्लेक्टर करने में सक्षम होने के लिए नींव बनाता है ।

शुभकामनाएँ!


0

इस पर मेरा ध्यान केवल आवश्यक होने पर अलग है। हालाँकि, इससे अगला प्रश्न सामने आता है: मैं यह कैसे निर्धारित करूँ कि यह आवश्यक है?

  • जब कलाकृति अलग होती है (अर्थात एक ही परियोजना में EAR, WAR, JAR, एकीकरण-परीक्षण-जार का निर्माण नहीं करते हैं)।
  • जब जुदाई के दौरान आप देखते हैं कि कुछ कोड को एक से अधिक विरूपण साक्ष्य में मौजूद होने की आवश्यकता है, तो उन्हें एक नए में बदल दें।
  • जब आपकी टीम के बाहर कोई अन्य प्रोजेक्ट आपके प्रोजेक्ट में आपके द्वारा उपयोग की जाने वाली किसी चीज़ का उपयोग करना चाहता है।

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

अन्य कारण यह है कि आपके पास फ़ाइलों को प्लंब करने के मामले में निपटने के लिए और अधिक चलने वाले हिस्से होंगे और आपको यह जानने से पहले निर्भरता स्पैगेटी होगी।

प्रोजेक्ट के बजाय प्रोजेक्ट के भीतर रीफैक्टरिंग भी आसान है।

अगर समय का निर्माण एक मुद्दा है तो बस बेहतर हार्डवेयर प्रदान करें।

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