মূলত আমরা জিনিসগুলি সংবেদনশীল আচরণ করতে চাই।
নিম্নলিখিত সমস্যা বিবেচনা করুন:
আমাকে একটি গ্রুপ আয়তক্ষেত্র দেওয়া হয়েছে এবং আমি তাদের ক্ষেত্রটি 10% বাড়াতে চাই। সুতরাং আমি যা করছি তা আমি আয়তক্ষেত্রটির দৈর্ঘ্যটি আগে যা ছিল তার চেয়ে 1.1 গুণ নির্ধারণ করেছি।
public void IncreaseRectangleSizeByTenPercent(IEnumerable<Rectangle> rectangles)
{
foreach(var rectangle in rectangles)
{
rectangle.Length = rectangle.Length * 1.1;
}
}
এখন এই ক্ষেত্রে, আমার সমস্ত আয়তক্ষেত্রগুলির দৈর্ঘ্য এখন 10% বৃদ্ধি পেয়েছে, যা তাদের অঞ্চল 10% বৃদ্ধি করবে। দুর্ভাগ্যক্রমে, কেউ আমাকে স্কোয়ার এবং আয়তক্ষেত্রের মিশ্রণটি দিয়েছে এবং যখন আয়তক্ষেত্রটির দৈর্ঘ্য পরিবর্তন করা হয়েছিল, তখন প্রস্থটি ছিল।
আমার ইউনিট পরীক্ষা পাস হয়েছে কারণ আমি আয়তক্ষেত্রের সংগ্রহ ব্যবহার করতে আমার সমস্ত ইউনিট পরীক্ষা লিখেছি wrote আমি এখন আমার অ্যাপ্লিকেশনটিতে একটি সূক্ষ্ম বাগ প্রবর্তন করেছি যা কয়েক মাস ধরে নজরে না যেতে পারে।
সবচেয়ে খারাপ বিষয়, অ্যাকাউন্টিং থেকে জিম আমার পদ্ধতিটি দেখে এবং অন্য কিছু কোড লেখেন যা এই সত্যটি ব্যবহার করে যে সে যদি আমার পদ্ধতিতে স্কোয়ারগুলি পাস করে তবে সে আকারে খুব সুন্দর 21% বৃদ্ধি পায়। জিম খুশি এবং কেউ বুদ্ধিমান কেউ নয়।
জিম দুর্দান্ত কাজের জন্য আলাদা বিভাগে উন্নীত হয়। আলফ্রেড জুনিয়র হিসাবে সংস্থায় যোগদান করে। তার প্রথম বাগের প্রতিবেদনে, বিজ্ঞাপন থেকে জিল জানিয়েছে যে এই পদ্ধতিতে স্কোয়ারগুলি পাস করার ফলে 21% বৃদ্ধি ঘটে এবং বাগটি স্থির করতে চায়। আলফ্রেড দেখেছে যে স্কোয়ার এবং আয়তক্ষেত্র কোডের সর্বত্র ব্যবহৃত হয় এবং বুঝতে পারে যে উত্তরাধিকার শৃঙ্খলা ভঙ্গ করা অসম্ভব। অ্যাকাউন্টিংয়ের সোর্স কোডেও তার অ্যাক্সেস নেই। সুতরাং আলফ্রেড বাগ এইভাবে ঠিক করে:
public void IncreaseRectangleSizeByTenPercent(IEnumerable<Rectangle> rectangles)
{
foreach(var rectangle in rectangles)
{
if (typeof(rectangle) == Rectangle)
{
rectangle.Length = rectangle.Length * 1.1;
}
if (typeof(rectangle) == Square)
{
rectangle.Length = rectangle.Length * 1.04880884817;
}
}
}
আলফ্রেড তার উবার হ্যাকিংয়ের দক্ষতায় খুশি এবং জিল সাইন ইন করে যে বাগটি ঠিক হয়ে গেছে।
পরের মাসে কাউকে বেতন দেওয়া হয় না কারণ অ্যাকাউন্টিং IncreaseRectangleSizeByTenPercent
পদ্ধতিতে স্কোয়ারগুলি পাস করতে সক্ষম হওয়া এবং ক্ষেত্রের 21% বৃদ্ধি পাওয়ার উপর নির্ভরশীল ছিল । ইস্যুর উত্সটি সন্ধান করতে পুরো সংস্থাটি "অগ্রাধিকার 1 বাগফিক্স" মোডে যায়। তারা আলফ্রেডের সমস্যার সমাধান করতে সমস্যাটি সনাক্ত করে। তারা জানে যে তাদের অ্যাকাউন্টিং এবং বিজ্ঞাপন উভয়কেই খুশি রাখতে হবে। সুতরাং তারা পদ্ধতি কলটির সাথে ব্যবহারকারীকে চিহ্নিত করে সমস্যাটি সমাধান করে:
public void IncreaseRectangleSizeByTenPercent(IEnumerable<Rectangle> rectangles)
{
IncreaseRectangleSizeByTenPercent(
rectangles,
new User() { Department = Department.Accounting });
}
public void IncreaseRectangleSizeByTenPercent(IEnumerable<Rectangle> rectangles, User user)
{
foreach(var rectangle in rectangles)
{
if (typeof(rectangle) == Rectangle || user.Department == Department.Accounting)
{
rectangle.Length = rectangle.Length * 1.1;
}
else if (typeof(rectangle) == Square)
{
rectangle.Length = rectangle.Length * 1.04880884817;
}
}
}
এবং তাই এবং তাই ঘোষণা.
এই উপাখ্যানটি এমন বাস্তব-বিশ্বের পরিস্থিতিতে ভিত্তি করে তৈরি করা হয় যা প্রতিদিন প্রোগ্রামারদের মুখোমুখি হয়। লিসকোভ সাবস্টিটিউশন নীতি লঙ্ঘন খুব সূক্ষ্ম বাগ প্রবর্তন করতে পারে যেগুলি লেখার পরে কয়েক বছর পরে নেওয়া হবে, যার মাধ্যমে লঙ্ঘন স্থির করে সময়গুলি একগুচ্ছ জিনিসকে ভেঙে ফেলবে এবং এটি স্থির না করা আপনার বৃহত্তম ক্লায়েন্টকে ক্রুদ্ধ করবে।
এই সমস্যাটি ঠিক করার দুটি বাস্তব উপায় রয়েছে।
প্রথম উপায়টি হচ্ছে আয়তক্ষেত্রকে অপরিবর্তনীয় করে তোলা। যদি আয়তক্ষেত্রের ব্যবহারকারী দৈর্ঘ্য এবং প্রস্থের বৈশিষ্ট্যগুলি পরিবর্তন করতে না পারে তবে এই সমস্যাটি চলে যায়। আপনি যদি আলাদা দৈর্ঘ্য এবং প্রস্থ সহ একটি আয়তক্ষেত্র চান তবে আপনি একটি নতুন তৈরি করুন। স্কোয়ারগুলি সুখে আয়তক্ষেত্র থেকে উত্তরাধিকারী হতে পারে।
দ্বিতীয় উপায়টি স্কোয়ার এবং আয়তক্ষেত্রগুলির মধ্যে উত্তরাধিকার শৃঙ্খলা ভাঙা। যদি কোনও বর্গক্ষেত্রের একক SideLength
সম্পত্তি থাকার সাথে সংজ্ঞা দেওয়া হয় এবং আয়তক্ষেত্রগুলির একটি Length
এবং Width
সম্পত্তি থাকে এবং কোনও উত্তরাধিকার না থাকে তবে আয়তক্ষেত্রের প্রত্যাশা করে এবং বর্গক্ষেত্র অর্জন করে ঘটনাক্রমে জিনিসগুলি ভাঙ্গা অসম্ভব। সি # পদগুলিতে, আপনি seal
আপনার আয়তক্ষেত্রের শ্রেণিটি করতে পারতেন , এটি নিশ্চিত করে যে আপনি যে সমস্ত আয়তক্ষেত্রগুলি পান সেগুলি আসলে আয়তক্ষেত্রগুলি।
এই ক্ষেত্রে, আমি সমস্যাটি সমাধানের "অপরিবর্তনীয় জিনিসগুলি" পছন্দ করি। একটি আয়তক্ষেত্রের পরিচয় এটির দৈর্ঘ্য এবং প্রস্থ। এটি উপলব্ধি করে যে আপনি যখন কোনও বস্তুর পরিচয় পরিবর্তন করতে চান তখন আপনি যা চান তা একটি নতুন অবজেক্ট। আপনি যদি কোনও পুরানো গ্রাহক হারিয়ে ফেলে এবং একটি নতুন গ্রাহক অর্জন করেন তবে আপনি পুরানো গ্রাহক Customer.Id
থেকে ক্ষেত্রটি নতুনটিতে পরিবর্তন করবেন না , আপনি একটি নতুন তৈরি করেন Customer
।
লিসকোভ সাবস্টিটিউশন নীতি লঙ্ঘন বাস্তব বিশ্বে প্রচলিত হয়, বেশিরভাগ কারণেই সেখানে প্রচুর কোড আউট লোকেরা লিখে থাকেন যাঁরা অক্ষম / সময় চাপের মধ্যে থাকেন / যত্ন নেন না / ভুল করেন। এটি কিছু খুব বাজে সমস্যা হতে পারে এবং করতে পারে। বেশিরভাগ ক্ষেত্রে, আপনি পরিবর্তে উত্তরাধিকারের চেয়ে রচনাটির পক্ষে যেতে চান ।