আইকোপমারেবল ইন্টারফেস কি পুরানো / "ক্ষতিকারক"?


11

IComparable শুধুমাত্র একটি উপায় কাজ করে

ধরা যাক আপনার একটা Employeeক্লাস আছে। এক দর্শনে, আপনি Employeesনাম অনুসারে বাছাই করা - অন্যটিতে, ঠিকানার মাধ্যমে দেখতে চান। আপনি কিভাবে এটি অর্জন করতে যাচ্ছেন? সাথে নয় IComparable, কমপক্ষে কোনও অহঙ্কারী পদ্ধতিতে নয়।

IComparable ভুল জায়গায় যুক্তি আছে

ইন্টারফেস কল করে ব্যবহার করা হয় .Sort()Customerনাম অনুসারে বাছাই করা একটি দৃশ্যে , কীভাবে এটি বাছাই হচ্ছে তা বোঝাতে কোনও কোড নেই।
অন্যদিকে, Customerবর্গটি এটি কীভাবে ব্যবহার করা হচ্ছে তা ধরে নিচ্ছে - এই ক্ষেত্রে, এটি নাম অনুসারে বাছাই করা একটি তালিকায় ব্যবহৃত হবে।

IComparable স্পষ্টভাবে ব্যবহৃত হয়

বিকল্পগুলির সাথে তুলনা করে, তুলনা করার যুক্তিটি কোথায় ব্যবহৃত হচ্ছে - বা তা আদৌ দেখা খুব কঠিন। আপনার মানক আইডিই ধরে এবং Customerক্লাস থেকে শুরু করে , আমাকে করতে হবে

  1. সমস্ত রেফারেন্স অনুসন্ধান করুন Customer
  2. একটি তালিকাতে ব্যবহৃত রেফারেন্সগুলি সন্ধান করুন
  3. Lists তালিকাগুলি সেগুলি কখনও কল করেছে কিনা তা পরীক্ষা .Sort()করুন

সম্ভবত সবচেয়ে খারাপটি, যদি আপনি এমন একটি IComparableবাস্তবায়ন ব্যবহার করেন যা এখনও ব্যবহৃত হচ্ছে, আপনি কোনও ত্রুটি বা সতর্কতা পাবেন না। আপনি যে জায়গাগুলি ভেবেছিলেন তা অস্পষ্ট এমন সব জায়গায় ভুল আচরণই আপনি পাবেন।

এই সমস্যাগুলি সম্মিলিত, সাথে সাথে প্রয়োজনীয় পরিবর্তনগুলি

আমি এটি সম্পর্কে চিন্তাভাবনা করতে এসেছিলাম কারণ এটি আমার পক্ষে ভুল হয়ে গেছে। আমি IComparableএখন 2 বছর ধরে আমার অ্যাপ্লিকেশনটিতে সুখে ব্যবহার করছি। এখন, প্রয়োজনীয়তা পরিবর্তন হয়েছে এবং জিনিসটি 2 টি বিভিন্ন উপায়ে বাছাই করা দরকার। এটি লক্ষ্য করা গেছে যে পূর্ববর্তী বিভাগে বর্ণিত পদক্ষেপগুলির মধ্য দিয়ে যাওয়া কোনও মজাদার নয়।

প্রশ্নটি

এই সমস্যাগুলি আমাকে IComparableনিম্নমানের IComparerবা তার চেয়ে কম বিকল্প হিসাবে ভাবতে .OrderBy()বাধ্য করে, এমন কোনও বৈধ ব্যবহারের কেস না দেখে যা বিকল্পগুলির দ্বারা আরও ভালভাবে পরিবেশন করা যায় না। লিনকিউ
ব্যবহার করা কি সর্বদা ভাল IComparer, বা এখানে সুবিধাগুলি / ব্যবহারের মামলাগুলি আমি দেখছি না?


