जावा में लिखे एपीआई में आंतरिक कक्षाओं को कैसे एनकैप्सुलेट किया जाए?


9

हमें एक पुस्तकालय लिखना है। स्वाभाविक रूप से, इसमें केवल बहुत छोटा एपीआई होना चाहिए (जितना संभव हो उतना छोटा होना चाहिए)। पुस्तकालय के आंतरिक भाग कुछ जटिल हैं। इसलिए, उन्हें संरचना की आवश्यकता है।

संरचना के लिए मैं वर्तमान में दो तरीके देखता हूं:

1. संकुल का उपयोग करें।

पेशेवरों: पुस्तकालय बड़े करीने से संरचित किया जा सकता है। सब कुछ अपनी जगह।

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

2. स्थिर आंतरिक कक्षाओं का उपयोग करें, सभी एक पैकेज में।

पेशेवरों: केवल बहुत कम सार्वजनिक चीजें (कक्षाएं, विधियाँ आदि) की आवश्यकता।

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


क्या एक अच्छी तरह से संरचित पुस्तकालय में एक छोटा सा एपीआई प्राप्त करने का एक बेहतर तरीका है?

संपादित करें: मैं उल्लेख करना भूल गया: यह एक एंड्रॉइड लाइब्रेरी के लिए है। इसलिए, कोई java9 नहीं।


आपके आंतरिक वर्गों को स्थिर होने की आवश्यकता क्यों है?
डेविड अरनो

क्या आंतरिक कक्षाएं कोड इकाइयों को बड़ा नहीं बनाती हैं? मेरा मतलब है कि कई आंतरिक वर्गों के साथ एक वर्ग बहुत लंबा हो सकता है।
ट्यूलेंस कोरडोवा

2
@ TulainsCórdova, अच्छी बात है, मैंने "आंतरिक" शब्द को "आंतरिक" के रूप में पढ़ा है, जो मुझे लगता है कि जावा "पैकेज-प्राइवेट" कहता है। एक लिबर बनाने का सामान्य तरीका निश्चित रूप से एक पैकेज है, जिसमें कुछ सार्वजनिक वर्ग शामिल हैं, बाकी सब कुछ आंतरिक / पैकेज-निजी है।
डेविड अरनो

हाय @frmarkus। मैंने आपके प्रश्न के शीर्षक को फिर से लिखने के लिए और अधिक विशिष्ट होने की कोशिश की और "अस्पष्ट मत पूछो कि तुम क्या पूछ रहे हो"। यदि आपको लगता है कि यह आपके वास्तविक प्रश्न को गलत ढंग से प्रस्तुत करता है, तो इसे फिर से संपादित करने के लिए स्वतंत्र महसूस करें।
एंड्रेस एफ।

1
@ TulainsCórdova: हाँ, कोड इकाइयों को बड़ी (फाइल के कोड की 3k लाइनें) का रास्ता मिलता है। इस तरह की संरचना की एक और महत्वपूर्ण समस्या है।
मार्कस फ्राउएनफेल्डर

जवाबों:


1

मैं देखता हूं कि आप 2 के साथ क्या कर रहे हैं। आप संकुल के रूप में कक्षाओं को मॉड्यूल के रूप में उपयोग कर रहे हैं ताकि आप पैकेज के भीतर खुद को अलग कर सकें लेकिन फिर भी कक्षाओं के साथ पैकेज के भीतर व्यवस्थित करें।

वह बहुत चालाक है। चतुर से सावधान रहें।

यह आपको एक ही स्रोत फ़ाइल (जिसे आप पसंद कर सकते हैं) में कई वर्गों को जाम करने के लिए मजबूर करेगा और पथ में एक अतिरिक्त पूंजीकृत शब्द होगा।

यह आपको पैकेज के भीतर किसी भी परीक्षा कोड को लिखने के लिए भी मजबूर करेगा जब तक कि आप बाहर से अपना रास्ता हैक करने के लिए प्रतिबिंब का उपयोग नहीं करते हैं।

