konzultace

Princip substituce Liskov, třetí princip SOLID

Podřízené třídy by nikdy neměly ovlivňovat ani upravovat soubory defipříkazy typu nadřazené třídy.

Koncept tohoto principu byl představen Barbarou Liskov v roce 1987 na konferenci a později publikován v článku společně s Jannette Wing v roce 1994. defipůvodní verze je následující:

Nechť q (x) je prokazatelná vlastnost na objektech x typu T. Pak q (y) by mělo být prokazatelné pro objekty y typu S, kde S je podtyp T.

Později, s publikací Roberta C. Martina SOLID principy v jeho knize Agile Software Development, Principles, Patterns and Practices a poté znovu publikovány ve verzi C# knihy Agile Principles, Patterns and Practices in C#, defivešel ve známost jako Liskovův substituční princip.

Tím se dostáváme k defiinformace poskytl Robert C. Martin: Podtypy musí být vyměnitelné za jejich základní typy.

Zcela jednoduše by podtřída měla přepsat metody nadřazené třídy způsobem, který nezruší funkčnost z pohledu zákazníka. Zde je jednoduchý příklad k prokázání konceptu.

třída Vozidlo {

    funkce startEngine () {

        // Výchozí funkce spouštění motoru

    }

 

    funkce accelerate () {

        // Výchozí funkce zrychlení

    }

}

Vzhledem k třídě vozidla - může to být abstraktní - a dvěma implementacím:

třída Car rozšiřuje vozidlo {

    funkce startEngine () {

        $ this-> combineIgnition ();

        parent :: startEngine ();

    }

 

    soukromá funkce engIgnition () {

        // Postup zapalování

    }

}

 

třída ElectricBus rozšiřuje vozidlo {

    funkce accelerate () {

        $ this-> increaseVoltage ();

        $ this-> connectIndividualEngines ();

    }

 

    zvýšení soukromé funkceVoltage () {

        // Elektrická logika

    }

 

    soukromá funkce connectIndividualEngines () {

        // Logika připojení

    }

}

řidič třídy {

    funkce go (Vehicle $ v) {

        $ v-> startEngine ();

        $ v-> accelerate ();

    }

}

Třída klienta by měla být schopna používat obě, pokud může používat vozidlo.

Což nás přivádí k jednoduché implementaci návrhového vzoru šablony, jak jsme jej použili v OCP.

Také by vás mohl zajímat druhý princip SOLID: https: //bloginnovazione.cs / otevřená-uzavřená-sekunda-pevná-princip / 3906 /

Na základě našich předchozích zkušeností s principem Open / Closed můžeme usoudit, že princip substituce Liskov úzce souvisí s OCP. Ve skutečnosti „porušení LSP je latentním porušením OCP“ (Robert C. Martin) a návrhový vzor šablony je klasickým příkladem respektu a implementace LSP, což je jedno z řešení, jak také vyhovět s OCP.

Příklad porušení LSP

třída Obdélník {

    soukromé $ topLeft;

    soukromá $ šířka;

    soukromá $ výška;

 

    public function setHeight ($ height) {

        $ this-> height = $ height;

    }

 

Inovační zpravodaj
Nenechte si ujít nejdůležitější novinky o inovacích. Přihlaste se k jejich odběru e-mailem.

    veřejná funkce getHeight () {

        vrátit $ this-> výška;

    }

 

    veřejná funkce setWidth ($ width) {

        $ this-> width = $ width;

    }

 

    veřejná funkce getWidth () {

        vrátit $ this-> width;

    }

}

Začněme základním geometrickým tvarem, obdélníkem. Je to jen jednoduchý datový objekt se seřizovači a getry pro šířku a výšku. Představte si, že naše aplikace funguje a je již nasazena na několika klientech. Nyní potřebují novou funkci. Musí být schopni manipulovat s čtverci.

V reálném životě je v geometrii čtverec konkrétním tvarem obdélníku. Takže bychom se mohli pokusit implementovat třídu Square, která rozšiřuje třídu Rectangle. Často se říká, že podřízená třída je nadřazenou třídou a tento výraz alespoň na první pohled odpovídá LSP.

třída Square rozšiřuje obdélník {

    public function setHeight ($ value) {

        $ this-> width = $ value;

        $ this-> height = $ value;

    }

 

    public function setWidth ($ value) {

        $ this-> width = $ value;

        $ this-> height = $ value;

    }

}

Čtverec je obdélník se stejnou šířkou a výškou a mohli bychom provést podivnou implementaci jako v předchozím příkladu. Mohli bychom přepsat oba nastavovače a nastavit jak výšku, tak šířku. Jak to ale ovlivní kód klienta?

klient třídy {

    function areaVerifier (Rectangle $ r) {

        $ r-> setWidth (5);

        $ r-> setHeight (4);

        if ($ r-> area ()! = 20) {

            vyvolá novou výjimku ('Bad area!');

        }

        return true;

    }

}

Je myslitelné mít klientskou třídu, která kontroluje oblast obdélníku a vyvolá výjimku, pokud je nesprávná.

funkční oblast () {

    vrátit $ this-> width * $ this-> height;

}

Zjevně jsme přidali výše uvedenou metodu do naší třídy Rectangle, abychom poskytli oblast.

třída LspTest rozšiřuje PHPUnit_Framework_TestCase {

    function testRectangleArea () {

        $ r = nový obdélník ();

        $ c = nový klient ();

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

    }

}

A vytvořili jsme jednoduchý test odesláním prázdného obdélníkového objektu do oblasti kontroly a test prošel. Pokud je naše třída Square defiPokud byl správně dokončen, jeho odeslání do klientského areaVerifier() by nemělo narušit jeho funkčnost. Koneckonců, čtverec je obdélník v každém matematickém smyslu. Ale je to naše třída?

test funkce SquareArea () {

    $ r = nový čtverec ();

    $ c = nový klient ();

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

}

Takže naše třída Square nakonec není obdélník. Porušuje zákony geometrie. Selhává a porušuje zásadu Liskovovy substituce.

Ercole Palmeri

Inovační zpravodaj
Nenechte si ujít nejdůležitější novinky o inovacích. Přihlaste se k jejich odběru e-mailem.

Nedávné články

Britský antimonopolní regulátor vyhlašuje BigTech alarm kvůli GenAI

Britská CMA vydala varování před chováním Big Tech na trhu s umělou inteligencí. Tam…

18. dubna 2024

Casa Green: energetická revoluce pro udržitelnou budoucnost v Itálii

Vyhláška „Zelené domy“, formulovaná Evropskou unií za účelem zvýšení energetické účinnosti budov, uzavřela svůj legislativní proces s…

18. dubna 2024

Elektronický obchod v Itálii o +27 % podle nové zprávy Casaleggio Associati

Představena výroční zpráva Casaleggio Associati o elektronickém obchodu v Itálii. Zpráva s názvem „AI-Commerce: hranice elektronického obchodu s umělou inteligencí“.…

17. dubna 2024

Brilantní nápad: Bandalux představuje Airpure®, závěs, který čistí vzduch

Výsledek neustálých technologických inovací a závazku vůči životnímu prostředí a blahobytu lidí. Bandalux představuje Airpure®, stan…

12. dubna 2024