আমি সম্প্রতি একটি কোডবেস উত্তরাধিকার সূত্রে পেয়েছি যাতে এতে কিছু বড় লিসকভ লঙ্ঘনকারী রয়েছে। গুরুত্বপূর্ণ ক্লাসে। এটি আমাকে প্রচুর পরিমাণে ব্যথা করেছে। কেন আমাকে ব্যাখ্যা করুন।
আমি Class A
যার থেকে উদ্ভব Class B
। Class A
এবং এমন Class B
একটি গুচ্ছ ভাগ করে নিন Class A
যা এর নিজস্ব প্রয়োগের সাথে ওভাররাইড করে। সেট বা পেয়ে Class A
সম্পত্তি সেটিং বা থেকে সঠিক একই সম্পত্তি পেয়ে একটি ভিন্ন প্রভাব রয়েছে Class B
।
public Class A
{
public virtual string Name
{
get; set;
}
}
Class B : A
{
public override string Name
{
get
{
return TranslateName(base.Name);
}
set
{
base.Name = value;
FunctionWithSideEffects();
}
}
}
.NET এ অনুবাদ করার এটি সম্পূর্ণ ভয়ঙ্কর উপায় এই বিষয়টিকে একদিকে রেখে, এই কোডটি সহ আরও বেশ কয়েকটি সমস্যা রয়েছে।
এই ক্ষেত্রে Name
একটি সূচক এবং স্থান একটি নম্বর একটি প্রবাহ নিয়ন্ত্রণ পরিবর্তনশীল হিসেবে ব্যবহৃত হয়। উপরের ক্লাসগুলি তাদের কাঁচা এবং উদ্ভূত ফর্ম উভয় কোডবেজ জুড়েই ছড়িয়ে আছে। এক্ষেত্রে লিসকোভ প্রতিস্থাপন নীতি লঙ্ঘন করার অর্থ হ'ল বেস ক্লাস গ্রহণকারী প্রতিটি ক্রিয়াকলাপের প্রতিটি কলের প্রসঙ্গে আমার জানা দরকার।
কোডটি উভয়ের অবজেক্ট ব্যবহার করে Class A
এবং Class B
তাই আমি Class A
লোককে ব্যবহার করতে বাধ্য করার জন্য কেবল বিমূর্ততা তৈরি করতে পারি না Class B
।
কিছু খুব দরকারী ইউটিলিটি ফাংশন রয়েছে যা অপারেট করে Class A
এবং অন্যান্য খুব দরকারী ইউটিলিটি ফাংশন যা কাজ করে Class B
। মূলত আমি কোনো ইউটিলিটি ফাংশন যা উপর কাজ করতে পারে ব্যবহার করতে সক্ষম হতে চাই Class A
উপর Class B
। এটি কার্যকর করে এমন অনেকগুলি ফাংশন Class B
সহজেই গ্রহণ করতে পারে Class A
যদি এটি এলএসপি লঙ্ঘনের জন্য না হয়।
এর মধ্যে সবচেয়ে খারাপ বিষয়টি হ'ল এই বিশেষ কেসটি রিফ্যাক্টর করা সত্যিই শক্ত কারণ পুরো অ্যাপ্লিকেশনটি এই দুটি ক্লাসের উপর নির্ভর করে, উভয় ক্লাসে সমস্ত সময় পরিচালিত হয় এবং আমি যদি এটি পরিবর্তন করি তবে একশ উপায়ে ভেঙে যাব (যা আমি যা করতে যাচ্ছি) যাহাই হউক না কেন)।
এটি ঠিক করার জন্য আমাকে NameTranslated
যা করতে হবে তা হ'ল একটি সম্পত্তি তৈরি করা , যা সম্পত্তির Class B
সংস্করণ হবে Name
এবং খুব Name
নতুনভাবে আমার নতুন NameTranslated
সম্পত্তি ব্যবহার করার জন্য উত্পন্ন সম্পত্তিটির প্রতিটি রেফারেন্স পরিবর্তন করবে । যাইহোক, এমনকি এই উল্লেখগুলির মধ্যে একটিরও ভুল পাওয়া পুরো অ্যাপ্লিকেশনটি ফুরিয়ে যেতে পারে।
কোডবেসটির চারপাশে ইউনিট পরীক্ষা না করে দেওয়া, এটি একটি বিকাশকারী সবচেয়ে বেশি বিপজ্জনক দৃশ্যের মুখোমুখি হতে পারে। যদি আমি লঙ্ঘনটি পরিবর্তন না করি তবে প্রতিটি পদ্ধতিতে কোন ধরণের কী কী বস্তু পরিচালনা করা হচ্ছে তা ট্র্যাক করে রাখার জন্য আমাকে প্রচুর পরিমাণে মানসিক শক্তি ব্যয় করতে হবে এবং যদি আমি লঙ্ঘনটি স্থির করি তবে আমি সম্পূর্ণ পণ্যকে একটি ইনপোর্টটিউন সময়ে বিস্ফোরিত করতে পারি।