क्या IComparable इंटरफ़ेस पुराना है / "हानिकारक"?


11

IComparable केवल एक ही तरह से काम करता है

मान लीजिए कि आपके पास एक Employeeवर्ग है। एक दृश्य में, आप Employeesनाम के आधार पर सभी को दिखाना चाहते हैं - दूसरे में, पते से। आप इसे कैसे प्राप्त करने जा रहे हैं? साथ नहीं IComparable, कम से कम किसी मुहावरेदार तरीके से तो नहीं।

IComparable गलत जगह तर्क है

इंटरफ़ेस का उपयोग कॉल करके किया जाता है .Sort()Customerनाम के आधार पर छांटे गए दृश्य में , यह बताने के लिए कोई कोड नहीं है कि यह कैसे छंटने वाला है।
दूसरी ओर, Customerवर्ग यह मान रहा है कि इसका उपयोग कैसे होने जा रहा है - इस मामले में, कि इसका उपयोग नामों द्वारा क्रमबद्ध सूची में किया जाएगा।

IComparable अंतर्निहित रूप से उपयोग किया जाता है

विकल्पों के साथ तुलना में, यह देखना बहुत मुश्किल है कि तुलनात्मक तर्क का उपयोग कहां किया जा रहा है - या यदि बिल्कुल भी। अपने मानक आईडीई को मानकर और Customerकक्षा से शुरू करके मुझे करना होगा

  1. सभी संदर्भों के लिए खोजें Customer
  2. उन संदर्भों को खोजें जो एक सूची में उपयोग किए जाते हैं
  3. जांचें कि क्या उन सूचियों ने कभी उन पर .Sort()कॉल किया है

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

ये मुद्दे संयुक्त, प्लस बदलती आवश्यकताएं हैं

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

प्रश्न

ये मुद्दे मुझे किसी भी वैध उपयोग के मामले को न देखने के विकल्प के IComparableरूप में IComparerया उससे भी कमतर के बारे में सोचते हैं .OrderBy(), जो विकल्पों द्वारा बेहतर तरीके से नहीं परोसा जाएगा।
क्या IComparerLINQ का उपयोग करना हमेशा बेहतर होता है , या ऐसे फायदे / उपयोग के मामले हैं जो मैं यहाँ नहीं देख रहा हूँ?


2
आपकी नई "सॉर्ट दो अलग-अलग तरीके" आवश्यकता एक लाल हेरिंग है। इसे हल करने के लिए, आपको अपने सॉर्ट फ़ंक्शन के लिए एक अलग तुलनित्र पास करना होगा।
रॉबर्ट हार्वे

@RobertHarvey तो आप IComparableअब और उपयोग नहीं करेंगे, जो मेरी बात को पुष्ट कर रहा है।
आर। शमित्ज़

यह मत भूलो कि यदि आप SortedXXXसंग्रह का उपयोग करते हैं , तो उन्हें या तो संग्रहीत तत्वों की आवश्यकता होती है IComparableया एक IComparerप्रदान की जाती है। यह भी ध्यान दें, कि एक तुलनित्र के साथ प्राकृतिक क्रम क्रम को उल्टा करना तुच्छ है और यह सभी IComparableवस्तुओं के साथ काम करता है।
बेरिन लोरिट्श

2
इससे कोई फर्क नहीं पड़ता कि दो अलग-अलग इंटरफेस हैं। डिफ़ॉल्ट तुलना तंत्र IComparableमाना जाता है। का उपयोग तब किया जाता है जब आप डिफ़ॉल्ट तुलना तंत्र को ओवरराइड करना चाहते हैं। IComparer
रॉबर्ट हार्वे

जवाबों:


14

IComparableआपके द्वारा बताए गए प्रतिबंध सही हैं। यह एक इंटरफ़ेस है जो पहले से ही .NET फ्रेमवर्क 1.0 में उपलब्ध था, जहाँ वे कार्यात्मक विकल्प और लाइनक उपलब्ध नहीं थे। तो हाँ, कोई इसे एक पुरानी रूपरेखा तत्व के रूप में देख सकता है जो मुख्य रूप से पीछे की संगतता के लिए रखा गया है।

हालाँकि, बहुत सी साधारण डेटा संरचनाओं के लिए, छँटाई का एक तरीका संभवतः पर्याप्त या प्राकृतिक है। इन मामलों के लिए, आदेश संबंध को लागू करने के लिए एक विहित स्थान होना अभी भी कोड DRY को बनाए रखने का एक अच्छा तरीका है, इसके बजाय हमेशा हर OrderByजगह हर कॉल में एक ही तर्क को दोहराते हैं ।

