Programovanie

Skúmanie princípu substitúcie Liskov

Termín SOLID je populárna skratka používaná na označenie súboru piatich princípov softvérovej architektúry. Patria sem: SRP (Single Responsibility), Open / Close, Liskovova substitúcia, segregácia rozhraní a inverzia závislostí.

LSP (Liskov Substitution Principle) je základný princíp OOP a uvádza, že odvodené triedy by mali byť schopné rozšíriť svoje základné triedy bez zmeny ich správania. Inými slovami, odvodené triedy by mali byť nahraditeľné svojimi základnými typmi, t. J. Odkaz na základnú triedu by mal byť nahraditeľný odvodenou triedou bez ovplyvnenia správania. Princíp substitúcie Liskov predstavuje silný podtyp správania a zaviedla ho Barbara Liskov v roku 1987.

Podľa Barbary Liskovovej „Toto je hľadané niečo ako nasledujúca substitučná vlastnosť: Ak pre každý objekt o1 typu S existuje objekt o2 typu T taký, že pre všetky programy P definované v zmysle T je správanie P sa nemení, keď je o1 nahradený o2, potom S je podtyp T. "

Klasickým príkladom porušenia princípu substitúcie Liskov je problém obdĺžnik - štvorec. Trieda Square rozširuje triedu Rectangle a predpokladá, že šírka a výška sú rovnaké.

Zvážte nasledujúcu triedu. Trieda Rectangle obsahuje dva dátové členy - šírku a výšku. K dispozícii sú tiež tri vlastnosti - Výška, Šírka a Plocha. Zatiaľ čo prvé dve vlastnosti nastavujú výšku a šírku obdĺžnika, vlastnosť Area má geter, ktorý vracia plochu obdĺžnika.

 trieda Obdĺžnik

    {

chránená šírka int;

chránená int výška;

public virtual int Šírka

        {

dostať

            {

spätná šírka;

            }

nastaviť

            {

šírka = hodnota;

            }

        }

 

verejný virtuálny int Výška

        {

dostať

            {

návratová výška;

            }

nastaviť

            {

výška = hodnota;

            }

        }

               

public int Area

        {

dostať

            {

návratová výška * šírka;

            }

         }    

    }

Štvorec je typ obdĺžnika, ktorého všetky strany sú rovnako veľké, tj. Šírka a výška štvorca sú rovnaké.

štvorec triedy: Obdĺžnik

    {

verejné prepísanie int Šírka

        {

dostať

            {

spätná šírka;

            }

nastaviť

            {

šírka = hodnota;

výška = hodnota;

            }

        }

verejné prepísanie int Výška

        {

dostať

            {

spätná šírka;

            }

nastaviť

            {

šírka = hodnota;

výška = hodnota;

            }

        }

    }

Zvážte inú triedu s názvom ObjectFactory.

 trieda ObjectFactory

    {

verejný statický obdĺžnik GetRectangleInstance ()

        {

vrátiť nový štvorec ();

        }

    }

Upozorňujeme, že nastavovacie prvky vlastností Width a Height v triede Square boli prepísané a upravené tak, aby bola zaistená rovnaká výška a šírka. Poďme teraz vytvoriť inštanciu triedy Obdĺžnik pomocou a nastaviť jej vlastnosti výšky a šírky.

Obdĺžnik s = ObjectFactory.GetRectangleInstance ();

s.výška = 9;

s.šírka = 8;

Console.WriteLine (s.Area);

Vyššie uvedený úryvok kódu po spustení zobrazí v konzole hodnotu 64. Očakávaná hodnota je 72, pretože uvedená šírka je 9, respektíve 8 výška. Toto je porušenie princípu substitúcie Liskov. Je to tak preto, lebo trieda Square, ktorá rozšírila triedu Rectangle, zmenila správanie. Aby sa zabezpečilo, že nebude porušený princíp substitúcie Liskov, trieda Square môže rozšíriť triedu Rectangle, ale nemala by meniť správanie. Správanie sa zmenilo úpravou nastavovacích prvkov vlastností Width a Height. Hodnoty výšky a šírky sú rovnaké, ak ide o štvorec - nemali by byť rovnaké, ak ide o obdĺžnik.

Ako to napravíme, t. J. Zaistíme, aby táto zásada nebola porušená? Môžete si nechať predstaviť novú triedu s názvom Štvoruholník a zabezpečiť, aby triedy Obdĺžnik aj Štvorcový rozšírili triedu Štvoruholník.

 verejná trieda Quadrilateral

    {

public virtual int Výška {get; sada; }

public virtual int Šírka {get; sada; }

public int Area

        {

dostať

            {

návratová výška * šírka;

            }

        }

    } 

Teraz by triedy Rectangle aj Square mali rozšíriť triedu Quadrilateral a vhodne nastaviť hodnoty vlastností Width a Height. V podstate by odvodené triedy mali mať potrebnú funkcionalitu na nastavenie hodnôt týchto vlastností na základe typu inštancie štvoruholníka, pre ktorú potrebujete vypočítať plochu. Upozorňujeme, že vlastnosti Výška aj Šírka boli v triede Štvoruholník označené ako virtuálne, čo znamená, že tieto vlastnosti by mali byť prepísané triedami, ktoré odvodzujú triedu Štvoruholník.

Princíp substitúcie Liskov je rozšírením princípu Open Close a je porušený, keď máte napísaný kód, ktorý vrhá „neimplementované výnimky“ alebo skryjete metódy v odvodenej triede, ktoré boli v základnej triede označené ako virtuálne. Ak váš kód dodržiava zásadu substitúcie Liskov, máte veľa výhod. Patria sem: opätovné použitie kódu, znížené prepojenie a ľahšia údržba.

$config[zx-auto] not found$config[zx-overlay] not found