আমি কেন তালিকা <T> আইনিউমেবল <T> এর উপরে ব্যবহার করব?


24

আমার এএসপিএনটি এমভিসি 4 ওয়েব অ্যাপ্লিকেশনটিতে আমি আইইনুমেবলগুলি ব্যবহার করি, ইন্টারফেসে প্রোগ্রাম করার মন্ত্রটি অনুসরণ করার চেষ্টা করি, বাস্তবায়ন নয়।

Return IEnumerable(Of Student)

বনাম

Return New List(Of Student)

লোকেরা আমাকে তালিকাটি ব্যবহার করতে বলছে এবং নয়নামুনযোগ্য, কারণ তালিকাগুলি কোয়েরিটি কার্যকর করতে বাধ্য হয় এবং আইয়ুমেরেবল তা করে না।

এটি কি সত্যিই সেরা অনুশীলন? কোন বিকল্প আছে? কংক্রিটের জিনিসগুলি ব্যবহার করার ক্ষেত্রে আমি অদ্ভুত বোধ করি যেখানে একটি ইন্টারফেস ব্যবহার করা যেতে পারে। আমার অদ্ভুত অনুভূতি কি ন্যায়সঙ্গত?


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

2
এটি বলা হয়েছে যে সমস্ত প্রশ্নের সম্পাদন করা উচিত যাতে মডেলটি সম্পন্ন হয় এবং দেখার জন্য প্রস্তুত লোড হয়। অর্থাত্ ভিউয়ের সবকিছু পাওয়া উচিত এবং ডাটাবেস অনুসন্ধান করা উচিত নয়।
রোয়ান ফ্রিম্যান

3
এই স্ট্যাকওভারফ্লো প্রশ্নটি এটি বেশ ভালভাবে কভার করে।
কার্ল বিলেফেল্ড

এটি একটি ভাল উত্তর, তবে আমি এটি জানতে চাই যে এটি এমভিসির সাথে প্রাসঙ্গিক। কেন সমস্ত ভিউ ইন-টাইম চলুক তাই দর্শনটিকে আইনিউমেবলস দেওয়া যাবে না?
রোয়ান ফ্রিম্যান

2
"এটি বলা হয়েছে যে সমস্ত প্রশ্নগুলি কার্যকর করা উচিত যাতে মডেলটি সম্পন্ন হয় এবং দৃশ্যের জন্য প্রস্তুত লোড হয় e অর্থ দর্শনটি সবই গ্রহণ করা উচিত এবং ডাটাবেস অনুসন্ধান করা উচিত নয়।" ওটা ফালতু কথা. আপনি যদি একটি প্রাথমিক সংখ্যা পাস করেন তবে আপনার ভিউটি এটি ডেটাবেস অনুসন্ধান করছে কিনা তা জানে বা যত্ন করে না। এবং এটাই হওয়া উচিত।
ব্যবহারকারী16764

উত্তর:


21

এমন সময় রয়েছে যখন ToList()আপনার লিনক অনুসন্ধানগুলিতে একটি করে কাজ করা আপনার প্রশ্নের সময় এবং ক্রমটি আপনি যেভাবে প্রত্যাশা করেছিলেন তা কার্যকর করা নিশ্চিত করা গুরুত্বপূর্ণ হতে পারে to এই পরিস্থিতিগুলি যদিও বিরল এবং কোনওটিই সত্যিকারের মধ্যে সেগুলি না চালানো নিয়ে খুব বেশি চিন্তা করা উচিত নয়।

দীর্ঘ গল্প সংক্ষিপ্ত, IEnumerableআপনি কেবল পুনরাবৃত্তির IListপ্রয়োজন হলে যে কোনও সময় ব্যবহার করুন, যখন আপনাকে সরাসরি সূচকের প্রয়োজন হয় এবং একটি গতিশীল আকারের অ্যারের প্রয়োজন হয় (যদি আপনার একটি নির্দিষ্ট আকারের অ্যারেতে সূচি প্রয়োজন হয় তবে কেবল একটি স্ট্যান্ডার্ড অ্যারে ব্যবহার করুন)।

