Programmering

Utforske Liskov-substitusjonsprinsippet

Begrepet SOLID er et populært akronym som brukes til å referere til et sett med fem prinsipper for programvarearkitektur. Disse inkluderer: SRP (Single Responsibility), Open / Close, Liskov's Substitution, Interface Segregation, and Dependency Inversion.

LSP (Liskov Substitution Principle) er et grunnleggende prinsipp for OOP og sier at avledede klasser skal kunne utvide basisklassene uten å endre oppførselen. Med andre ord bør avledede klasser være utskiftbare for deres basetyper, dvs. en referanse til en basisklasse skal kunne erstattes med en avledet klasse uten å påvirke oppførselen. Liskov-substitusjonsprinsippet representerer en sterk atferdsmessig undertyping og ble introdusert av Barbara Liskov i år 1987.

Ifølge Barbara Liskov, "Det som ønskes her, er omtrent som følgende erstatningsegenskap: Hvis det for hvert objekt o1 av type S er et objekt o2 av type T slik at for alle programmer P definert i termer av T, oppførselen til P er uendret når o1 er erstattet av o2, så er S en undertype av T. "

Et klassisk eksempel på brudd på Liskov-substitusjonsprinsippet er problemet Rectangle - Square. Square-klassen utvider Rectangle-klassen og antar at bredden og høyden er like.

Tenk på følgende klasse. Rektangelklassen inneholder to dataelementer - bredde og høyde. Det er også tre egenskaper - høyde, bredde og areal. Mens de to første egenskapene angir høyden og bredden på rektangelet, har Area-egenskapen en getter som returnerer området til rektangelet.

 klasse Rektangel

    {

beskyttet int bredde;

beskyttet int høyde;

offentlig virtuell int Bredde

        {

            {

retur bredde;

            }

sett

            {

bredde = verdi;

            }

        }

 

offentlig virtuell int Høyde

        {

            {

returhøyde;

            }

sett

            {

høyde = verdi;

            }

        }

               

offentlige int-området

        {

            {

returhøyde * bredde;

            }

         }    

    }

En firkant er en type rektangel der alle sidene er like store, dvs. bredden og høyden på et firkant er den samme.

klasse Firkant: Rektangel

    {

offentlig overstyring int Bredde

        {

            {

retur bredde;

            }

sett

            {

bredde = verdi;

høyde = verdi;

            }

        }

offentlig overstyring int Høyde

        {

            {

retur bredde;

            }

sett

            {

bredde = verdi;

høyde = verdi;

            }

        }

    }

Tenk på en annen klasse som heter ObjectFactory.

 klasse ObjectFactory

    {

offentlig statisk rektangel GetRectangleInstance ()

        {

returner nye Square ();

        }

    }

Legg merke til at setterne for bredde- og høydeegenskapene i Square-klassen er overstyrt og endret for å sikre at høyden og bredden er den samme. La oss nå lage en forekomst av klassen Rektangel ved å angi høyde- og breddeegenskapene.

Rektangel s = ObjectFactory.GetRectangleInstance ();

s.Høyde = 9;

s.Bredde = 8;

Console.WriteLine (s.Area);

Ovennevnte kodebit når det ble kjørt, ville vise verdien 64 i konsollen. Den forventede verdien er 72 siden nevnte bredde og høyde er henholdsvis 9 og 8. Dette er et brudd på Liskov-substitusjonsprinsippet. Dette er fordi Square-klassen som har utvidet Rectangle-klassen har endret oppførselen. For å sikre at Liskov-substitusjonsprinsippet ikke brytes, kan Square-klassen utvide Rectangle-klassen, men ikke endre oppførselen. Oppførselen er endret ved å endre setterne for både egenskapene Bredde og Høyde. Verdiene for høyde og bredde er de samme hvis det er en firkant - de bør ikke være de samme hvis det er et rektangel.

Hvordan fikser vi dette, dvs. sørger for at dette prinsippet ikke blir brutt? Vel, du kan få introdusert en ny klasse kalt Quadrilateral og sørge for at både Rectangle og Square-klassene utvider Quadrilateral-klassen.

 offentlig klasse firkant

    {

offentlig virtuell int Høyde {get; sett; }

offentlig virtuell int Bredde {get; sett; }

offentlige int-området

        {

            {

retur Høyde * Bredde;

            }

        }

    } 

Nå skal både rektangel- og firkantklassene utvide den firkantede klassen og sette verdiene til bredde- og høydeegenskapene riktig. I utgangspunktet skal de avledede klassene ha den nødvendige funksjonaliteten for å sette verdier til disse egenskapene basert på typen av den firesidige forekomsten du trenger å beregne areal for. Vær oppmerksom på at både høyde- og breddeegenskapene er merket som virtuelle i kvadrilateral-klassen, noe som betyr at disse egenskapene bør overstyres av klassene som utleder kvadrilateral-klassen.

Liskov Substitution Principle er en utvidelse av Open Close Principle og brytes når du har skrevet kode som kaster "ikke implementerte unntak" eller du skjuler metoder i en avledet klasse som er merket som virtuell i basisklassen. Hvis koden din overholder Liskov-substitusjonsprinsippet, har du mange fordeler. Disse inkluderer: kodebrukbarhet, redusert kobling og enklere vedlikehold.

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