Programmēšana

Liskovas aizstāšanas principa izpēte

Termins SOLID ir populārs akronīms, ko lieto, lai apzīmētu piecu programmatūras arhitektūras principu kopumu. Tie ietver: SRP (viena atbildība), atvēršanu / aizvēršanu, Liskova aizstāšanu, saskarnes segregāciju un atkarības inversiju.

LSP (Liskov Substitution Principle) ir OOP pamatprincips, un tajā teikts, ka atvasinātajām klasēm jāspēj paplašināt savas pamatklases, nemainot uzvedību. Citiem vārdiem sakot, atvasinātajām klasēm jābūt aizstājamām ar to bāzes tipiem, t.i., atsaucei uz bāzes klasi jābūt aizstājamai ar atvasinātu klasi, neietekmējot uzvedību. Liskovas aizstāšanas princips ir spēcīgs uzvedības apakštips, un to Barbara Liskova ieviesa 1987. gadā.

Saskaņā ar Barbaras Liskovas teikto: "Šeit tiek meklēts kaut kas līdzīgs šādam aizstāšanas īpašumam: Ja katram S veida objektam o1 ir T veida objekts o2, ka visām programmām P, kas definētas ar T, P uzvedība nemainās, kad o1 tiek aizstāts ar o2, tad S ir T. apakštips. "

Klasisks Liskovas aizstāšanas principa pārkāpuma piemērs ir taisnstūra - kvadrāta problēma. Klase Square paplašina Taisnstūra klasi un pieņem, ka platums un augstums ir vienādi.

Apsveriet šādu klasi. Taisnstūra klasē ir divi datu dalībnieki - platums un augstums. Ir arī trīs īpašības - augstums, platums un laukums. Kamēr pirmie divi rekvizīti nosaka taisnstūra augstumu un platumu, rekvizītam Platība ir getter, kas atgriež taisnstūra laukumu.

 klases Taisnstūris

    {

aizsargāts int platums;

aizsargāts int augstums;

publiskais virtuālais int Platums

        {

gūt

            {

atgriešanās platums;

            }

komplekts

            {

platums = vērtība;

            }

        }

 

publiskais virtuālais int Augstums

        {

gūt

            {

atgriešanās augstums;

            }

komplekts

            {

augstums = vērtība;

            }

        }

               

public int Area

        {

gūt

            {

atgriešanās augstums * platums;

            }

         }    

    }

Kvadrāts ir taisnstūra tips, kura malas ir vienāda izmēra, t.i., kvadrāta platums un augstums ir vienādi.

klases laukums: taisnstūris

    {

public override int Width

        {

gūt

            {

atgriešanās platums;

            }

komplekts

            {

platums = vērtība;

augstums = vērtība;

            }

        }

sabiedrības ignorēšana augstumā

        {

gūt

            {

atgriešanās platums;

            }

komplekts

            {

platums = vērtība;

augstums = vērtība;

            }

        }

    }

Apsveriet vēl vienu klasi ar nosaukumu ObjectFactory.

 klase ObjectFactory

    {

publiskais statiskais taisnstūris GetRectangleInstance ()

        {

atgriezt jaunu laukumu ();

        }

    }

Ņemiet vērā, ka platuma un augstuma rekvizīti klasē Kvadrāts ir ignorēti un modificēti, lai nodrošinātu, ka augstums un platums ir vienādi. Tagad izveidosim Taisnstūra klases instanci, izmantojot un iestatot tās augstuma un platuma īpašības.

Taisnstūris s = ObjectFactory.GetRectangleInstance ();

s. augstums = 9;

s. platums = 8;

Console.WriteLine (s.Area);

Iepriekš izpildītais koda fragments, izpildot, konsolē parādīs vērtību 64. Paredzamā vērtība ir 72, jo minētais platums un augstums ir attiecīgi 9 un 8. Tas ir Liskovas aizstāšanas principa pārkāpums. Tas ir tāpēc, ka kvadrāta klase, kas ir paplašinājusi Taisnstūra klasi, ir mainījusi uzvedību. Lai nodrošinātu, ka netiek pārkāpts Liskovas aizstāšanas princips, klase Square var paplašināt klasi Taisnstūris, taču tai nevajadzētu mainīt uzvedību. Rīcība ir mainīta, pārveidojot iestatītājus gan rekvizītiem Platums, gan Augstums. Ja kvadrāts ir kvadrāts, augstuma un platuma vērtības ir vienādas - tām nevajadzētu būt vienādām, ja tas ir taisnstūris.

Kā to novērst, t.i., nodrošināt, lai šis princips netiktu pārkāpts? Nu, jūs varat ieviest jaunu klasi ar nosaukumu četrstūris un pārliecināties, ka gan taisnstūra, gan kvadrāta klases paplašina četrstūra klasi.

 publiskā klase četrstūris

    {

publiskais virtuālais int Augstums {get; komplekts; }

publiskais virtuālais int Platums {get; komplekts; }

public int Area

        {

gūt

            {

atgriešanās augstums * platums;

            }

        }

    } 

Tagad gan taisnstūra, gan kvadrāta klasēm jāpaplašina četrstūra klase un atbilstoši jāiestata rekvizītu platums un augstums vērtības. Būtībā atvasinātajām klasēm jābūt ar nepieciešamo funkcionalitāti, lai šīm īpašībām iestatītu vērtības, pamatojoties uz četrstūra instances veidu, kurai jums jāaprēķina laukums. Ņemiet vērā, ka gan augstuma, gan platuma īpašības četrstūra klasē ir atzīmētas kā virtuālas, kas nozīmē, ka šīs īpašības ir jāpārspēj klasēm, kas iegūst četrstūra klasi.

Liskova aizstāšanas princips ir atvērta aizvēršanas principa paplašinājums, un tas tiek pārkāpts, ja esat uzrakstījis kodu, kas met "neīstenotus izņēmumus", vai slēpjat atvasinātās klases metodes, kas bāzes klasē ir atzīmētas kā virtuālas. Ja jūsu kods atbilst Liskovas aizstāšanas principam, jums ir daudz priekšrocību. Tie ietver: koda atkārtotu lietošanu, samazinātu savienošanu un vieglāku apkopi.

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