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.
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 ();
}
}
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.
třída Obdélník {
soukromé $ topLeft;
soukromá $ šířka;
soukromá $ výška;
public function setHeight ($ height) {
$ this-> height = $ height;
}
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;
}
}
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
Britská CMA vydala varování před chováním Big Tech na trhu s umělou inteligencí. Tam…
Vyhláška „Zelené domy“, formulovaná Evropskou unií za účelem zvýšení energetické účinnosti budov, uzavřela svůj legislativní proces s…
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í“.…
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…