Mafunzo

Kanuni ya Uingizwaji wa Liskov, kanuni ya tatu SOLID

Madarasa ya watoto hayapaswi kamwe kuathiri au kurekebisha kidogo defitaarifa za aina ya darasa la wazazi.

Wazo la kanuni hii lilianzishwa na Barbara Liskov katika hotuba kuu ya mkutano wa 1987 na baadaye kuchapishwa katika karatasi pamoja na Jannette Wing mnamo 1994. defiasili ni kama ifuatavyo:

Wacha q (x) iwe mali inayoonyeshwa kwenye vitu x vya aina T. Halafu q (y) inapaswa kuonyeshwa kwa vitu y vya aina S ambapo S ni aina ndogo ya T.

Baadaye, kwa kuchapishwa kwa kanuni za MANGO za Robert C. Martin katika kitabu chake Agile Software Development, Principles, Patterns, and Practices na kisha kuchapishwa tena katika toleo la C# la kitabu Agile Principles, Patterns, and Practices in C#, the defition ilijulikana kama kanuni ya uingizwaji ya Liskov.

Hii inatuleta kwenye defihabari iliyotolewa na Robert C. Martin: Aina ndogo lazima zibadilishwe na aina zao za msingi.

Kwa urahisi kabisa, kikundi kidogo kinapaswa kupitisha njia za darasa la wazazi kwa njia ambayo haivunja utendaji kutoka kwa maoni ya mteja. Hapa kuna mfano rahisi kuonyesha dhana hiyo.

Gari la darasa {

    kazi startEngine () {

        // Utendaji chaguo-msingi wa injini

    }

 

    kazi kuharakisha () {

        // Utendakazi wa kuharakisha chaguo-msingi

    }

}

Imepewa darasa la Gari - inaweza kuwa dhahania - na utekelezaji mbili

darasa la gari linaongeza Gari {

    kazi startEngine () {

        $ hii-> jihusisheIgnition ();

        mzazi :: startEngine ();

    }

 

    kazi ya kibinafsi inajumuishaIgnition () {

        // Utaratibu wa kuwasha

    }

}

 

darasa la ElectricBus linaongeza Gari {

    kazi kuharakisha () {

        $ hii-> ongezeko la Voltage ();

        $ this-> connectIndividualEngines ();

    }

 

    ongezeko la kazi ya kibinafsiVoltage () {

        // Mantiki ya umeme

    }

 

    kazi ya kibinafsi connectIndividualEngines () {

        // Mantiki ya unganisho

    }

}

Dereva darasa {

    fanya kazi (Gari $ v) {

        $ v-> kuanzaEngine ();

        $ v-> kuharakisha ();

    }

}

Darasa la mteja linapaswa kutumia zote ikiwa linaweza kutumia Gari.

Ambayo inatuleta kwa utekelezaji rahisi wa Kielelezo cha Njia ya Kubuni ya Kiolezo kama tulivyoitumia katika OCP.

Unaweza pia kupendezwa na kanuni ya pili ya MANGO: https: //bloginnovazione.jw.org sw / kanuni-imara-iliyofunguliwa-ya pili-imara / 3906 /

Kulingana na uzoefu wetu wa zamani na kanuni iliyofunguliwa / iliyofungwa, tunaweza kuhitimisha kuwa kanuni ya uingizwaji wa Liskov inahusiana sana na OCP. Kwa kweli, "ukiukaji wa LSP ni ukiukaji wa hivi karibuni wa OCP" (Robert C. Martin), na muundo wa Kiolezo cha Njia ya Kiolezo ni mfano mzuri wa heshima na utekelezaji wa LSP, ambayo pia ni moja wapo ya suluhisho la kufuata na OCP.

Mfano wa ukiukaji wa LSP

Mstatili wa darasa {

    faragha $ juuLeft;

    faragha $ upana;

    urefu wa $ binafsi;

 

    kazi ya umma setHeight ($ urefu) {

        $ this-> urefu = $ urefu;

    }

 

Jarida la uvumbuzi
Usikose habari muhimu zaidi kuhusu uvumbuzi. Jisajili ili kuzipokea kwa barua pepe.

    kazi ya umma GetHeight () {

        kurudi $ this-> urefu;

    }

 

    kazi ya umma setWidth ($ upana) {

        $ hii-> upana = $ upana;

    }

 

    kazi ya umma GetWidth () {

        kurudi $ this-> upana;

    }

}