जैसा कि आपने लिखा, "आप अपने आवेदन में 2 साल से IComparable का आनंद ले रहे हैं", इसलिए यह मेरे लिए प्रतीत होता है कि इसने आपको लंबे समय तक अच्छा काम किया है। जब आपको अब सभी कॉल को मान्य करना, बदलना और परीक्षण करना है Sort, तो यह भी एक संकेत हो सकता है कि आप एक ही तरह के लॉजिक को कई स्थानों पर कर रहे थे, जिसमें कोई गलती नहीं है IComparable। तो यह इस तर्क को एक स्थान पर केंद्रीकृत करने का अवसर हो सकता है, जिससे आपका कोड अधिक DRY हो जाएगा।


सरल डेटा संरचनाओं के बारे में अच्छी बात है। हालाँकि, अंतिम पैराग्राफ मेरे लिए 100% मायने नहीं रखता है। अगर मैंने उपयोग नहीं किया होता IComparable, तो पहले से मौजूद सभी सॉर्टिंग कोड उनके संबंधित विचारों से अछूते रह जाते, जबकि मैं केवल नए दृश्य के लिए नए सॉर्टिंग कोड जोड़ देता।
आर। शमित्ज़

@ R.Schmitz क्या IComparableआपके द्वारा लिखे गए कार्यान्वयन के बिना preexisting सॉर्ट ने सही ढंग से काम किया है ?
रॉबर्ट हार्वे

3
@ R.Schmitz: यकीन है, लेकिन अब आप हमेशा एक तुलनित्र प्रदान करने के लिए प्रतिबद्ध हैं (जब तक कि आप ऑर्डरबाय का उपयोग नहीं करते हैं, निश्चित रूप से)। के साथ IComparable, आपको मुफ्त में एक डिफ़ॉल्ट कार्यान्वयन मिलता है, और कभी-कभी आपको उस कार्यान्वयन को लिखना भी नहीं पड़ता है।
रॉबर्ट हार्वे

2
@ R.Schmitz: आपकी अंतिम टिप्पणी वहाँ बिंदु को अच्छी तरह से प्रस्तुत करती है। मैं हालांकि थोड़ा आगे जाऊंगा। मान लीजिए कि आपके पास एक संख्यात्मक प्रकार है BigInteger। यदि यह तुलना ऑपरेटरों / इंटरफेस को लागू नहीं करता है तो आप खुद भी एक IComparer को कैसे लागू करेंगे ? आपको इसे कुशलतापूर्वक या बिल्कुल करने के लिए आंतरिक डेटा संरचनाओं तक पहुंच की आवश्यकता होगी। मान लें कि आपके पास ग्राहक जैसा है; सार्वजनिक गुण जिन्हें आप क्रमबद्ध करना चाहते हैं उनकी तुलना है। मेरे लिए यह अंतर है: IComparable<T>यदि एक तुलनित्र को लागू करने के लिए कॉलर से अपेक्षा करना अनुचित है तो इसे लागू करें।
एरिक लिपर्ट

1
If I hadn't used IComparable, all the pre-existing sorting code would have been left untouched in their respective views, while I'd only add new sorting code for the new view.सिर्फ इसलिए IComparableकि उस समय एक बेहतर समाधान था , इसका मतलब यह नहीं है कि यह आज सबसे अच्छा समाधान है । आपकी पहली टिप्पणी का तात्पर्य यह है कि "यह IComparable है या कुछ भी नहीं है", जो कि सच नहीं है, समस्या को कई अलग-अलग तरीकों से हल किया जा सकता है। अनुप्रयोग आकार / पैमाने में विकसित हो सकते हैं, और जो चीजें उपयुक्त दिखती थीं, वे अनुप्रयोग की बढ़ती मांगों के साथ रखने में सक्षम नहीं हो सकती हैं।
फ्लेटर

1

मैं आपकी भावनाओं से सहमत हूं IComparable

केवल टिप्पणियों पर ध्यान दें Array.Sort()

  • सरणी के प्रत्येक तत्व को सरणी में IComparableहर दूसरे तत्व के साथ तुलना करने में सक्षम होने के लिए इंटरफ़ेस को लागू करना होगा । (या अपवाद फेंका गया है)
  • यदि सॉर्ट सफलतापूर्वक पूरा नहीं हुआ है, तो परिणाम अपरिभाषित हैं।

हम शायद अब प्रेरणा कभी नहीं करेंगे, हालांकि! object.Equals()प्रत्येक वस्तु पर एक विधि पर विचार करें जो आपको वस्तुओं को एक दूसरे से तुलना करने की अनुमति देता है यह देखने के लिए कि क्या वे "समान" हैं

आपके पास वह पहले से ही है, लेकिन Array.Sort()आपको जोड़ने की इच्छा के साथ काम सौंपा गया हैobject.Compare(object)

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