2
আপনার নতুন "বাছাই দুটি ভিন্ন উপায়ে" প্রয়োজনীয়তা একটি লাল হেরিং her এটি সমাধান করার জন্য, আপনাকে যা করতে হবে তা হ'ল আপনার বাছাইয়ের ফাংশনে একটি আলাদা তুলনামূলককে পাস করতে হবে।
রবার্ট হার্ভে

@ রবার্টহারভে তারপরে আপনি IComparableআর ব্যবহার করবেন না, যা আমার বক্তব্যকে শক্তিশালী করছে।
আর স্মিটজ

ভুলে যাবেন না যে আপনি ব্যবহার করবেন না SortedXXXসংগ্রহগুলি, তারা হয় সঞ্চিত উপাদানের প্রয়োজন হতে IComparableবা আছে IComparerপ্রদান করা হয়েছে। এছাড়াও মনে রাখবেন যে, কোনও তুলনাকারীর সাথে প্রাকৃতিক সাজানোর ক্রমটিকে বিপরীত করা এবং এটি সমস্ত IComparableবস্তুর সাথে কাজ করা তুচ্ছ ।
বেরিন লরিটস

2
দুটি ভিন্ন ইন্টারফেস আছে তা বিবেচ্য নয়। ডিফল্ট তুলনা প্রক্রিয়া IComparableবিবেচনা করা হয় । আপনি যখন ডিফল্ট তুলনা প্রক্রিয়া ওভাররাইড করতে চান তখন ব্যবহৃত হয়। IComparer
রবার্ট হার্ভে

উত্তর:


14

IComparableআপনি উল্লেখ করেছেন যে বিধিনিষেধগুলি আছে, এটি সঠিক is এটি একটি ইন্টারফেস যা ইতিমধ্যে .NET ফ্রেমওয়ার্ক 1.0 এ উপলব্ধ ছিল। যেখানে কার্যকরী বিকল্প এবং লিনক উপলব্ধ ছিল না। হ্যাঁ, কেউ এটিকে একটি পুরানো কাঠামো উপাদান হিসাবে দেখতে পাবে যা মূলত পিছনের সামঞ্জস্যের জন্য রাখা হয়।

তবে প্রচুর সাধারণ ডেটা স্ট্রাকচারের জন্য, বাছাইয়ের একটি উপায় সম্ভবত যথেষ্ট বা প্রাকৃতিক। এই ক্ষেত্রে, অর্ডার সম্পর্ক বাস্তবায়নের জন্য একটি সাধারণ স্থান থাকা কোড ডিআরওয়াই রাখার একটি ভাল উপায়, সর্বদা OrderByসমস্ত জায়গায় প্রতিটি কলে একই যুক্তি পুনরাবৃত্তি না করে ।

আপনি লিখেছেন "আপনি এখন 2 বছর ধরে আপনার অ্যাপ্লিকেশনটিতে আনন্দের সাথে আইকাম্পারেবল ব্যবহার করছেন", সুতরাং এটি আমার কাছে মনে হয় এটি দীর্ঘদিন ধরে আপনাকে ভালভাবে পরিবেশন করেছে। এখন যখন আপনাকে সমস্ত কলকে বৈধতা দিতে, পরিবর্তন করতে এবং পরীক্ষা করতে হবে Sort, এটিও আপনি অনেক জায়গায় একই ধরণের বাছাইয়ের যুক্তিটি করছিলেন এমন একটি চিহ্ন হতে পারে, যা দোষ নয় IComparable। সুতরাং আপনার কোডটিকে আরও ডিআরওয়াই করে তুললে এটি এই যুক্তিকে আরও এক জায়গায় কেন্দ্রিয় করার একটি উপলক্ষ হতে পারে।


সহজ তথ্য স্ট্রাকচার সম্পর্কে ভাল পয়েন্ট। যাইহোক, শেষ অনুচ্ছেদটি আমার কাছে 100% অর্থবোধ করে না। যদি আমি ব্যবহার না করে থাকি তবে IComparableসমস্ত প্রাক-বিদ্যমান বাছাইকরণ কোডগুলি তাদের নিজ নিজ মতামতগুলিতে অদৃশ্য হয়ে যেত, আমি কেবল নতুন দর্শনের জন্য নতুন বাছাই কোড যুক্ত করব।
আর স্মিটজ

