(जावा) पैकेज संगठन के लिए सर्वोत्तम अभ्यास हैं? [बन्द है]


201

कुछ समय पहले, मैंने जावा पैकेज के ठीक-दाने वाले संगठन के बारे में एक सवाल का जवाब दिया। उदाहरण के लिए, my.project.util, my.project.factory, my.project.service, आदि

मुझे अब यह नहीं मिल रहा है, इसलिए मैं भी सवाल पूछ सकता हूं।

क्या जावा में पैकेज के संगठन के संबंध में सर्वोत्तम प्रथाएं हैं और उनमें क्या जाता है?

आप अपने जावा प्रोजेक्ट में अपनी कक्षाओं को कैसे व्यवस्थित करते हैं?

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

आपके विचारों और टिप्पणियों की सराहना की जाती है।


74
मैं इस प्रश्न के समापन से असहमत हूं। मैं इस बात से असहमत नहीं हूं कि सर्वश्रेष्ठ अभ्यास प्रश्न लगभग हमेशा अनुभव और राय पर आधारित होते हैं, हालांकि, मैं असहमत हूं कि इन सवालों को स्टैक ओवरफ्लो पर बंद किया जाना चाहिए। यह अच्छी प्रोग्रामिंग का सबसे अच्छा तरीका है, सर्वोत्तम प्रथाओं का उपयोग करना और सबसे अच्छा समाधान ढूंढना इन विचारों और अनुभवों का उपयोग करता है। कृपया इस प्रश्न को पुनः खोलें।
5:18 बजे Cyntech

मेरा सुझाव है कि आप इस पढ़ें: satisfice.com/blog/archives/5164 । टीएल; डीआर ... "सर्वोत्तम प्रथाओं" का पूरा विचार टूट गया है। सबसे अच्छे रूप में यह एक गलत मिथक है, कम से कम यह हानिकारक है।
स्टीफन सी

जवाबों:


174

पैकेज संगठन या पैकेज संरचना आमतौर पर एक गर्म चर्चा है। पैकेज के नामकरण और संरचना के लिए कुछ सरल दिशानिर्देश नीचे दिए गए हैं:

  • जावा पैकेज नामकरण सम्मेलनों का पालन करें
  • अपनी कार्यात्मक भूमिका के साथ-साथ अपनी व्यावसायिक भूमिका के अनुसार अपने पैकेजों की संरचना करें
    • अपनी कार्यक्षमता या मॉड्यूल के अनुसार अपने पैकेज को तोड़ दें। जैसे com.company.product.modulea
    • आगे का ब्रेक डाउन आपके सॉफ्टवेयर की परतों पर आधारित हो सकता है। लेकिन ओवरबोर्ड मत जाओ यदि आपके पास पैकेज में केवल कुछ कक्षाएं हैं, तो यह पैकेज में सब कुछ होने के लिए समझ में आता है। जैसे com.company.product.module.webया com.company.product.module.utilआदि।
    • स्ट्रक्चरिंग के साथ ओवरबोर्ड जाने से बचें, आईएमओ अपवादों, कारखानों आदि के लिए अलग-अलग पैकेजिंग से बचें, जब तक कि कोई दबाने की आवश्यकता न हो।
  • यदि आपका प्रोजेक्ट छोटा है, तो इसे कुछ पैकेजों के साथ सरल रखें। जैसे com.company.product.modelऔर com.company.product.utilइत्यादि।
  • अपाचे परियोजनाओं पर वहाँ के कुछ लोकप्रिय ओपन सोर्स प्रोजेक्ट्स पर एक नज़र डालें । देखें कि वे विभिन्न आकार की परियोजनाओं के लिए, संरचना का उपयोग कैसे करते हैं।
  • नामकरण करते समय निर्माण और वितरण पर भी विचार करें (आपको अपने एपीआई या एसडीके को एक अलग पैकेज में वितरित करने की अनुमति दें, सर्वलेट एपीआई देखें)

कुछ प्रयोगों और परीक्षणों के बाद आपको एक ऐसी संरचना के साथ आने में सक्षम होना चाहिए, जिसके साथ आप सहज हैं। एक सम्मेलन में तय न करें, परिवर्तनों के लिए खुला रहें।


आपके प्रतिक्रिया के लिए धन्येवाद। यह काफी हद तक है जिसे हमने घेरने की कोशिश की है, लेकिन बहुत सारे असंबंधित कोड हमारे बीन्स पैकेज में मिल गए, जो कि मेरा सवाल है।
Cyntech

2
मैं सहमत हूं कि पैकेज फीचर के हिसाब से सबसे ज्यादा मायने रखता है। मैंने कंपनी कार्यालय संरचना से संबंधित एक बार एक महान सादृश्य सुना। एक स्तरित दृष्टिकोण में, एक कंपनी में प्रति व्यक्ति प्रत्येक स्तर पर एक दूसरे के साथ बैठेंगे यानी कार्यकारी, प्रबंधक, व्यवस्थापक, कर्मचारी / कर्मचारी सभी एक भवन में अलग-अलग वर्गों में बैठेंगे। यह संरचना संभवतः "सुविधा" संगठित दृष्टिकोण के रूप में प्रभावी नहीं है। यानी अगर सेल्स एग्जीक्यूटिव सेल्स मैनेजर के साथ बैठता है, जो सेल्स एंप्लॉयीज के साथ बैठता है, जो सभी सेल्स एडमिन के साथ बैठते हैं। यह इस तरह व्यवस्थित होने पर विभाग के बीच बेहतर सामंजस्य प्रदान करता है।
एलेक्स

