Programiranje

Raziskovanje načela nadomestitve Liskov

Izraz SOLID je priljubljena kratica, ki se uporablja za nabor petih načel arhitekturne programske opreme. Sem spadajo: SRP (enotna odgovornost), odpiranje / zapiranje, zamenjava Liskova, ločevanje vmesnikov in inverzija odvisnosti.

LSP (Liskov Substitution Principle) je temeljno načelo OOP in navaja, da bi morali izvedeni razredi lahko razširiti svoje osnovne razrede, ne da bi spremenili svoje vedenje. Z drugimi besedami, izpeljani razredi bi morali biti zamenljivi za njihove osnovne tipe, tj. Sklic na osnovni razred bi bilo treba nadomestiti z izpeljanim razredom, ne da bi to vplivalo na vedenje. Načelo substitucije Liskov predstavlja močno vedenjsko podtipiko in ga je leta 1987 uvedla Barbara Liskov.

Po besedah ​​Barbare Liskov je "tukaj zaželeno nekaj takega kot naslednja nadomestna lastnost: Če je za vsak objekt o1 tipa S na voljo objekt o2 tipa T, takšen, da je za vse programe P, definirane v smislu T, vedenje P je nespremenjen, ko je o1 nadomeščen z o2, potem je S podtip T. "

Klasičen primer kršitve načela zamenjave Liskova je problem Pravokotnik - kvadrat. Razred Square razširi razred Rectangle in predpostavlja, da sta širina in višina enaki.

Razmislite o naslednjem tečaju. Razred Pravokotnik vsebuje dva podatkovna člana - širino in višino. Obstajajo tudi tri lastnosti - višina, širina in površina. Medtem ko prvi dve lastnosti nastavita višino in širino pravokotnika, ima lastnost Area geter, ki vrne površino pravokotnika.

 razred Pravokotnik

    {

zaščitena int širina;

zaščitena višina int;

javni navidezni int šir

        {

dobili

            {

povratna širina;

            }

nastavite

            {

širina = vrednost;

            }

        }

 

javni navidezni int višina

        {

dobili

            {

povratna višina;

            }

nastavite

            {

višina = vrednost;

            }

        }

               

javno int Območje

        {

dobili

            {

povratna višina * širina;

            }

         }    

    }

Kvadrat je vrsta pravokotnika, katerega stranice so enake, tj. Širina in višina kvadrata sta enaki.

razred Square: pravokotnik

    {

public preglasi int Width

        {

dobili

            {

povratna širina;

            }

nastavite

            {

širina = vrednost;

višina = vrednost;

            }

        }

preglasitev javnega int višina

        {

dobili

            {

povratna širina;

            }

nastavite

            {

širina = vrednost;

višina = vrednost;

            }

        }

    }

Razmislite o drugem razredu, imenovanem ObjectFactory.

 razred ObjectFactory

    {

javni statični pravokotnik GetRectangleInstance ()

        {

vrni nov kvadrat ();

        }

    }

Upoštevajte, da so bili nastavitelji lastnosti Width in Height v razredu Square razveljavljeni in spremenjeni, tako da sta višina in širina enaki. Ustvarimo zdaj primerek razreda Pravokotnik z uporabo in nastavimo njegove lastnosti višine in širine.

Pravokotnik s = ObjectFactory.GetRectangleInstance ();

s.Visina = 9;

s.širina = 8;

Console.WriteLine (s.Area);

Zgornji delček kode bi ob izvedbi prikazal vrednost 64 v konzoli. Pričakovana vrednost je 72, saj sta omenjena širina in višina 9 oziroma 8. To je kršitev načela zamenjave Liskov. To je zato, ker je razred Square, ki je razširil razred Rectangle, spremenil vedenje. Da bi zagotovili, da načelo zamenjave Liskova ni kršeno, lahko razred Square razširi razred Rectangle, vendar ne sme spreminjati vedenja. Vedenje je bilo spremenjeno s spreminjanjem nastavitev lastnosti Width in Height. Vrednosti višine in širine so enake, če gre za kvadrat - ne smejo biti enake, če gre za pravokotnik.

Kako to popravimo, torej zagotovimo, da to načelo ni kršeno? No, lahko uvedete nov razred, imenovan Štirikotnik, in zagotovite, da razredi Pravokotnik in Kvadrat razširjajo razred Štirikotnik.

 javni razred Štirikotnik

    {

javni navidezni int višina {get; set; }

javni navidezni int širina {get; set; }

javni int Območje

        {

dobili

            {

povratna višina * širina;

            }

        }

    } 

Zdaj bi morala tako razreda Pravokotnik kot Kvadrat razširiti razred Štirikotnik in ustrezno nastaviti lastnosti lastnosti Širina in Višina. V bistvu bi morali izpeljani razredi imeti potrebno funkcionalnost za nastavitev vrednosti tem lastnostim glede na vrsto primerka Štirikotnika, za katerega morate izračunati površino. Upoštevajte, da sta bili lastnosti Height in Width v razredu Quadrilateral označeni kot virtualni, kar pomeni, da bi morali te lastnosti preglasiti razredi, ki izpeljejo razred Quadrilateral.

Liskov Substitution Principle je razširitev načela Open Close in je kršen, če ste napisali kodo, ki vrže "neizvedene izjeme" ali v izpeljanem razredu skrijete metode, ki so bile v osnovnem razredu označene kot virtualne. Če se vaša koda drži načela nadomestitve Liskova, imate številne prednosti. Sem spadajo: ponovna uporabnost kode, manjše spenjanje in lažje vzdrževanje.

$config[zx-auto] not found$config[zx-overlay] not found