मैं आपको केवल मामले पर अपने संगठन की राय बता सकता हूं। हम कर रहे हैं मॉड्यूल में जाने, हर एक परियोजना है कि हम पर काम कर रहे के लिए करने की प्रक्रिया में। हम जो निर्माण कर रहे हैं, वह मूल रूप से सूक्ष्म सेवाएँ + कुछ क्लाइंट लाइब्रेरी हैं। माइक्रो-सेवाओं के लिए संक्रमण modulesकिसी भी तरह से कम प्राथमिकता है: कोड वहां पहले से ही किसी तरह डॉकटर कंटेनर में अलग-थलग है, इसलिए वहां "मॉड्यूल" जोड़ना "हमें (महत्वपूर्ण) प्रतीत नहीं होता है। यह काम धीरे-धीरे उठाया जा रहा है, लेकिन यह कम प्राथमिकता है।
दूसरी ओर, क्लाइंट लाइब्रेरी एक पूरी तरह से अलग कहानी है। मैं आपको कभी-कभी होने वाली गंदगी नहीं बता सकता। मैं एक बात समझाता हूँ कि मुझे पहले से नफरत थी jigsaw। आप सभी के उपयोग के लिए, ग्राहकों के लिए एक इंटरफ़ेस उजागर करते हैं। स्वचालित रूप से वह interfaceहै public- दुनिया के सामने। आमतौर पर, मैं क्या करता हूं, तब कुछ package-privateकक्षाएं होती हैं, जो ग्राहकों के सामने नहीं आती हैं, जो उस इंटरफ़ेस का उपयोग करती हैं। मैं नहीं चाहता कि ग्राहक इसका उपयोग करें, यह आंतरिक है। बढ़िया है? गलत।
पहली समस्या यह है कि जब वे package-privateकक्षाएं बढ़ती हैं, और आप अधिक कक्षाएं चाहते हैं, तो सब कुछ छिपाए रखने का एकमात्र तरीका है कि उसी वर्ग में कक्षाएं बनाई जाएं :
package abc:
-- Usage.java
-- HelperUsage.java
-- FactoryUsage.java
....
जब यह बढ़ता है (हमारे मामलों में ऐसा होता है), तो वे पैकेज बहुत बड़े हैं। एक अलग पैकेज पर चलते हुए आप कहते हैं? ज़रूर, लेकिन फिर वह HelperUsageऔर FactoryUsageहोगा publicऔर हमने शुरू से ही इससे बचने की कोशिश की।
समस्या नंबर दो: हमारे ग्राहकों का कोई भी उपयोगकर्ता / कॉलर एक ही पैकेज का नाम बना सकता है और उन छिपी हुई कक्षाओं का विस्तार कर सकता है। यह हमारे लिए कुछ समय पहले ही हुआ, मजेदार समय।
modulesहल करती है एक सुंदर तरीके से इस समस्या: publicनहीं है वास्तव में public अब और; मैं निर्देशन के friendमाध्यम से पहुँच सकता हूँ exports to। इससे हमारा कोड जीवनचक्र और प्रबंधन बहुत आसान हो जाता है। और हम क्लासपाथ नरक से दूर हो जाते हैं। बेशक maven/gradleसंभाल कि हमारे लिए, मुख्य रूप से, लेकिन जब वहाँ एक समस्या है, दर्द बहुत ही वास्तविक हो जाएगा। कई अन्य उदाहरण भी हो सकते हैं।
उस ने कहा, संक्रमण (अभी भी) आसान नहीं है। सबसे पहले, टीम पर सभी को गठबंधन करने की आवश्यकता है; दूसरी बाधाएँ हैं। सबसे बड़ा दो जो मैं अभी भी देख रहा हूं: विशेष रूप से किसके आधार पर, आप प्रत्येक मॉड्यूल को अलग करते हैं? मेरे पास एक निश्चित उत्तर नहीं है, फिर भी। दूसरा है split-packages, ओह सुंदर "एक ही वर्ग विभिन्न मॉड्यूल द्वारा निर्यात किया जाता है"। यदि आपके पुस्तकालयों के साथ ऐसा होता है, तो कम करने के तरीके हैं; लेकिन अगर ये बाहरी पुस्तकालय हैं ... इतना आसान नहीं है ।
यदि आप ( jarAऔर jarBअलग मॉड्यूल) पर निर्भर हैं , लेकिन वे दोनों निर्यात abc.def.Utilकरते हैं, तो आप आश्चर्यचकित हैं। हालांकि इसे हल करने के तरीके हैं। किसी तरह दर्दनाक, लेकिन सॉल्व।
कुल मिलाकर, जब से हम मॉड्यूल (और अभी भी करते हैं) में चले गए, हमारा कोड बहुत अधिक क्लीनर बन गया है । और अगर आपकी कंपनी "कोड-प्रथम" कंपनी है, तो यह मायने रखता है। दूसरी ओर, मैं कंपनियों में शामिल रहा हूँ यह वरिष्ठ वास्तुकारों द्वारा "बहुत महंगा", "कोई वास्तविक लाभ नहीं" के रूप में देखा गया था।