आपकी बातों से सहमत हूं। पैकेज में कंपनी के नाम के बारे में उजागर करने के लिए बस एक बार कुछ समय के लिए कंपनी के एक्वायर्ड उत्पाद बिक जाते हैं। प्रबंधन कंपनी का नाम हटाना चाहता है। वह ओवरहेड हो सकता है।
तुषार डी

183

मैं पैटर्न या कार्यान्वयन भूमिकाओं द्वारा नहीं, सुविधा द्वारा पैकेजों को व्यवस्थित करता हूं । मुझे लगता है जैसे पैकेज:

  • beans
  • factories
  • collections

गलत हैं।

मैं पसंद करता हूँ, उदाहरण के लिए:

  • orders
  • store
  • reports

इसलिए मैं पैकेज दृश्यता के माध्यम से कार्यान्वयन विवरण छिपा सकता हूं । ऑर्डर की फैक्ट्री ordersपैकेज में होनी चाहिए, ताकि ऑर्डर बनाने के तरीके के बारे में विवरण छिपा हो।


10
यह पोस्ट पैकेज दृश्यता के बारे में एक अच्छा बिंदु बनाता है। मैंने उपयोग में जावा पैकेज की गुंजाइश कभी नहीं देखी है, लेकिन सही पैकेज संरचना डेवलपर्स को इसका बेहतर लाभ लेने की अनुमति दे सकती है।
जेएनपी

23
यह बिल्कुल सही है, लेकिन कुछ डेवलपर्स ऐसा करते हैं। संकुल को कक्षाओं का समकालिक संग्रह होना चाहिए, जिनमें से कुछ केवल पैकेज के भीतर दिखाई दे रहे हैं। यह उन वर्गों के बीच युग्मन को कम करेगा जिन्हें अलग नहीं किया जाना चाहिए क्योंकि वे विभिन्न विशेषताओं से संबंधित हैं। पैकेज-बाय-लेयर दृष्टिकोण, पैकेज दृश्यता संशोधक का लाभ नहीं उठाता है, और ऐसी परियोजना में पैकेज में कम सामंजस्य होता है और संकुल के बीच युग्मन का उच्च स्तर होता है।
नैट रीड

क्या आपके पास इसका उदाहरण है? मैं स्प्रिंग-एमवीसी का उपयोग कर रहा हूं, मुझे इसे फीचर / मॉड्यूल द्वारा व्यवस्थित करना मुश्किल लगता है क्योंकि वसंत कॉन्फ़िगर एक्सएमएल का उपयोग करता है।
एरिक हुआंग

2
@onof मैं अपने कोड को फीचर के द्वारा भी व्यवस्थित करता हूं लेकिन सभी सुविधाओं द्वारा साझा किए गए आधार वर्गों के लिए सबसे अच्छा अभ्यास क्या है?
मार्क

मैं पहले स्टाइल को फॉलो कर रहा था। लेकिन अब मुझे कक्षाओं के साथ काम करने पर एक पैकेज से दूसरे में कूदना होगा। यह वास्तव में एक बुरा अनुभव है। मैं अब दूसरी शैली पर स्विच कर रहा हूं क्योंकि मुझे लगता है कि संबंधित कक्षाओं का एक साथ पालन करना आसान होगा।
एम। केज़म अखगीरी

40

संक्षिप्त उत्तर: एक पैकेज प्रति मॉड्यूल / सुविधा, संभवतः उप-पैकेज के साथ। एक ही पैकेज में संबंधित चीजों को एक साथ रखें। पैकेज के बीच परिपत्र निर्भरता से बचें।

लंबे उत्तर: मैं इस लेख से सहमत हूं


2
उप पैकेज, विघटन को तोड़ते हैं। एक "उप-पैकेज" वास्तव में अपने आप में एक पूरी तरह से स्वतंत्र पैकेज है
रिकार्डो गाम्बा

21

मैं परतों से पहले फीचर पसंद करता हूं, लेकिन मुझे लगता है कि यह आपके प्रोजेक्ट पर निर्भर करता है। अपनी ताकतों पर विचार करें:

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

उदाहरण:

com/company/module
  + feature1/
    - MainClass          // The entry point for exploring
    + api/               // Public interface, used by other features
    + domain/
      - AggregateRoot
      + api/             // Internal API, complements the public, used by web
      + impl/ 
    + persistence/       
    + web/               // presentation layer 
    + services/          // Rest or other remote API 
    + support/            
  + feature2/
  + support/             // Any support or utils used by more than on feature
    + io
    + config
    + persistence
    + web

