मैं आपको केवल मामले पर अपने संगठन की राय बता सकता हूं। हम कर रहे हैं मॉड्यूल में जाने, हर एक परियोजना है कि हम पर काम कर रहे के लिए करने की प्रक्रिया में। हम जो निर्माण कर रहे हैं, वह मूल रूप से सूक्ष्म सेवाएँ + कुछ क्लाइंट लाइब्रेरी हैं। माइक्रो-सेवाओं के लिए संक्रमण 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
करते हैं, तो आप आश्चर्यचकित हैं। हालांकि इसे हल करने के तरीके हैं। किसी तरह दर्दनाक, लेकिन सॉल्व।
कुल मिलाकर, जब से हम मॉड्यूल (और अभी भी करते हैं) में चले गए, हमारा कोड बहुत अधिक क्लीनर बन गया है । और अगर आपकी कंपनी "कोड-प्रथम" कंपनी है, तो यह मायने रखता है। दूसरी ओर, मैं कंपनियों में शामिल रहा हूँ यह वरिष्ठ वास्तुकारों द्वारा "बहुत महंगा", "कोई वास्तविक लाभ नहीं" के रूप में देखा गया था।