क्या ठोस वर्गों पर निर्भर करने के लिए इंटरफेस के लिए ठीक है?


9

मैं कस्टम त्रुटि हैंडलर के लिए जावा में इंटरफ़ेस बना रहा हूं।

एक तर्क त्रुटि ऑब्जेक्ट पास करना चाहते हैं लेकिन मुझे Exceptionकक्षा के बच्चे होने की आवश्यकता है ।

क्या इंटरफ़ेस में मेरे परिभाषित वर्ग नाम का उपयोग करना ठीक है?

क्या यह किसी कार्यान्वयन पर निर्भर नहीं होने के संदर्भ में इसे एक इंटरफ़ेस से कम कर देगा?

मैं ऐसा कुछ करने की कोशिश करता हूं:

public class CustomException {
    /* ... Implementation ... */
}

public interface Interface {

    void onError(CustomException ex);

}

क्या आप यह पूछने की कोशिश कर रहे हैं कि क्या इंटरफ़ेस में किसी अन्य वर्ग का वारिस होना ठीक है?
स्नूप

@StevieV No. मैंने प्रश्न संपादित किया, देखो।
nikachx

1
@AndresF। यह सिर्फ एक उदाहरण है और इंटरफेस में कक्षाओं का उपयोग करने के बारे में किसी भी ओओ भाषा पर लागू किया जा सकता है।
nikachx

3
मुझे बताएं: CustomExceptionकार्यान्वयन का हिस्सा है या इंटरफ़ेस का हिस्सा है?
user253751

2
@ मिनाचैक्स मुझे समझ में नहीं आता कि आप "सुरक्षित" से क्या मतलब है। किन तरीकों से Stringसुरक्षित है CustomException? यह क्यों मायने रखता है CustomException, अगर बदले में, अन्य निर्भरताएं हैं?
एंड्रेस एफ।

जवाबों:


2

पहले मुझे इस तथ्य को इंगित करना होगा जो CustomExceptionविस्तार नहीं करता है Exceptionइसलिए यह वास्तव में नहीं है Exception

ने कहा कि:

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

दुसरे हाथ में:

यदि आप डीआईपी का पालन करना चाहते हैं (जिसके अनगिनत फायदे हैं और मेरी सिफारिश है), तो आपको दो काम करने होंगे:

विकल्प 1

  • CustomExceptionअमूर्त बनाओ
  • void onError(CustomException ex)जैसा है वैसा रखो

विकल्प 2

  • CustomExceptionएक इंटरफ़ेस बनाओ
  • void onError(CustomException ex)जैसा है वैसा रखो

उन विकल्पों में से किसी के साथ आप डीआईपी के अनुरूप होंगे, क्योंकि इंटरफ़ेस किसी भी ठोस वर्ग पर निर्भर नहीं होगा, केवल गर्भपात पर।

निर्भरता उलटा के एक सीधे आवेदन में, सार ऊपरी / नीति परतों के स्वामित्व में हैं। यह आर्किटेक्चर उच्च / नीति घटकों और अमूर्त समूहों को जोड़ता है जो एक ही पैकेज में एक साथ निचली सेवाओं को परिभाषित करते हैं। निचले स्तर की परतें इन सार वर्गों या इंटरफेस की विरासत / कार्यान्वयन द्वारा बनाई जाती हैं । मार्टिन, रॉबर्ट सी। (2003)।

  • चुस्त सॉफ्टवेयर विकास, सिद्धांत,> पैटर्न, और व्यवहार। शागिर्द कक्ष। पीपी। 127–131। आईएसबीएन 978-0135974445

1
एक अमूर्त वर्ग या एक ठोस (गैर-अंतिम) वर्ग को स्वीकार करने के बीच बहुत अंतर नहीं है, और एक इंटरफ़ेस का अंतर इससे बहुत अधिक नहीं है। जब तक उदाहरण को एक पैरामीटर के रूप में पारित किया जाता है और आपके कार्यान्वयन में हार्ड-कोड नहीं किया जाता है, तो आपके पास DI के लिए नींव है।
बजे जैकब रायहले

@JacobRaihle कार्यान्वयन में हार्ड-कोडित एक उदाहरण पारित करने से आपका क्या मतलब है?
ट्यूलेंस कोर्डोवा

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

@JacobRaihle "निर्भरता उलटा के एक प्रत्यक्ष आवेदन में, सार ऊपरी / नीति परतों के स्वामित्व में हैं। यह वास्तुकला उच्च / नीति घटकों और सार है जो एक ही पैकेज में एक साथ निचली सेवाओं को परिभाषित करते हैं। निचले स्तर की परतें बनाई जाती हैं। इन सार वर्गों या इंटरफेस की विरासत / कार्यान्वयन के द्वारा । " मार्टिन, रॉबर्ट सी। (2003)। फुर्तीली सॉफ्टवेयर विकास, सिद्धांत, पैटर्न और व्यवहार। शागिर्द कक्ष। पीपी। 127–131। आईएसबीएन 978-0135974445
ट्यूलेंस कोरडोवा

यदि आप एक उचित डिफ़ॉल्ट प्रदान कर सकते हैं तो एक सार वर्ग की बात क्या है? वह प्रदान करके आप क्या खोते हैं ? सिर्फ किताबें उद्धृत मत करो, सोचो।
जैकब रायहले

2

ट्यूलेंस सही है - इंटरफेस हर समय कंक्रीट कक्षाओं पर निर्भर करता है। वे केवल अपनी चिंताओं के लिए एक अनुबंध बनाने के लिए हैं। उस अनुबंध में किसी भी प्रकार का डेटा लेना और वापस लेना शामिल हो सकता है।

याद रखें कि उच्च स्तर की भाषाओं में, यहां तक ​​कि आदिम प्रकार भी आदिम नहीं हैं। तो आप वैसे भी ठोस प्रकार के साथ काम कर रहे हैं!


0

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

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

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


नहीं, मेरा मतलब प्रतिबिंब नहीं है। हां, जैसा कि आप उल्लेख करते हैं अपवाद और डेटा संरचनाएं इंटरफेस में उपयोग की जा सकती हैं, क्योंकि वे केवल डेटा होते हैं और प्लेटफ़ॉर्म या अन्यथा अन्य वर्गों पर निर्भर नहीं होते हैं। धन्यवाद।
nikachx

2
ओपी प्रश्न पूछने वाले उत्तर ... बस एक टिप्पणी में पूछें, फिर अपना उत्तर प्रदान करें।
स्नूप

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