ইন্টারফেস বা ক্লাস রিটার্ন করুন


9

ধরুন আমার একটা পদ্ধতি আছে

public List<User> GetBatchOfUsers(IEnumerable<int> userIDs)
{
    List<User> users = new List<User>();

    // some database stuff

    return users;
}

আমি পড়েছি যে কোনও ফেরতের বিপরীতে কোনও ইন্টারফেস (হয় IListবা IEnumerable) ফেরত দেওয়া ভাল List। আমি এটি করার জন্য শুনেছি কিছু যুক্তি হ'ল এটি ডেটা লুকিয়ে রাখে এবং এটিপি বিকাশকারীকে পরবর্তী তারিখে ডেটার অভ্যন্তরীণ উপস্থাপনা পরিবর্তন করার নমনীয়তা দেয়।

সবেমাত্র ফেরত দেওয়ার বিষয়ে আমার উদ্বেগ IEnumerableহ'ল আপনি এলোমেলো অ্যাক্সেস এবং Countসম্পত্তি হিসাবে কার্যকারিতা হারাবেন ।

আমি জানি যে IEnumerableএকটি প্যারামিটার হিসাবে গ্রহণ করা অর্থবোধ করে, কারণ এটি গ্রাহককে আমার পদ্ধতিতে ডেটা প্রেরণের সবচেয়ে ভাল নমনীয়তা দেয়, পদ্ধতিটি পরিচালনার জন্য প্রয়োজনীয়তার সংক্ষিপ্ততম সেট ist

রিটার্ন টাইপের জন্য সেরা অনুশীলন কী?


5
আরও গুরুত্বপূর্ণ: প্যারামিটারের ধরন হিসাবে একটি ইন্টারফেস নিন।
মাইকেল বর্গওয়ার্ট

উত্তর:


10

সাধারণভাবে বলতে গেলে, আপনি ইন্টারফেস দিয়ে শুরু করতে পারেন এবং প্রত্যাশার চেয়ে অতিরিক্ত পদ্ধতি ব্যবহার করে যদি আপনি দেখতে পান তবে কেবলমাত্র কংক্রিটের ধরণটিকে রিটার্নের ধরণ হিসাবে রেখে দিতে পারেন।

ঠিক আছে, আপনি যদি কোনও ইন্টারফেস ফিরিয়ে দেন তবে আপনি আরও নমনীয়তা বজায় রাখবেন। আপনি পরে কোনও পৃথক কংক্রিটের প্রকার ফিরে আসতে বাস্তবায়ন পরিবর্তন করতে পারেন। অন্যদিকে, এটি অবশ্যই কলারকে কম তথ্য দেয়, তাই তারা কিছু নির্দিষ্ট ক্রিয়াকলাপ করতে সক্ষম নাও হতে পারে। (উদাহরণস্বরূপ: আপনি যদি ফিরে যান List<T>তবে কলার কনভার্টআল ইত্যাদি ব্যবহার করতে পারেন ... যা আপনি কেবল ঘোষণা করেন যে আপনি ফিরে এসেছেন IList<T>।) কিছু পরিস্থিতিতে এটি কংক্রিটের ধরণ উল্লেখ করার মতো।

গণনা বা বাছাই পদ্ধতি সম্পর্কে, এর জন্য কোনও মান সংগ্রহের ইন্টারফেস নেই। তবে আপনি যে কোনও আইলিস্টকে বাছাই বা গণনা করতে একটি এক্সটেনশন পদ্ধতি লিখতে পারেন।


আমার ধারণা এটি তখন খুব শক্ত নিয়ম নয়?
ম্যাথু

হ্যাঁ, এটি সত্যিই ব্যবহারের উপর নির্ভর করে।
ইউসুবভ

1

আপনার সংগ্রহের প্রয়োজন হলে আপনার Countব্যবহার করতে পারেন ICollection<T>যা যথেষ্ট সাধারণ।


-1। গণনা ইতিমধ্যে আলোচনা করা হয়েছিল এবং এই উত্তরটি নতুন কিছু যোগ করে না
সুপার

@ কনরাড রুডল্ফ, এটি কোনও উত্তর নয়, এটি একটি মন্তব্য।
সুপারম

@ সুপারএম এটির নিজের জবাবের যোগ্যতা অর্জনের পক্ষে এটি যথেষ্ট মূল্যবান, কারণ আমি স্পষ্টতই প্রথম স্থানে ইন্টারফেসের বিরুদ্ধে সিদ্ধান্ত নেওয়ার জন্য ওপির কারণকে সুস্পষ্টভাবে সম্বোধন করি।
কনরাড রুডল্ফ

1

আপনি যে পদ্ধতিটি নির্ধারণ করছেন তার জন্য আপনি বিচক্ষণতার সাথে ফিরে আসুন। আপনি কি ধারাবাহিক আইটেম ফেরত যাচ্ছেন (ফোকাসগুলি আইটেমগুলির উপরে রয়েছে), বা এটি কোনও আইটেমের সংগ্রহ ফিরিয়ে দিচ্ছে (পুরো সংগ্রহটি ফোকাসটি কেন্দ্র করে)? সংগ্রহের বাস্তবায়নে বৈকল্পিকতা দেওয়া কি সার্থক? যদি এটি কোনও জেনারেটর ব্যবহার করে তা বোঝা যায় না HashSetতবে কেবল এটি ব্যবহার করুন List


1

উদাহরণ পদ্ধতির জন্য নির্দিষ্ট: আপনি ঠিক বলেছেন যে ফিরে আসার IEnmuerable<T>অর্থ আপনার কার্যকারিতা Countএবং সূচকগুলি হারাবে (যদিও আপনি লিনকিউ পদ্ধতি ব্যবহার করতে পারতেন Count()এবং ElementAt()যেগুলি বাস্তবে প্রয়োগের ক্ষেত্রে ব্যবহৃত টাইপটি কার্যকরভাবে প্রয়োগ করা হবে IList<T>)।

আপনি যদি ফিরে এসেছিলেন তবে আপনি IList<T>কিছু কার্যকারিতা হারাবেন তবে সাধারণতার পক্ষে লাভ সম্ভবত এটির পক্ষে উপযুক্ত।

তবে এর মধ্যে আরও ভাল কিছু হতে পারে IEnumerable<T>এবং IList<T>কারণ এটি সম্ভবত গ্রাহককে ফেরত সংগ্রহটি বদলাতে বোঝায় না, তবে এটি তার ব্যবহার Countবা সূচীকরণের জন্য অর্থবোধ করে।

নেট 4.5, সেখানে এই ধরনের ইন্টারফেস: IReadOnlyList<T>


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