এক্সিকিউশন সময় জিনিস হিসাবে, আপনি সর্বদা একটি IEnumerableপরিবর্তনশীল হিসাবে একটি তালিকা ব্যবহার করতে পারেন , তাই একটি IEnumerableকরে নির্দ্বিধায় ফিরে যান .ToList();, বা ঠিক তখন এবং সেখানে কার্যকর করার জন্য চাপ IEnumerableপ্রয়োগ .ToList()করে একটি প্যারামিটারে পাস করতে পারেন IEnumerable। কেবল সতর্কতা অবলম্বন করুন যে কোনও সময় আপনি যখন .ToList()আপনার সাথে মৃত্যুদন্ড কার্যকর করার জন্য চাপ প্রয়োগ করেন তখন আপনি যে IEnumerableচলকটি কেবল এটি করেছিলেন তা স্থির করে না এবং এটি আবার কার্যকর করে দেয়, না হলে আপনি আপনার লিনকুই ক্যোয়ারিতে অকারণে পুনরাবৃত্তিগুলি দ্বিগুণ করে শেষ করবেন।

এমভিসি সম্পর্কিত, এখানে এখানে লক্ষ করার মতো বিশেষ কিছু নেই। এটি অন্যান্য। নেট হিসাবে একই মৃত্যুদণ্ডের সময় নিয়ম অনুসরণ করতে চলেছে, আমি মনে করি আপনার আগে এমন কেউ থাকতে পারে যিনি বিগত সময়ে বিলম্বিত মৃত্যুদণ্ডের শব্দার্থ দ্বারা সৃষ্ট বিভ্রান্তির কারণে কিছুটা হলেও এমভিসির উপর দোষ চাপিয়েছিলেন যা আপনাকে বলছে এটি কোনওভাবে সম্পর্কিত, তবে এটি না. বিলম্বিত মৃত্যুদণ্ডের শব্দার্থবিজ্ঞান প্রথমে সবাইকে বিভ্রান্ত করে (এবং এমনকি পরে একটি ভাল সময়ের জন্য; তারা একটি স্পর্শকর কৌশল হতে পারে)। তবুও, আপনি যতক্ষণ না কোনও লিনকিউ ক্যোয়ারী দু'বার সম্পাদিত না হয় বা অন্য কোডের সাথে সম্পর্কিত কোনও নির্দিষ্ট ক্রমে মৃত্যুদন্ড কার্যকর করার প্রয়োজন না হওয়া অবধি কেবল এটির জন্য চিন্তা করবেন না o কার্যকর করার জন্য কার্যকর করা এবং আপনি ভাল থাকবেন।


আইইনিউরেবলস একটি ভিউ দেওয়া কি খারাপ? আপনার কি এটিকে তালিকা দেওয়া উচিত যাতে প্রশ্নগুলি দেখার সাথে সাথে সম্পাদন করা হয়?
রোয়ান ফ্রিম্যান

@ রোয়ানফ্রিমন এটি উত্তর দেওয়ার জন্য আমি কেবল একটি সম্পাদনা যুক্ত করেছি। আমার মনে হয় আপনি এমন কাউকে পেয়েছেন যা পুরোপুরি বুঝতে পারে নি (তারা দোষ দিতে পারে না, বিলম্বিত মৃত্যুদণ্ড গুরুতর জটিল এবং বিভ্রান্তিকর) এবং বিলম্বিত মৃত্যুদণ্ডের সম্পূর্ণ আচরণ বোঝার পরিবর্তে কাজ করার পরিবর্তে খারাপ জুজু পর্যন্ত এটির পদক্ষেপ নেওয়া হয়েছে I শব্দার্থবিদ্যা।
জিমি हॉফা