@ আর.স্মিটজ আপনি IComparableকী লিখেছেন তা বাস্তবায়ন না করে কি প্রিসিস্টিং সাজ্ট সঠিকভাবে কাজ করবে?
রবার্ট হার্ভে

3
@ আর.স্মিটজ: অবশ্যই, তবে এখন আপনি সর্বদা তুলনামূলক সরবরাহ করতে প্রতিশ্রুতিবদ্ধ (যদি না আপনি অর্ডারবাই ব্যবহার করেন অবশ্যই)। এর সাথে IComparable, আপনি নিখরচায় একটি ডিফল্ট বাস্তবায়ন পান এবং কখনও কখনও আপনাকে সেই বাস্তবায়নটি লিখতে হয় না।
রবার্ট হার্ভে

2
@ আর.শ্মিটজ: আপনার শেষ মন্তব্যটি বিন্দুটিকে সুন্দরভাবে তুলে ধরেছে। আমি যদিও একটু দূরে যেতে হবে। ধরা যাক আপনার মতো একটি সংখ্যার টাইপ রয়েছে BigInteger। যদি এটি তুলনামূলক অপারেটর / ইন্টারফেস বাস্তবায়িত না করে তবে আপনি কীভাবে নিজেকে একজন আইকোপ্যামার প্রয়োগ করবেন ? এটিকে দক্ষতার সাথে বা একেবারে করার জন্য আপনার অভ্যন্তরীণ ডেটা স্ট্রাকচারগুলিতে অ্যাক্সেস দরকার। মনে করুন আপনার কাছে গ্রাহকের মতো প্রকার রয়েছে; প্রকাশ্য বৈশিষ্ট্য আপনার উপর বাছাই করতে ইচ্ছুক Do comparers আছে। আমার জন্য এটি পার্থক্য: কলকারী একটি তুলনামূলক বাস্তবায়নের আশা 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তখনকার সময়ে এটি একটি ভাল সমাধান ছিল , এর অর্থ এই নয় যে এটি আজকের সেরা সমাধান । আপনার এখানে প্রথম মন্তব্যটি বোঝায় যে "এটি আইকনপ্রেবল বা কিছুই নয়", যা সত্য নয়, সমস্যাটি বিভিন্নভাবে সমাধান করা যেতে পারে। অ্যাপ্লিকেশনগুলি আকার / স্কেলে প্রসারিত হতে পারে এবং যে জিনিসগুলি উপযুক্ত দেখায় তারা অ্যাপ্লিকেশনের ক্রমবর্ধমান চাহিদা মেনে চলতে না পারে।
ফ্ল্যাটার

1

আমি আপনার অনুভূতির সাথে একমত IComparable

শুধু মন্তব্য দেখুন Array.Sort()

  • অ্যারের প্রতিটি উপাদান অবশ্যই অ্যারেতে IComparableঅন্যান্য উপাদানগুলির সাথে তুলনা করতে সক্ষম হতে ইন্টারফেস প্রয়োগ করতে হবে। (বা ব্যতিক্রম নিক্ষেপ করা হয়)
  • যদি বাছাই সফলভাবে সম্পন্ন হয় না, ফলাফল অপরিবর্তিত।

আমরা সম্ভবত এখন আর অনুপ্রেরণা করব না, তবে! object.Equals()প্রতিটি বস্তুর একটি পদ্ধতি বিবেচনা করুন যা আপনাকে একে অপরের সাথে বস্তুগুলি তুলনা করতে দেয় যে তারা "একই" কিনা

আপনার কাছে এটি ইতিমধ্যে রয়েছে, তবে Array.Sort()আপনাকে যুক্ত করতে চাইলে তা যুক্ত করে দেওয়া হবেobject.Compare(object)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.