আমি যথাসম্ভব একক দায়িত্বের নীতি (এসআরপি) মেনে চলার চেষ্টা করছি এবং প্রতিনিধিদের উপর ভারী নির্ভর করে একটি নির্দিষ্ট প্যাটার্নে (পদ্ধতিতে এসআরপির জন্য) অভ্যস্ত হয়ে পড়েছি। আমি জানতে চাই যে এই পদ্ধতিরটি সঠিক কিনা বা এর সাথে কোনও গুরুতর সমস্যা রয়েছে কিনা।
উদাহরণস্বরূপ, কোনও কনস্ট্রাক্টরের ইনপুট পরীক্ষা করতে, আমি নিম্নলিখিত পদ্ধতিটি চালু করতে পারি ( Stream
ইনপুটটি এলোমেলো, কিছু হতে পারে)
private void CheckInput(Stream stream)
{
if(stream == null)
{
throw new ArgumentNullException();
}
if(!stream.CanWrite)
{
throw new ArgumentException();
}
}
এই পদ্ধতিটি (তর্কযুক্ত) একাধিক জিনিস করে
- ইনপুটগুলি পরীক্ষা করুন
- বিভিন্ন ব্যতিক্রম নিক্ষেপ
এসআরপি মেনে চলার জন্য আমি যুক্তিটি পরিবর্তিত করেছি
private void CheckInput(Stream stream,
params (Predicate<Stream> predicate, Action action)[] inputCheckers)
{
foreach(var inputChecker in inputCheckers)
{
if(inputChecker.predicate(stream))
{
inputChecker.action();
}
}
}
যা অনুমানযোগ্যভাবে কেবল একটি কাজ করে (তা করে?): ইনপুটটি পরীক্ষা করে দেখুন। ইনপুটগুলির প্রকৃত চেক করার জন্য এবং ব্যতিক্রমগুলি ছুঁড়ে দেওয়ার জন্য আমি যেমন পদ্ধতিগুলি চালু করেছি
bool StreamIsNull(Stream s)
{
return s == null;
}
bool StreamIsReadonly(Stream s)
{
return !s.CanWrite;
}
void Throw<TException>() where TException : Exception, new()
{
throw new TException();
}
এবং কল করতে CheckInput
পারেন
CheckInput(stream,
(this.StreamIsNull, this.Throw<ArgumentNullException>),
(this.StreamIsReadonly, this.Throw<ArgumentException>))
এটি কি আদৌ প্রথম বিকল্পের চেয়ে ভাল, বা আমি অযৌক্তিক জটিলতার পরিচয় দেব? আমি এখনও এই প্যাটার্নটি উন্নত করতে পারি এমন কোনও উপায় আছে, যদি তা আদৌ কার্যকর হয়?
CheckInput
এখনও একাধিক কাজ করছে: এটি উভয়ই একটি অ্যারের মাধ্যমে পুনরাবৃত্তি হয় এবং একটি প্রাকটিক ফাংশন কল করে এবং একটি ক্রিয়া ফাংশন কল করে। তাও কি এসআরপি লঙ্ঘন নয়?