চমৎকার উত্তর. তাহলে আমার কি আসলেই দরকার হবে। টোললিস্ট ()? এখনও অবধি আমার অ্যাপ্লিকেশনটি কেবলমাত্র আইনিউমারেবলগুলি ব্যবহার করে এবং মডেল থেকে দর্শনটিতে প্রেরণে দুর্দান্ত কাজ করে। কোনও তালিকা বা .ToList () নেই। আমার প্রশ্ন কার্যকারিতার একটি নয় - আমি জানি আমার অ্যাপ্লিকেশন কাজ করে। আমার প্রশ্ন সেরা অনুশীলনের এক।
রোয়ান ফ্রিম্যান

4
@ রোয়ানফ্রিমন সেরা অনুশীলন হ'ল ন্যূনতম ইন্টারফেস ব্যবহার করা যা এখনও আপনার প্রয়োজনীয়তা পূরণ করে। আইনিম্যারেবল আপনার জন্য এখনই এটি করছে তাই এটি পরিবর্তন করার বিষয়ে চিন্তা করবেন না। এটি বলেছিল, এমন একদিন আসবে যখন আপনার কাছে 3 বা 10 বার একটি ক্যুরিয়র চালানো হবে এবং কেন বুঝতে হবে না, বা কেবল কোনও সন্নিবেশের আগে কোনও ক্যোয়ারী চালানো হবে বলে আশা করে না পরে এটি সম্পাদিত হয়, এই সময়গুলি আপনাকে চিনতে হবে oToList () আপনি চাইলে মৃত্যুদন্ড কার্যকর করতে বাধ্য করবেন, এবং একটি লিনকুই ক্যোয়ারী থেকে একাধিকবার একটি মূল সংখ্যা পুনরায় বলা পুরো ক্যোয়ারিকে একাধিকবার কার্যকর করবে; যখন এই ঘটনাগুলি ঘটে তখন আপনার মৃত্যুদণ্ড স্থির করুন
জিমি হোফা

1
এমনকি - Listপ্যাসিং ব্যবহার করা উচিত নয় Listযা বোঝায় যে তালিকার বিষয়বস্তুগুলি সংশোধন করতে চলেছে। আপনি যদি কোনও সংগ্রহ ফিরিয়ে দিতে চান তবে ব্যবহার করুন IReadOnlyCollectionListপদ্ধতিগুলির মধ্যে ব্যবহারের জন্য, এবং তালিকাটি পরিবর্তনকারী পদ্ধতির মধ্যে বিনিময় করার জন্য। এটাই!
এরিক

7

দুটি বিষয় আছে।

IENumerable<Data> query = MyQuery();

//Later
foreach (Data item in query) {
  //Process data
}

"প্রসেস ডেটা" লুপটি পৌঁছে যাওয়ার পরে, কোয়েরিটি আর বৈধ হয়ে উঠবে না। উদাহরণস্বরূপ, যদি কোয়েরিটি এমন ডেটা কনটেক্সটটিতে চলছে যা ইতিমধ্যে নিষ্পত্তি করা হয়েছে, তবে আপনার কোডটি একটি ব্যতিক্রম ছুঁড়ে দেবে। আপনি কোথাও এটি তৈরি করেছেন তার চেয়ে আলাদা প্রসঙ্গে যখন কোনও ক্যোয়ারী প্রক্রিয়াকরণ করছেন তখন এই জাতীয় জিনিসটি খুব বিভ্রান্ত হয়ে যায়।

একটি গৌণ সমস্যা হ'ল "প্রক্রিয়া ডেটা" লুপটি শেষ না হওয়া পর্যন্ত আপনার সংযোগটি প্রকাশ করা হবে না। "প্রক্রিয়া ডেটা" জটিল হলে এটি কেবল একটি সমস্যা। এটি http://msdn.microsoft.com/en-us/library/bb386929.aspx এ উল্লেখ করা হয়েছে :