Wacha tuanze na sura ya kijiometri ya msingi, mstatili. Ni kitu rahisi tu cha data na seti na vizuizi kwa upana na urefu. Fikiria kuwa programu yetu inafanya kazi na tayari imeshapelekwa kwa wateja kadhaa. Sasa wanahitaji huduma mpya. Lazima waweze kuendesha viwanja.

Katika maisha halisi, katika jiometri, mraba ni sura fulani ya mstatili. Kwa hivyo tunaweza kujaribu kutekeleza darasa la Mraba ambalo linaongeza darasa la Mstatili. Mara nyingi husemwa kuwa darasa la mtoto ni darasa la mzazi, na usemi huu pia unafanana na LSP, angalau kwa mtazamo wa kwanza.

Mraba mraba unaongeza Mstatili {

    kazi ya umma setHeight ($ thamani) {

        $ hii-> upana = thamani ya $;

        $ this-> urefu = $ value;

    }

 

    kazi ya umma setWidth ($ value) {

        $ hii-> upana = thamani ya $;

        $ this-> urefu = $ value;

    }

}

Mraba ni mstatili wenye upana sawa na urefu na tunaweza kufanya utekelezaji wa kushangaza kama vile mfano uliopita. Tunaweza kubadilisha seti zote mbili kuweka urefu na upana wote. Lakini hii itaathiri vipi nambari ya mteja?

mteja wa darasa {

    eneo la kaziVerifier (Mstatili $ r) {

        $ r-> seti upana (5);

        $ r-> kuwekaUrefu (4);

        ikiwa ($ r-> eneo ()! = 20) {

            tupa Isipokuwa mpya ('Eneo baya!');

        }

        kurudi kweli;

    }

}

Inawezekana kuwa na darasa la mteja ambalo huangalia eneo la mstatili na hutupa ubaguzi ikiwa ni sawa.

eneo la kazi () {

    kurudi $ this-> upana * $ this-> urefu;

}

Kwa kweli tuliongeza njia iliyo hapo juu kwa darasa letu la Mstatili ili kutoa eneo hilo.

darasa la LspTest linaongeza PHPUnit_Framework_TestCase {

    jaribio la kaziRectangleArea () {

        $ r = Mstatili mpya ();

        $ c = Mteja mpya ();

        $ hii-> assertTrue ($ c-> areaVerifier ($ r));

    }

}

Na tuliunda jaribio rahisi kwa kutuma kitu tupu cha mstatili kwa kikagua eneo na kupitisha mtihani. Ikiwa darasa letu la Mraba ni defiimekamilika kwa usahihi, kuituma kwa eneo la MtejaVerifier() haipaswi kuvunja utendakazi wake. Baada ya yote, mraba ni mstatili katika kila maana ya hisabati. Lakini ni darasa letu?

jaribio la kaziSquareArea () {

    $ r = Mraba mpya ();

    $ c = Mteja mpya ();

    $ hii-> assertTrue ($ c-> areaVerifier ($ r));

}

Kwa hivyo, darasa letu la Mraba sio Mstatili hata hivyo. Inavunja sheria za jiometri. Inashindwa na inakiuka kanuni ya uingizwaji ya Liskov.

Ercole Palmeri

Jarida la uvumbuzi
Usikose habari muhimu zaidi kuhusu uvumbuzi. Jisajili ili kuzipokea kwa barua pepe.

Makala ya hivi karibuni

Kidhibiti cha kutokuaminika cha Uingereza kinainua kengele ya BigTech kupitia GenAI

CMA ya Uingereza imetoa onyo kuhusu tabia ya Big Tech katika soko la kijasusi bandia. Hapo...

Aprili 18 2024

Casa Green: mapinduzi ya nishati kwa mustakabali endelevu nchini Italia

Amri ya "Nyumba za Kijani", iliyoundwa na Umoja wa Ulaya ili kuongeza ufanisi wa nishati ya majengo, imehitimisha mchakato wake wa kutunga sheria na…

Aprili 18 2024

Biashara ya mtandaoni nchini Italia kwa +27% kulingana na Ripoti mpya ya Casaleggio Associati

Ripoti ya kila mwaka ya Casaleggio Associati kuhusu Biashara ya Biashara nchini Italia iliwasilishwa. Ripoti yenye kichwa "AI-Commerce: mipaka ya Biashara ya Kielektroniki yenye Akili Bandia".…

Aprili 17 2024

Wazo Bora: Bandalux inatoa Airpure®, pazia linalosafisha hewa

Matokeo ya uvumbuzi wa mara kwa mara wa kiteknolojia na kujitolea kwa mazingira na ustawi wa watu. Bandalux inatoa Airpure®, hema…

Aprili 12 2024