Tutorial

Fitsipika momba ny fanoloana an'i Liskov, fitsipika SOLID fahatelo

Ny kilasin'ny ankizy dia tsy tokony hisy fiantraikany na hanova ny les defifanambarana ny karazana kilasy ray aman-dreny.

Ny foto-kevitr'io fitsipika io dia nampidirin'i Barbara Liskov tamin'ny fehin-kevitry ny fihaonambe tamin'ny 1987 ary taty aoriana dia navoaka tao amin'ny gazety niaraka tamin'i Jannette Wing tamin'ny 1994. definy original dia toy izao:

Avelao ny q (x) ho fananana azo aseho amin'ny zavatra x ny karazany T. Avy eo ny q (y) dia tokony aseho ho an'ny zavatra y ny karazana S izay ny S dia karazana subtype an'ny T.

Taty aoriana, tamin'ny famoahana ny fitsipika SOLID nataon'i Robert C. Martin tao amin'ny bokiny Agile Software Development, Principles, Patterns, and Practices ary avy eo navoaka indray tao amin'ny C# version an'ny boky Agile Principles, Patterns, and Practices in C#, ny defiNanjary fantatra amin'ny anarana hoe fitsipiky ny fanoloana Liskov.

Izany dia mitondra antsika amin'ny defifampahalalana nomen'i Robert C. Martin: Ireo Subtypes dia tsy maintsy soloina amin'ny karazany avy.

Raha tsorina, ny subclass dia tokony hanilika ny fomban'ny kilasy ray aman-dreny amin'ny fomba izay tsy manapaka ny fiasan'izy ireo amin'ny fomba fijerin'ny mpanjifa. Ity misy ohatra tsotra iray hanehoana ny hevitra.

kilasy Vehicle {

    function startEngine () {

        // Fandefasana motera default

    }

 

    hanafainganana () {

        // Fomba fanafainganana default

    }

}

Raha omena kilasy Vehicle - mety ho abstract - ary fampiharana roa:

kilasy Fiara Manitatra Fiara {

    function startEngine () {

        $ this-> entrIgnition ();

        ray aman-dreny :: startEngine ();

    }

 

    anjara asa manokana fandraisana andraikitra () {

        // Fomba fandorana

    }

}

 

kilasy ElectricBus dia manitatra ny fiaran'ny fiara {

    hanafainganana () {

        $ this-> increaseVoltage ();

        $ this-> connectIndividualEngines ();

    }

 

    fiasana manokana increaseVoltage () {

        // Lojika elektrika

    }

 

    fifandraisana manokana mifandrayIndividualEngines () {

        // Lojika fifandraisana

    }

}

mpamily kilasy {

    asa mandeha (Vehivavy $ v) {

        $ v-> startEngine ();

        $ v-> manafaingana ();

    }

}

Ny kilasin'ny mpanjifa dia tokony afaka mampiasa roa raha toa ka afaka mampiasa Vehicle.

Izay mitondra antsika amin'ny fampiharana tsotra ny Lamin'ny endrika famolavolana modely tahaka ny nampiasanay azy tao amin'ny OCP.

Mety ho liana amin'ny fitsipika SOLID faharoa koa ianao: https: //bloginnovazione.mg / open-closed-second-solid-principle / 3906 /

Miorina amin'ny zavatra niainantsika taloha tamin'ny fitsipika Open / Closed, afaka manatsoaka hevitra izahay fa ny fitsipika momba ny fanoloana Liskov dia mifandray akaiky amin'ny OCP. Raha ny marina, "ny fanitsakitsahana ny LSP dia fanitsakitsahana an-keriny ny OCP" (Robert C. Martin), ary ny modely modely modely modely dia ohatra iray fanajana sy fampiharana ny LSP, izay iray amin'ireo vahaolana ihany koa hanarahana miaraka amin'ny OCP.

Ohatra ny fanitsakitsahana ny LSP

mahitsizoro kilasy {

    tsy miankina $ topLeft;

    sakan'ny $ manokana;

    haavon'ny $ tsy miankina;

 

    set public havoakan'ny besinimaro (haavo $) {

        $ ity-> haavo = $ haavony;

    }

 

Gazety fanavaozana
Aza adino ny vaovao manan-danja indrindra momba ny fanavaozana. Misoratra anarana handray azy ireo amin'ny mailaka.

    public function getHeight () {

        avereno $ ity-> haavony;

    }

 

    public function setWidth (sakany $) {

        $ ity-> sakany = $ sakany;

    }

 

    public function getWidth () {

        avereno $ ity-> sakany;

    }

}