यह सिर्फ एक उदाहरण है। यह काफी औपचारिक है। उदाहरण के लिए यह फीचर 1 के लिए 2 इंटरफेस को परिभाषित करता है । आम तौर पर इसकी आवश्यकता नहीं होती है, लेकिन एक अच्छा विचार हो सकता है यदि विभिन्न लोगों द्वारा अलग-अलग उपयोग किया जाता है। आप आंतरिक API को सार्वजनिक रूप से बढ़ा सकते हैं।

मुझे 'निहित' या 'समर्थन' नाम पसंद नहीं हैं, लेकिन वे महत्वपूर्ण (डोमेन और एपीआई) से कम महत्वपूर्ण सामान को अलग करने में मदद करते हैं। जब नामकरण की बात आती है तो मैं यथासंभव ठोस होना पसंद करता हूं। यदि आपके पास 20 कक्षाओं के साथ 'बर्तन' नामक एक पैकेज है, तो StringUtilsसमर्थन / स्ट्रिंग, HttpUtilसमर्थन / http और इतने पर स्थानांतरित करने के लिए।


13

क्या जावा में पैकेज के संगठन के संबंध में सर्वोत्तम प्रथाएं हैं और उनमें क्या जाता है?

नहीं वास्तव में कोई नहीं। बहुत सारे विचार हैं, और बहुत सी राय है, लेकिन वास्तविक "सर्वोत्तम अभ्यास" आपके सामान्य ज्ञान का उपयोग करना है!

(कृपया "सर्वोत्तम प्रथाओं" और उन्हें बढ़ावा देने वाले लोगों के परिप्रेक्ष्य में कोई सर्वोत्तम अभ्यास न पढ़ें ।)

हालांकि, वहाँ एक प्रमुख है कि शायद व्यापक स्वीकृति है। आपकी पैकेज संरचना को आपके एप्लिकेशन (अनौपचारिक) मॉड्यूल संरचना को प्रतिबिंबित करना चाहिए, और आपको मॉड्यूल के बीच किसी भी चक्रीय निर्भरता को कम करने (या आदर्श रूप से पूरी तरह से बचने) का लक्ष्य रखना चाहिए।

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

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


9

मैंने कुछ लोगों को 'पैकेज बाय फ़ीचर' लेयर द्वारा 'लेयर बाय फ़ीचर' को प्रमोट करते देखा है, लेकिन मैंने कई सालों में कुछ एप्रोच का इस्तेमाल किया है और 'पैकेज बाय लेयर' को 'पैकेज बाय फ़ीचर' से बेहतर पाया है।

इसके अलावा मैंने पाया है कि एक हाइब्रिड: 'पैकेज बाय मॉड्यूल, लेयर' तो फीचर 'स्ट्रैटेजी' बहुत कारगर साबित होती है क्योंकि इसमें 'पैकेज बाय फीचर' के कई फायदे हैं:

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

मैं यहां गहराई से समझाता हूं: जावा पैकेज नाम संरचना और संगठन लेकिन मेरा मानक पैकेज संरचना है:

revdomain.moduleType.moduleName.layer। [layerImpl] .feature.subfeatureN.subfeatureN +1 ...

कहाँ पे:

revdomain रिवर्स डोमेन उदा com.mycompany

मॉड्यूल टाइप [ऐप * | फ्रेमवर्क | उपयोग]

मॉड्यूलनाम उदाहरण के लिए myAppName यदि मॉड्यूल प्रकार एक ऐप या 'वित्त' है तो इसका लेखा जोखा

परत [मॉडल | ui | दृढ़ता | सुरक्षा आदि,]

layerImpl उदाहरण।, विकेट, jsp, jpa, jdo, हाइबरनेट (नोट: यदि परत का उपयोग नहीं किया जाता है)

सुविधा जैसे।, वित्त

सबफ़िएट्योर उदा।, लेखा

सबफ़ेचरN + 1 उदाहरण के लिए, मूल्यह्रास

* कभी-कभी ऐप 'छोड़ दिया जाता है अगर मॉड्यूल टाइप एक एप्लिकेशन है लेकिन इसे वहां रखने से पैकेज संरचना सभी मॉड्यूल प्रकारों के अनुरूप हो जाती है।


5

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

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

एक चीज जो आप कर सकते हैं, वह है कि आप वापस कदम बढ़ाएं और सोचें: यदि आप परियोजना के लिए एक नए सदस्य के रूप में पेश किए गए थे, या आपकी परियोजना को खुले स्रोत या एपीआई के रूप में जारी किया गया था, तो आप जो चाहते हैं उसे ढूंढना कितना आसान / कठिन होगा? क्योंकि मेरे लिए, यही मैं वास्तव में पैकेजों से बाहर चाहता हूं: संगठन। मैं अपने कंप्यूटर पर फ़ोल्डर में फ़ाइलों को कैसे संग्रहीत करता हूं, इसके समान, मैं अपने पूरे ड्राइव को खोजने के बिना उन्हें फिर से खोजने में सक्षम होने की उम्मीद करता हूं। मुझे लगता है कि पैकेज में सभी वर्गों की सूची को खोजने के बिना मैं जिस वर्ग को खोजना चाहता हूं, उसे प्राप्त करने में सक्षम हूं।

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