Ohjelmointi

Liskov-korvausperiaatteen tutkiminen

Termi SOLID on suosittu lyhenne, jota käytetään viittaamaan ohjelmistoarkkitehtuurin viiteen periaatteeseen. Näitä ovat: SRP (Single Responsibility), Open / Close, Liskov's Substitution, Interface Segregation ja Dependency Inversion.

LSP (Liskov Substitution Principle) on OOP: n perusperiaate, ja siinä todetaan, että johdettujen luokkien tulisi pystyä laajentamaan perusluokkia muuttamatta käyttäytymistään. Toisin sanoen johdettujen luokkien tulisi olla korvattavissa perustyyppinsä suhteen, ts. Viittauksen perusluokkaan tulisi olla korvattavissa johdetulla luokalla vaikuttamatta käyttäytymiseen. Liskov Substitution Principle edustaa vahvaa käyttäytymisen alatyyppiä, ja Barbara Liskov otti sen käyttöön vuonna 1987.

Barbara Liskovin mukaan "täällä halutaan jotain seuraavista korvausominaisuuksista: Jos jokaiselle tyypin S objektille o1 on tyypin T objekti o2, niin että kaikille T: llä määritellyille ohjelmille P on P: n käyttäytyminen on muuttumaton, kun o1 on korvattu o2: lla, niin S on T: n alatyyppi. "

Klassinen esimerkki Liskovin korvausperiaatteen rikkomisesta on Suorakulmio - neliö -ongelma. Neliö-luokka laajentaa Suorakulmio-luokkaa ja olettaa, että leveys ja korkeus ovat samat.

Harkitse seuraavaa luokkaa. Suorakulmio-luokka sisältää kaksi datajäsentä - leveys ja korkeus. On myös kolme ominaisuutta - korkeus, leveys ja pinta-ala. Kun kaksi ensimmäistä ominaisuutta asettavat suorakulmion korkeuden ja leveyden, Area-ominaisuudella on getter, joka palauttaa suorakulmion alueen.

 luokan suorakulmio

    {

suojattu int leveys;

suojattu sisäkorkeus;

julkinen virtuaalinen int Leveys

        {

saada

            {

paluuleveys;

            }

aseta

            {

leveys = arvo;

            }

        }

 

julkinen virtuaalinen korkeus

        {

saada

            {

paluukorkeus;

            }

aseta

            {

korkeus = arvo;

            }

        }

               

julkinen alue

        {

saada

            {

paluukorkeus * leveys;

            }

         }    

    }

Neliö on suorakulmion tyyppi, jonka kaikki sivut ovat yhtä suuret, ts. Neliön leveys ja korkeus ovat samat.

luokan neliö: suorakulmio

    {

public override int Width

        {

saada

            {

paluuleveys;

            }

aseta

            {

leveys = arvo;

korkeus = arvo;

            }

        }

julkinen ohitus sisäkorkeudessa

        {

saada

            {

paluuleveys;

            }

aseta

            {

leveys = arvo;

korkeus = arvo;

            }

        }

    }

Harkitse toista luokkaa nimeltä ObjectFactory.

 luokka ObjectFactory

    {

staattinen staattinen suorakulmio GetRectangleInstance ()

        {

palauta uusi neliö ();

        }

    }

Huomaa, että Neliö-luokan Leveys- ja Korkeus-ominaisuuksien asettimet on ohitettu ja muokattu sen varmistamiseksi, että korkeus ja leveys ovat samat. Luodaan nyt suorakulmion luokan ilmentymä käyttämällä ja asettamalla sen korkeus- ja leveysominaisuudet.

Suorakulmio s = ObjectFactory.GetRectangleInstance ();

s. korkeus = 9;

s. leveys = 8;

Console.WriteLine (alue);

Yllä oleva koodinpätkä suoritettaessa näyttää arvon 64 konsolissa. Odotettu arvo on 72, koska mainittu leveys on 8 ja korkeus 8. Tämä on Liskovin korvausperiaatteen vastaista. Tämä johtuu siitä, että Square-luokka, joka on laajentanut Rectangle-luokkaa, on muuttanut käyttäytymistä. Neliö-luokka voi laajentaa Suorakaide-luokkaa, mutta sen ei pitäisi muuttaa käyttäytymistä sen varmistamiseksi, että Liskovin korvausperiaatetta ei rikota. Käyttäytymistä on muutettu muuttamalla asetinta sekä ominaisuuksille Leveys että Korkeus. Korkeuden ja leveyden arvot ovat samat, jos se on neliö - niiden ei pitäisi olla samat, jos se on suorakulmio.

Kuinka voimme korjata tämän eli varmistaa, ettei tätä periaatetta loukata? Voit, että sinulla on uusi luokka nimeltä Quadrilateral ja varmistetaan, että sekä suorakaiteen että neliön luokat laajentavat nelikulmaista luokkaa.

 julkisen luokan nelikulmainen

    {

julkinen virtuaalinen int Korkeus {get; aseta; }

public virtual int Leveys {get; aseta; }

julkinen alue

        {

saada

            {

paluukorkeus * leveys;

            }

        }

    } 

Sekä Suorakulmio- että Neliö-luokkien tulisi nyt pidentää nelikulmaista luokkaa ja asettaa leveys- ja korkeusominaisuuksien arvot asianmukaisesti. Pohjimmiltaan johdetuilla luokilla tulisi olla tarvittavat toiminnot arvojen asettamiseksi näille ominaisuuksille sen nelikulmaisen ilmentymän tyypin perusteella, jolle pinta-ala on laskettava. Huomaa, että sekä korkeus- että leveysominaisuudet on merkitty virtuaalisiksi nelikulmaluokassa, mikä tarkoittaa, että nämä ominaisuudet on ohitettava nelikulmaluokan johtavilla luokilla.

Liskov Substitution Principle on Open Close -periaatteen laajennus ja sitä rikotaan, kun olet kirjoittanut koodin, joka heittää "ei toteutettuja poikkeuksia", tai piilotat menetelmät johdetussa luokassa, jotka on merkitty virtuaalisiksi perusluokassa. Jos koodisi noudattaa Liskov-korvausperiaatetta, sinulla on monia etuja. Näitä ovat: koodin uudelleenkäytettävyys, vähentynyt kytkentä ja helpompi ylläpito.

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