Andao atomboka amin'ny endrika geometrika fototra, ny efa-joro. Izy io dia singa data tsotra fotsiny miaraka amin'ny mpiorina sy mpanangom-bokatra ho an'ny sakany sy hahavony. Alao an-tsaina hoe mandeha ny fampiharana ary efa ampitaina amin'ny mpanjifa maromaro. Ankehitriny dia mila fampisehoana vaovao izy ireo. Tsy maintsy afaka manodinkodina ny kianja izy ireo.

Amin'ny tena fiainana, amin'ny géometry, ny efa-joro dia endrika iray mahitsizoro. Azontsika atao ny manandrana mampiditra kilasy Kianja izay manitatra kilasy Rectangle. Matetika no lazaina fa kilasy ray aman-dreny ny kilasy zaza ary ity fehezanteny ity dia mifanaraka amin'ny LSP ihany, farafaharatsiny raha jerena voalohany.

kilasy Kianja manitatra ny mahitsizoro {

    set public an'ny setHeight (sanda $) {

        $ ity-> sakany = sanda $;

        $ ity-> haavo = sanda $;

    }

 

    public function setWidth (sanda $) {

        $ ity-> sakany = sanda $;

        $ ity-> haavo = sanda $;

    }

}

Ny kianja dia toradroa mitovy ny sakany sy ny haavony ary afaka manao fampiharana hafahafa toy ny ohatra teo aloha isika. Azontsika atao ny manilika ireo setter roa mba hametraka ny haavony sy ny sakany. Saingy ahoana no hisy akony amin'ny kaody mpanjifa?

mpanjifa kilasy {

    faritra faritraVerifier (Rectangle $ r) {

        $ a-> setWidth (5);

        $ a-> setHeight (4);

        raha ($ a-> faritra ()! = 20) {

            manipy Exception vaovao ('faritra ratsy!');

        }

        miverina marina;

    }

}

Azo eritreretina ny fananana kilasin'ny mpanjifa izay manamarina ny faritra misy ny efa-joro ary manipy ankanavaka raha diso izany.

faritra ampiasaina () {

    avereno $ ity-> sakany * $ ity-> haavony;

}

Mazava ho azy fa nampidirinay tao amin'ny kilasinay Rectangle ny fomba etsy ambony hanomezana ilay faritra.

kilasy LspTest dia manitatra PHPUnit_Framework_TestCase {

    test testRectangleArea () {

        $ r = Rectangle vaovao ();

        $ c = mpanjifa vaovao ();

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

    }

}

Ary namorona fitsapana tsotra izahay tamin'ny fandefasana zavatra mahitsizoro tsy misy dikany mankany amin'ny mpitsikilo faritra ary mandalo ny fitsapana. Raha ny Kianjan'ny kilasy misy antsika defivoalamina tsara, ny fandefasana azy any amin'ny Client's areaVerifier() dia tsy tokony hanapaka ny asany. Raha ny marina, ny efamira dia mahitsizoro amin'ny lafiny matematika rehetra. Fa angaha ny kilasintsika?

test testSquareArea () {

    $ r = Kianja vaovao ();

    $ c = mpanjifa vaovao ();

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

}

Noho izany, ny kilasin'ny Square dia tsy Rectangle mihitsy. Mandika ny lalàn'ny géométrie izany. Tsy nahomby izany ary mandika ny fitsipiky ny fanoloana Liskov.

Ercole Palmeri

Gazety fanavaozana
Aza adino ny vaovao manan-danja indrindra momba ny fanavaozana. Misoratra anarana handray azy ireo amin'ny mailaka.

Lahatsoratra vao haingana

Ny Mpanonta sy ny OpenAI dia manao sonia fifanarahana mba hifehy ny fikorianan'ny vaovao karakarain'ny Artificial Intelligence

Ny alatsinainy lasa teo, nanambara fifanarahana tamin'ny OpenAI ny Financial Times. Ny FT dia manome alalana ny asa fanaovan-gazety manerantany…

30 Aprily 2024

Fandoavam-bola amin'ny Internet: Ity no fomba handoavanao ny serivisy streaming

Olona an-tapitrisany no mandoa serivisy streaming, mandoa saram-pamandrihana isam-bolana. Hevitra mahazatra fa ianao…

29 Aprily 2024

Veeam dia manasongadina ny fanohanana feno indrindra ho an'ny ransomware, manomboka amin'ny fiarovana ka hatramin'ny famaliana sy ny fanarenana

Ny Coveware avy amin'i Veeam dia hanohy hanome tolotra famaliana trangan-javatra an-tserasera. Ny Coveware dia hanolotra fahaiza-manao forensika sy fanavaozana…

23 Aprily 2024

Revolisiona Maitso sy Nomerika: Ahoana no fiovan'ny Fikojakojana mialoha ny indostrian'ny solika sy ny entona

Ny fikojakojana mialoha dia manova ny sehatry ny solika sy entona, miaraka amin'ny fomba fiasa vaovao sy mavitrika amin'ny fitantanana orinasa.…

22 Aprily 2024