कार्यान्वयन के बजाय इंटरफ़ेस (उदाहरण के मानचित्र) का उपयोग करके जावा ऑब्जेक्ट को क्यों परिभाषित करें (हैशपॉप)


17

अधिकांश जावा कोड में, मुझे लगता है कि लोग जावा वस्तुओं को इस तरह घोषित करते हैं:

Map<String, String> hashMap = new HashMap<>();
List<String> list = new ArrayList<>();

के बजाय:

HashMap<String, String> hashMap = new HashMap<>();
ArrayList<String> list = new ArrayList<>();

वास्तव में उपयोग किए जाने वाले कार्यान्वयन के बजाय इंटरफ़ेस का उपयोग करके जावा ऑब्जेक्ट को परिभाषित करने की प्राथमिकता क्यों है?


जवाबों:


26

कारण यह है कि इन इंटरफेस का कार्यान्वयन आमतौर पर उन्हें संभालने के दौरान प्रासंगिक नहीं होता है, इसलिए यदि आप कॉल करने वाले HashMapको एक विधि को पारित करने के लिए उपकृत करते हैं , तो आप अनिवार्य रूप से उपयोग करने के लिए किस कार्यान्वयन को बाध्य कर रहे हैं। एक सामान्य नियम के रूप में, आपको वास्तविक कार्यान्वयन के बजाय इसके इंटरफ़ेस को संभालना चाहिए और दर्द और पीड़ा से बचना चाहिए, जिसके परिणामस्वरूप HashMapजब आप तय करते हैं कि आपको LinkedHashMapइसके बजाय उपयोग करने की आवश्यकता है, तो सभी विधि हस्ताक्षर को बदलने में परिणाम हो सकता है ।

यह कहा जाना चाहिए कि कार्यान्वयन के प्रासंगिक होने पर इसके अपवाद हैं। यदि आपको ऑर्डर की आवश्यकता होने पर मानचित्र की आवश्यकता होती है, तो आपको एक TreeMapया LinkedHashMapपारित होने की आवश्यकता हो सकती है, या बेहतर अभी भी SortedMapजो एक विशिष्ट कार्यान्वयन को निर्दिष्ट नहीं करता है। यह फोन करने वाले बाध्य जरूरी मानचित्र के कार्यान्वयन की एक निश्चित प्रकार पारित करने के लिए और दृढ़ता से संकेत है कि आदेश है महत्वपूर्ण। उस ने कहा, क्या आप SortedMapएक को अनसाइड और ओवरराइड कर सकते हैं ? हां, निश्चित रूप से, हालांकि परिणामस्वरूप होने वाली बुरी चीजों की अपेक्षा करें।

हालांकि सबसे अच्छा अभ्यास अभी भी तय करता है कि यदि यह महत्वपूर्ण नहीं है, तो आपको विशिष्ट कार्यान्वयन का उपयोग नहीं करना चाहिए। यह सामान्य रूप से सच है। यदि आप के साथ काम कर रहे हैं Dogऔर Catजो Animalविरासत से सबसे अच्छा उपयोग करने के लिए प्राप्त करते हैं, तो आपको आम तौर पर Dogया के लिए विशिष्ट तरीके होने से बचना चाहिए Cat। बल्कि सभी तरीकों में Dogया तरीकों Catको ओवरराइड करना चाहिए Animalऔर यह आपको लंबे समय में परेशानी से बचाएगा।


जब आपको एक मानचित्र की आवश्यकता होती है जिसे क्रमबद्ध किया जाता है, तो पैरामीटर प्रकार होना चाहिए SortedMap, न कि TreeMap
सेफलोपॉड

@ एरियन SortedMapकई कार्यान्वयनों में से एक है जो ऑर्डर देने के साथ सौदा करते हैं। वह बिंदु के अलावा है। TreeMapकुंजी के कार्यान्वयन के अनुसार वस्तुओं को भी आदेश देता है Comparableया Comparatorइंटरफ़ेस देता है।
नील

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

1
@ एरियन आह मैं देख रहा हूं कि आपका क्या मतलब है। सच है, बेहतर SortedMap के बाद से एक कार्यान्वयन के लिए मजबूर नहीं करता है। मैं उचित समायोजन करूँगा।
नील

वास्तव में, LinkedHashMapलागू नहीं होता है SortedMapSortedMapहैं ConcurrentSkipListMapऔर केवल उपवर्ग TreeMap
बोरस्कसो

10

आम आदमी के शब्दों में:

यही कारण है कि इलेक्ट्रिक अप्लायन्सेज निर्माताओं ने अपने उत्पादों का निर्माण केवल प्लग आउट केबलों के बजाय बिजली के प्लग के साथ किया, और घरों को दीवार से बाहर छीलने वाले केबलों के बजाय दीवार सॉकेट के साथ आते हैं।

इसके बजाय मानक प्लग का उपयोग करके, वे घर के आसपास किसी भी संगत प्लग में एक ही आवेदन को प्लग करने की अनुमति देते हैं।

दीवार सॉकेट के दृष्टिकोण से, यह कोई फर्क नहीं पड़ता कि आप टीवी सेट या स्टीरियो प्लग करते हैं या नहीं।

यह उपकरण और सॉकेट दोनों को अधिक उपयोगी बनाता है।

उदाहरण के लिए एक विधि लें जो एक तर्क के रूप में मानचित्र को स्वीकार करता है।

जब तक यह मानचित्र का एक उपवर्ग नहीं है, तब तक यह विधि आपके द्वारा किसी HashMap या LinkedHashMap को पास किए बिना काम करेगी।

यही लिस्कोव प्रतिस्थापन सिद्धांत है

आपके द्वारा दिए गए नमूना कोड में, इसका मतलब है कि आप बाद में किसी कारण से, हैश के ठोस कार्यान्वयन को बदल सकते हैं और आपको बाकी कोड को बदलने की आवश्यकता नहीं होगी।

सॉफ्टवेयर के साथ समस्या यह है कि, ईंटों या मोर्टार की बर्बादी के साथ बाद में चीजों को बदलना अपेक्षाकृत आसान है, लोग मानते हैं कि इस तरह के सामने वाले विचार के लायक नहीं है। लेकिन वास्तविकता ने हमें दिखाया है कि सॉफ्टवेयर रखरखाव बहुत महंगा है।


4

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

उदाहरण के लिए, यदि आपको बाद में पता चलता है कि आपको वास्तव में इसकी आवश्यकता है LinkedHashMap, तो आप किसी अन्य कोड को प्रभावित किए बिना सुरक्षित रूप से परिवर्तन कर सकते हैं।

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


3

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

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

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

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