.NET বৈশিষ্ট্য সংক্রান্ত আমার একটি ডিজাইনের সমস্যা হচ্ছে।
interface IX
{
Guid Id { get; }
bool IsInvalidated { get; }
void Invalidate();
}
সমস্যা:
এই ইন্টারফেসে দুটি পঠনযোগ্য বৈশিষ্ট্য রয়েছে Id
এবং IsInvalidated
। এগুলি যে কেবলমাত্র পঠনযোগ্য তা কেবল তাদের গ্যারান্টিই নয় যে তাদের মানগুলি স্থির থাকবে।
আসুন আমরা বলি যে এটি আমার স্পষ্ট করে দেওয়ার উদ্দেশ্য ছিল যে…
Id
যখন একটি ধ্রুবক মান উপস্থাপন করে (যা সম্ভবত নিরাপদে ক্যাশে করা যেতে পারে)IsInvalidated
কোনওIX
বস্তুর জীবদ্দশায় এর মান পরিবর্তিত হতে পারে (এবং তাই ক্যাশে করা উচিত নয়)।
কীভাবে আমি interface IX
চুক্তিটি যথেষ্ট পরিমাণে সুস্পষ্ট করতে সংশোধন করতে পারি ?
একটি সমাধানে আমার নিজের তিনটি প্রচেষ্টা:
ইন্টারফেসটি ইতিমধ্যে ভালভাবে ডিজাইন করা হয়েছে। নামক পদ্ধতির উপস্থিতি
Invalidate()
কোনও প্রোগ্রামারকে এটি নির্ধারণ করার অনুমতি দেয় যে অনুরূপ নামধারী সম্পত্তির মানIsInvalidated
এটি দ্বারা প্রভাবিত হতে পারে।এই যুক্তিটি কেবলমাত্র সেই ক্ষেত্রে ধারণ করে যেখানে পদ্ধতি এবং সম্পত্তি একইরূপে নামকরণ করা হয়।
একটি ইভেন্টের সাথে এই ইন্টারফেসটি বৃদ্ধি করুন
IsInvalidatedChanged
:bool IsInvalidated { get; } event EventHandler IsInvalidatedChanged;
কোনও
…Changed
ইভেন্টের উপস্থিতিIsInvalidated
জানিয়েছে যে এই সম্পত্তিটি তার মান পরিবর্তন করতে পারে এবং অনুরূপ ইভেন্টের অনুপস্থিতিId
একটি প্রতিশ্রুতি দেয় যে সম্পত্তি তার মান পরিবর্তন করবে না।আমি এই সমাধানটি পছন্দ করি তবে এটি প্রচুর পরিমাণে অতিরিক্ত জিনিস যা ব্যবহার নাও হতে পারে।
IsInvalidated
একটি পদ্ধতি দিয়ে সম্পত্তি প্রতিস্থাপন করুনIsInvalidated()
:bool IsInvalidated();
এটি খুব সূক্ষ্ম পরিবর্তন হতে পারে। এটি এমন একটি ইঙ্গিত হিসাবে অনুমিত হবে যে প্রতিবারই একটি মূল্য নতুন করে গণনা করা হয় - এটি ধ্রুবক হলে প্রয়োজনীয় হবে না। এমএসডিএন বিষয় "সম্পত্তি এবং পদ্ধতিগুলির মধ্যে নির্বাচন করা" এর সম্পর্কে এটি বলার আছে:
নিম্নলিখিত পরিস্থিতিতে কোনও সম্পত্তি পরিবর্তে কোনও পদ্ধতি ব্যবহার করুন। […] পরামিতিগুলি পরিবর্তিত না হলেও, অপারেশন প্রতিবার যখন এটি বলা হয় তখন ভিন্ন ফলাফল দেয়।
আমি কি ধরণের উত্তর আশা করি?
তারা আমার উপরের চেষ্টাগুলি কীভাবে পরাজিত করেছে তার ব্যাখ্যা সহ আমি সমস্যার সম্পূর্ণ ভিন্ন সমাধানে আগ্রহী।
যদি আমার প্রচেষ্টাগুলি যৌক্তিকভাবে ত্রুটিযুক্ত হয় বা এর উল্লেখযোগ্য অসুবিধাগুলি এখনও উল্লেখ না করা হয়, যেমন একটি মাত্র সমাধান (বা কোনওই নেই) থেকে যায় তবে আমি কোথায় ভুল করেছি সে সম্পর্কে শুনতে চাই।
ত্রুটিগুলি যদি সামান্য হয় এবং এটি বিবেচনার পরেও একাধিক সমাধান থেকে যায় তবে দয়া করে মন্তব্য করুন।
খুব কমপক্ষে, আমি কিছু প্রতিক্রিয়া চাই যার উপর আপনার পছন্দসই সমাধান এবং কী কারণে (গুলি)।
class Foo : IFoo { private bool isInvalidated; public bool IsInvalidated { get { return isInvalidated; } } public void Invalidate() { isInvalidated = true; } }
InvalidStateException
উদাহরণস্বরূপ আমাদের কখনই উদ্বিগ্ন হওয়া উচিত নয় , তবে আমি এটি নিশ্চিত নই যে এটি তাত্ত্বিকভাবেও সম্ভব কিনা। যদিও ভাল হবে।
IsInvalidated
প্রয়োজনprivate set
?