अन्य तो यह, यह काम करेगा। यह सिर्फ अजीब लगेगा।

हैशटेबल में एंट्रीसेट की तरह इस्तेमाल किए जाने वाले आंतरिक वर्गों के लिए लोग अधिक उपयोग किए जाते हैं । यह निजी है इसलिए मैं इसे नहीं बना सकता, लेकिन यह एक सार्वजनिक इंटरफ़ेस को लागू करता है इसलिए मैं बस इंटरफ़ेस के माध्यम से इसके बारे में बात करता हूं और मेरे लिए कुछ हड़प सकता हूं।

लेकिन आप उन कक्षाओं का वर्णन कर रहे हैं जो आप नहीं चाहते हैं कि मैं एक इंटरफेस के माध्यम से भी बात करूं। तो मेरे लिए कोई इंटरफ़ेस नहीं। इसका मतलब है कि मेरे पास देखने के लिए और भ्रमित होने के लिए कुछ भी नहीं है (जब तक कि आप मुझे स्रोत प्रदान नहीं करते)।

सबसे बड़ा मुद्दा मुझे पूर्वाभास है कि यह एपीआई को बनाए रखने के लिए नया भ्रामक है। आप उन पर प्रलेखन और टिप्पणियां फेंक सकते हैं, लेकिन जब वे नहीं पढ़ते हैं या किसी एक पर भरोसा नहीं करते हैं, तो उन्हें अतिरंजित न करें।

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

डिफ़ॉल्ट एक्सेस संशोधक (कोई संशोधक) संभवत: आप यहां उपयोग करेंगे जब तक कि आप मुझे विरासत के माध्यम से चुपके नहीं करते हैं, जिसमें मामला संरक्षित है।

Modifier        Class     Package   Subclass  World
public          Y         Y         Y         Y
protected       Y         Y         Y         N
no modifier     Y         Y         N         N
private         Y         N         N         N 

क्या आप वास्तव में चाहते हैं मॉड्यूल का उपयोग है। इस तरह आप एक पैकेज में अपने परीक्षण और दूसरे में कोड रख सकते हैं। अफसोस की बात है कि हमारे पास यह जावा में नहीं है।

ज्यादातर लोग सिर्फ 1 करते हैं और एपीआई का विस्तार करते हैं। इंटरफेस के उचित उपयोग से दबाव बंद हो जाता है।

हैकिंग जो आप 1 में चाहते हैं वह और भी बदसूरत है। कॉल स्टैक पर तिरछी नज़र डालें और जब भी आपको बुलाया गया पैकेज से कोई अपवाद न हो, जो आपको पसंद न हो। Eeew।


3

हर तरह से, अपने कोड को संकुल में अलग करें। यह स्थिरता बनाए रखने की दिशा में एक लंबा रास्ता तय करेगा।

अंत-उपयोगकर्ताओं को उन चीजों तक पहुंचने से रोकने के लिए जो उन्हें नहीं चाहिए, आपको अपने एपीआई को इंटरफ़ेस और कार्यान्वयन में अलग करना होगा।

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

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


1
दुर्भाग्य से, यह एक पूर्ण नहीं है। यह कई सार्वजनिक वर्गों को छोड़ देता है। उनके संकेत (कारखाने या 'आंतरिक' होने) हो सकते हैं। लेकिन मुझे उन्हें ( सभी सार्वजनिक वर्ग को) अतिरिक्त टूलिंग लागू करनी होगी , यह अच्छा नहीं है।
मार्कस Frauenfelder 7

@frmarkus - मुझे लगता है कि (1) आप पहुंच नियंत्रणों से बहुत अधिक उम्मीद कर रहे हैं, या (2) आपको अपने पैकेज संरचना पर फिर से विचार करने की आवश्यकता है ताकि एक पैकेज से कक्षाएं दूसरे से कक्षाओं पर निर्भर न हों पैकेज (यदि आप सब कुछ स्थिर नेस्टेड वर्गों के रूप में रख सकते हैं तो यह मुश्किल नहीं होना चाहिए)।
kdgregory
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.