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

Wachapishaji na OpenAI hutia saini mikataba ya kudhibiti mtiririko wa taarifa zinazochakatwa na Intelligence Artificial Intelligence

Jumatatu iliyopita, Financial Times ilitangaza makubaliano na OpenAI. FT inatoa leseni kwa uandishi wake wa habari wa kiwango cha kimataifa…

Aprili 30 2024

Malipo ya Mtandaoni: Hivi Ndivyo Huduma za Utiririshaji Hukufanya Ulipe Milele

Mamilioni ya watu hulipia huduma za utiririshaji, kulipa ada za usajili za kila mwezi. Ni maoni ya kawaida kwamba wewe…

Aprili 29 2024

Veeam inaangazia usaidizi wa kina zaidi wa ransomware, kutoka kwa ulinzi hadi majibu na uokoaji

Coveware by Veeam itaendelea kutoa huduma za kukabiliana na matukio ya ulaghai mtandaoni. Coveware itatoa uwezo wa uchunguzi na urekebishaji…

Aprili 23 2024

Mapinduzi ya Kijani na Kidijitali: Jinsi Matengenezo Yanayotabirika yanavyobadilisha Sekta ya Mafuta na Gesi

Matengenezo ya kitabiri yanaleta mapinduzi katika sekta ya mafuta na gesi, kwa mbinu bunifu na makini ya usimamizi wa mitambo.…

Aprili 22 2024