Programavimas

Liskovo pakeitimo principo tyrimas

Terminas SOLID yra populiarus akronimas, vartojamas nurodant penkių programinės įrangos architektūros principų rinkinį. Tai apima: SRP (viena atsakomybė), atidarymas / uždarymas, Liskovo pakeitimas, sąsajos atskyrimas ir priklausomybės inversija.

LSP („Liskov Substitution Principle“) yra pagrindinis OOP principas ir teigiama, kad išvestinės klasės turėtų galėti išplėsti savo bazines klases, nekeisdamos savo elgesio. Kitaip tariant, išvestinės klasės turėtų būti pakeičiamos pagal jų pagrindinius tipus, t. Y. Nuoroda į bazinę klasę turėtų būti pakeista išvestine klase, nedarant įtakos elgesiui. „Liskov“ pakeitimo principas yra tvirtas elgesio subtipas, kurį Barbara Liskov įvedė 1987 m.

Pasak Barbaros Liskov, „Čia norima kažkokios panašios į šią pakaitinę savybę: Jei kiekvienam S tipo objektui o1 yra T tipo objektas o2, kad visoms programoms P, apibrėžtoms T, P nesikeičia, kai o1 pakeičiamas o2, tada S yra T potipis. "

Klasikinis Liskovo pakeitimo principo pažeidimo pavyzdys yra stačiakampio - kvadrato problema. „Square“ klasė pratęsia „Stačiakampio“ klasę ir daro prielaidą, kad plotis ir aukštis yra vienodi.

Apsvarstykite šią klasę. Stačiakampio klasėje yra du duomenų nariai - plotis ir aukštis. Taip pat yra trys savybės - aukštis, plotis ir plotas. Nors pirmosios dvi savybės nustato stačiakampio aukštį ir plotį, ypatybė Plotas turi getter, kuris grąžina stačiakampio plotą.

 klasės stačiakampis

    {

apsaugotas int plotis;

saugomas int aukštis;

viešasis virtualusis int

        {

gauti

            {

grąžinimo plotis;

            }

rinkinys

            {

plotis = reikšmė;

            }

        }

 

viešasis virtualusis aukštis

        {

gauti

            {

grįžimo aukštis;

            }

rinkinys

            {

aukštis = vertė;

            }

        }

               

public int Plotas

        {

gauti

            {

grąžinimo aukštis * plotis;

            }

         }    

    }

Kvadratas yra stačiakampio tipas, kurio visos kraštinės yra vienodo dydžio, t. Y. Kvadrato plotis ir aukštis yra vienodi.

klasės kvadratas: stačiakampis

    {

public override int Width

        {

gauti

            {

grąžinimo plotis;

            }

rinkinys

            {

plotis = reikšmė;

aukštis = vertė;

            }

        }

public override int Height

        {

gauti

            {

grąžinimo plotis;

            }

rinkinys

            {

plotis = reikšmė;

aukštis = vertė;

            }

        }

    }

Apsvarstykite kitą klasę, vadinamą ObjectFactory.

 klasė ObjectFactory

    {

viešasis statinis stačiakampis „GetRectangleInstance“ ()

        {

grąžinti naują aikštę ();

        }

    }

Atkreipkite dėmesį, kad kvadrato klasės savybių „Plotis“ ir „Aukštis“ nustatytuvai buvo nepaisyti ir modifikuoti, siekiant užtikrinti, kad aukštis ir plotis būtų vienodi. Dabar sukurkime klasės Stačiakampis egzempliorių, naudodami ir nustatydami jo aukščio ir pločio ypatybes.

Stačiakampis s = ObjectFactory.GetRectangleInstance ();

s. Aukštis = 9;

s. plotis = 8;

Console.WriteLine (s.Area);

Vykdant pirmiau pateiktą kodo fragmentą, konsolėje bus rodoma 64 vertė. Laukiama vertė yra 72, nes minimas plotis ir aukštis yra atitinkamai 9 ir 8. Tai yra Liskovo pakeitimo principo pažeidimas. Taip yra todėl, kad „Square“ klasė, pratęsusi „Stačiakampio“ klasę, pakeitė elgesį. Siekiant užtikrinti, kad nebūtų pažeistas Liskovo pakeitimo principas, „Square“ klasė gali išplėsti „Stačiakampio“ klasę, tačiau neturėtų keisti elgesio. Elgesys buvo pakeistas modifikuojant tiek savybių Plotis, tiek Aukštis nustatytuvus. Aukščio ir pločio reikšmės yra vienodos, jei tai yra kvadratas - jos neturėtų būti vienodos, jei tai yra stačiakampis.

Kaip tai išspręsti, t. Y. Užtikrinti, kad šis principas nebūtų pažeistas? Na, galite įvesti naują klasę, vadinamą „Keturkampis“, ir užtikrinti, kad ir „Stačiakampio“, ir „Kvadrato“ klasės pratęsia keturkampio klasę.

 visuomenės klasės keturkampis

    {

public virtual int Height {get; rinkinys; }

public virtual int Plotis {get; rinkinys; }

public int Plotas

        {

gauti

            {

grąžinimo aukštis * plotis;

            }

        }

    } 

Dabar stačiakampio ir kvadrato klasės turėtų išplėsti keturkampę klasę ir tinkamai nustatyti pločio ir aukščio savybes. Iš esmės išvestinės klasės turėtų turėti reikiamą funkciją, kad būtų galima nustatyti šių savybių vertes pagal keturkampio egzemplioriaus, kurio plotą reikia apskaičiuoti, tipą. Atkreipkite dėmesį, kad tiek „Height“, tiek „Width“ savybės buvo pažymėtos kaip virtualios keturkampio klasėje, vadinasi, šios savybės turėtų būti nepaisomos klasių, išvedančių keturkampę klasę.

„Liskov Substitution Principle“ yra atviro uždarymo principo pratęsimas ir pažeidžiamas, kai parašėte kodą, kuriame pateikiamos „neįgyvendintos išimtys“, arba paslėpiate išvestinės klasės metodus, kurie buvo pažymėti kaip virtualūs pagrindinėje klasėje. Jei jūsų kodas atitinka Liskovo pakeitimo principą, turite daug privalumų. Tai apima: kodo pakartotinį naudojimą, sumažintą sujungimą ir paprastesnę priežiūrą.