2010-05-29 12 views
7

सार्वजनिक उपभोग के लिए एक एपीआई को पैकेजिंग पर काम करना मुश्किल है। इस प्रकार मैं उन तरीकों को सीमित करने की कोशिश कर रहा हूं जो केवल उन लोगों के सामने आती हैं जिन्हें मैं सार्वजनिक और सहायक होना चाहता हूं। इस कोर्स के नीचे सीमित पहुंच विधियों की भीड़ है।क्या मेरी आंतरिक एपीआई कक्षाएं सभी एक पैकेज में होनी चाहिए?

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

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

तो, मेरे पास साफ-अलग पृथक पैकेजों में लगभग 70 या 80 आंतरिक कक्षाएं हैं लेकिन अत्यधिक अनुमोदित पहुंच संशोधक के साथ। क्या आप कहेंगे कि एक ही पैकेज दो बुराइयों में से कम है या क्या अधिक बारीक पैकेज रखने के दौरान मेरे आंतरिक तरीकों को मुखौटा करने में सक्षम होने का एक बेहतर तरीका है?

मैं यहाँ सबसे अच्छा अभ्यास पता लगाने के लिए दिलचस्पी होगी।

मैं जैसा कि आप देख वे दो पैकेज में आम सर्वलेट एपीआई और http अलग किया है पहले से ही This

+0

मुझे लगता है कि प्रश्न थोड़ा सा व्यक्तिपरक है: मैं, व्यक्तिगत रूप से, डिजाइन निर्णयों को पसंद नहीं करता जो खराब आंतरिक संगठन की ओर ले जाता है, जैसे आपके सभी कक्षाओं में एक-पैकेज केस। लेकिन ऐसी चीजों को करने का सही तरीका अभी ध्यान में नहीं आता है। – incarnate

उत्तर

7

है कि एक ही पैकेज में सभी वर्गों रखने शामिल नहीं है आपके सवाल का दो समाधान कर रहे हैं।

पहले दोस्त Accessor/Friend Package पैटर्न (प्रैक्टिकल एपीआई डिजाइन, Tulach 2008) में वर्णित उपयोग करने के लिए है।

दूसरा ओएसजीआई का उपयोग करना है। ओएसजीआई इसे कैसे पूरा करता है यह समझाते हुए एक लेख here है।

संबंधित प्रश्न: 1, 2, 3, और 4

+0

यह एक उत्कृष्ट उत्तर है और मित्र पैकेज का लिंक सिर्फ वह समाधान था जिसे मैं ढूंढ रहा था। – Chris

+0

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

+0

ठीक है, आपको अभी भी आंतरिक सार एक्सेसर सार्वजनिक (इस प्रकार एपीआई का एक हिस्सा) बनाना है। इससे भी बदतर, एक बुरा उपयोगकर्ता अपना स्वयं का एक्सेसर इंपल प्रदान कर सकता है, इस प्रकार आपके आंतरिक पैकेज को इसके बजाय अपने स्वयं के एपीआई का उपयोग करने के लिए मजबूर कर सकता है। यह तब तक काम करेगा जब तक आइटम क्लास प्रारंभ नहीं हो जाती है और IllegalStateException को आग लगती है। – charlie

2

एक उदाहरण के बारे में पता Servlet API हो सकता हूँ।

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

+0

+1 जानकारी के लिए धन्यवाद। मुझे पता है कि मैं समस्या को दूर कर सकता हूं लेकिन असल में मैं उन उपयोगकर्ताओं को प्रतिबंधित करना चाहता हूं जिनके पास एपीआई और कार्यान्वयन जार दोनों गैर-इंटरफ़ेस कार्यान्वयन विधियों तक पहुंचने में सक्षम नहीं हैं। – Chris

1

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

मैं सार्वजनिक रूप से दिखाई कलाकृतियों करने के लिए एपीआई /आंतरिक को पैकेज और आंतरिक जोड़ने के लिए सम्मेलन/पसंद है। अंत में आप के साथ खत्म हो जाते हैं।

 

# this package is allowed to be accessed by api-users 
com.foo.users.api 
# this is completely internal logic (api implementation) 
# should only be touched by the api-module itself. 
com.foo.users.internal 
 

इस तरह आपके पास अलग अलगाव है और स्थिर कोड विश्लेषण कोड-नियम भी चला सकता है।

सर्वलेट-api आप ऊपर बताए गए विभिन्न जार करने के लिए भी आगे विभाजन एपीआई बनाम impl कर सकते हैं के साथ की तरह

। लेकिन इसमें जीवन-निर्माण और मॉड्यूल बनाए रखने के लिए और अधिक प्रयास शामिल हैं, इसलिए मैं केवल ऐसा ही करूंगा जहां एक पूर्ण रनटाइम आर्टिफैक्ट विभाजन समझ में आता है (जैसे जेएसआर-स्पेक बनाम इम्प्लायर)।

संबंधित मुद्दे