উত্তরাধিকার শ্রেণিবিন্যাসে কীভাবে লিসকভের বিকল্প নীতি যাচাই করবেন?


14

এই উত্তরে অনুপ্রাণিত :

Liskov উপকল্পন পুঁজি প্রয়োজন যে

  • পূর্ব-শর্তগুলি উপ-টাইপে শক্তিশালী করা যায় না।
  • উপ-টাইপে পোস্টকন্ডিশনগুলি দুর্বল করা যায় না।
  • সুপারটাইপের আক্রমণকারীদের অবশ্যই একটি সাব টাইপে সংরক্ষণ করতে হবে।
  • ইতিহাস সীমাবদ্ধতা ("ইতিহাসের নিয়ম")। অবজেক্টগুলি কেবল তাদের পদ্ধতিগুলির মাধ্যমে (এনক্যাপসুলেশন) পরিবর্তিতযোগ্য হিসাবে বিবেচিত হয়। যেহেতু সাব টাইপগুলি এমন ধরণের পদ্ধতি প্রবর্তন করতে পারে যা সুপারটাইপটিতে উপস্থিত নয়, সুতরাং এই পদ্ধতিগুলির প্রবর্তনটি সুপার টাইপের ক্ষেত্রে অনুমতিপ্রাপ্ত নয় এমন উপ-প্রকারের রাজ্য পরিবর্তনের অনুমতি দিতে পারে। ইতিহাসের সীমাবদ্ধতা এটি নিষিদ্ধ করে।

আমি আশা করছিলাম যে কেউ এই 4 টি পয়েন্টকে লঙ্ঘন করে এমন শ্রেণি শ্রেণিবিন্যাস পোস্ট করবে এবং সে অনুযায়ী কীভাবে সমাধান করা যায়।
শ্রেণিবদ্ধের 4 টি পয়েন্টের প্রতিটি কীভাবে চিহ্নিত করতে হবে এবং এটি ঠিক করার সর্বোত্তম উপায়ের জন্য আমি শিক্ষাগত উদ্দেশ্যে একটি বিস্তৃত ব্যাখ্যা খুঁজছি।

দ্রষ্টব্য:
আমি লোকেরা কাজ করার জন্য একটি কোড নমুনা পোস্ট করার আশাবাদী ছিলাম, তবে প্রশ্নটি নিজেই ত্রুটিযুক্ত শ্রেণিবদ্ধতাকে কীভাবে চিহ্নিত করতে হবে সে সম্পর্কে :)


উত্তর:


17

উক্ত উদ্ধৃতিটি এটিকে যতটা সঠিক করে তোলে তার চেয়ে অনেক সহজ।

যখন আপনি উত্তরাধিকারের শ্রেণিবিন্যাসের দিকে তাকান, এমন কোনও পদ্ধতিটি কল্পনা করুন যা বেস ক্লাসের কোনও বস্তু গ্রহণ করে। এখন নিজেকে জিজ্ঞাসা করুন, এমন কোনও অনুমান আছে যে এই পদ্ধতিতে কেউ সম্পাদনা করতে পারে যা এই শ্রেণীর জন্য অবৈধ।

উদাহরণস্বরূপ ( আঙ্কেল বব এর সাইটে প্রথমে দেখা ):

public class Square : Rectangle
{
    public Square(double width) : base(width, width)
    {
    }

    public override double Width
    {
        set
        {
            base.Width = value;
            base.Height = value;
        }
        get
        {
            return base.Width;
        }
    }

    public override double Height
    {
        set
        {
            base.Width = value;
            base.Height = value;
        }
        get
        {
            return base.Height;
        }
    }
}

যথেষ্ট ন্যায্য বলে মনে হচ্ছে? আমি স্কয়ার নামে একটি বিশেষজ্ঞ ধরণের আয়তক্ষেত্র তৈরি করেছি, যা বজায় রাখে যে প্রস্থকে সর্বকালের উচ্চতার সমান করতে হবে। একটি বর্গক্ষেত্র একটি আয়তক্ষেত্র, তাই এটি ওও নীতিগুলির সাথে খাপ খায়, তাই না?

তবে অপেক্ষা করুন, এখন যদি কেউ এই পদ্ধতিটি লিখেন:

public void Enlarge(Rectangle rect, double factor)
{
    rect.Width *= factor;
    rect.Height *= factor;
}

ভালো না. তবে কোনও কারণ নেই যে এই পদ্ধতির লেখকের জানা থাকা উচিত ছিল কোনও সম্ভাব্য সমস্যা হতে পারে।

যতবারই আপনি অন্য শ্রেণি থেকে অন্য শ্রেণিভুক্ত হন, বেস ক্লাস এবং লোকেরা এটি সম্পর্কে কী ধারণা নিতে পারে সে সম্পর্কে চিন্তা করুন (যেমন "এর একটি প্রস্থ এবং উচ্চতা রয়েছে এবং তারা উভয়ই স্বাধীন হবে")। তারপরে ভাবেন "এই অনুমানগুলি কি আমার সাবক্লাসে বৈধ থাকে?" যদি তা না হয় তবে আপনার নকশাকে পুনর্বিবেচনা করুন।


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

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

1
আমি মনে করি না যে এটি একটি ভাল উদাহরণ। সমস্যাটি হচ্ছে কোনও বর্গের কোনও প্রস্থ বা উচ্চতা নেই। এটির এর দৈর্ঘ্য মাত্র রয়েছে। প্রস্থ এবং উচ্চতা কেবল পঠনযোগ্য হলে সমস্যা হবে না তবে তারা এই ক্ষেত্রে লিখনযোগ্য। সংশোধনযোগ্য অবস্থা প্রবর্তন করার সময় এলএসপি বজায় রাখা সবসময় অনেক বেশি কঠিন difficult
স্পেসট্রকার 13

@ পিডিআর উদাহরণের জন্য ধন্যবাদ, তবে আমি আমার পোস্টে উল্লিখিত ৪ টি শর্ত সম্পর্কে Squareক্লাসের কোন অংশটি লঙ্ঘন করে?
সাঙ্গো

1
@ সাঙ্গো: এটি হিস্ট্রি সীমাবদ্ধ। বেটার এখানে ব্যাখ্যা করেছিলেন: blackwasp.co.uk/LSP.aspx "তাদের প্রকৃতি দ্বারা, উপশ্রেণী পদ্ধতি এবং তাদের superclasses বৈশিষ্ট্য সব অন্তর্ভুক্ত তারা আরও সদস্যদের যোগ করতে পারেন ইতিহাস বাধ্যতা বলছেন যে নতুন বা।। রুপান্তরিত সদস্যদের সংশোধন করা উচিত নয় কোনও অবজেক্টের অবস্থা এমনভাবে করা যাতে বেস শ্রেণীর দ্বারা অনুমোদিত হয় না example উদাহরণস্বরূপ, যদি বেস শ্রেণি একটি নির্দিষ্ট আকারের সাথে কোনও বস্তুর প্রতিনিধিত্ব করে তবে সাবক্লাসটি এই আকারটিকে সংশোধন করার অনুমতি দেবে না। "
pdr
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.