প্র: আমার ডাটাবেস সংযোগটি আর কতক্ষণ খোলা থাকবে?

উ: আপনি ক্যোরির ফলাফলগুলি গ্রাস না করা পর্যন্ত কোনও সংযোগ সাধারণত খোলা থাকে। যদি আপনি সমস্ত ফলাফল প্রক্রিয়া করতে সময় লাগে এবং ফলাফলগুলি ক্যাশে করার বিরোধিতা না করেন তবে ক্যোয়ারিতে টোললিস্ট প্রয়োগ করুন। সাধারণ পরিস্থিতিতে যেখানে প্রতিটি অবজেক্ট কেবলমাত্র একবারে প্রক্রিয়াজাত হয় সেখানে স্ট্রিমিং মডেলটি ডেটা রিডার এবং লিনিক্যু থেকে এসকিউএল উভয় ক্ষেত্রেই উন্নত।

সুতরাং, এই ইস্যুগুলি হ'ল আপনি কেন কোয়েরিটি বাস্তবায়িত হয়েছে তা নিশ্চিত করতে উত্সাহিত করা হচ্ছে, যেমন কল করে ToList()। যাইহোক, জিমির পরামর্শ অনুসারে আইইনুমেয়রিয়াল হিসাবে আপনার তালিকাটি ফিরিয়ে দেওয়া থেকে বিরত কিছু নেই।

একটি সাধারণ নিয়ম হিসাবে, আমি একাধিকবার আইনিউনামেবলের মাধ্যমে পুনরাবৃত্তি এড়াতে পরামর্শ দিই। আপনার কোডের গ্রাহকরা এই নিয়মটি অনুসরণ করে ধরে নিচ্ছেন, আমি এটিকে উদ্বেগ হিসাবে বিবেচনা করি না যে কেউ কেউ কোয়েরি দু'বার করে সম্পাদন করে দুবার ডাটাবেসে আঘাত করতে পারে।


1

IEnumerableপ্রাথমিক গণনা করার আর একটি সুবিধা হ'ল ব্যতিক্রমগুলি যথাযথ স্থানে নিক্ষেপ করা হবে। এটি ডিবাগিংয়ে সহায়তা করে।

উদাহরণস্বরূপ, যদি আপনি আপনার রেজারের একটির ভিউয়ের মধ্যে অচলাবস্থা ব্যতিক্রম পেয়ে থাকেন তবে এটি এতটা স্পষ্ট হবে না যে আপনার ডেটা অ্যাক্সেস পদ্ধতির কোনওটির ক্ষেত্রে ব্যতিক্রম ঘটেছে।


যে কোনও পদ্ধতি IEnumerableযা ফেলে দিতে পারে তা ফিরিয়ে দেওয়া সম্ভবত একটি ভুল করে। স্থিত IEnumerableপদ্ধতি দুটিতে বিভক্ত করা উচিত: একটি অ-স্থগিত পদ্ধতি প্যারামিটারগুলি পরীক্ষা করে এবং সেট আপ করা হয়, প্রয়োজনে নিক্ষেপ করে (বলুন, নাল যুক্তির কারণে)। তারপর এটি ব্যক্তিগত বাস্তবায়ন যা একটি কল ফেরৎ হয় কিছু বলা হয়নি। আমি মনে করি না যে আমার মন্তব্যগুলি আপনার উত্তরের সাথে সম্পূর্ণ মতবিরোধ করছে, তবে আপনি কি মনে করেন যে আপনি নিজের উত্তরের একটি গুরুত্বপূর্ণ দিক রেখে গেছেন, যা বনাম ক (মিউটেশন) বনাম ব্যবহারের অর্থপূর্ণ অর্থ (কোনও লাভ নেই ) স্থগিত)IEnumerableListIReadOnlyCollection
এরিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.