Princip substituce Liskov

Princip substituce Liskov (LSP) je v objektově orientovaném programování zvláštní definicí pojmu podtyp . Byl formulován Barbarou Liskovovou a Jeannette Wingovou v článku nazvaném Rodinné hodnoty: Behaviorální pojem subtypizace  :

Liskov a Wing navrhli následující zhuštěnou formulaci:

Pokud je prokazatelná vlastnost pro libovolný objekt typu , pak platí pro jakýkoli objekt typu , který je podtypem .

Zásada

Pojem podtyp, jak je definován Liskovem a Wingem, je založen na pojmu zaměnitelnosti  : pokud je podtypem , pak může být jakýkoli typový objekt nahrazen typovým objektem, aniž by došlo ke změně požadovaných vlastností příslušného programu.

Liskovův princip omezuje podpisy na definici podtypů:

Je také definována řada podmínek chování (viz část Návrh podle smlouvy ).

Návrh na základě smlouvy

Liskovův substituční princip úzce souvisí s metodikou programování smluv, což vede k omezením, která určují, jak mohou smlouvy interagovat s mechanismy dědičnosti  :

Liskovův substituční princip navíc naznačuje, že výjimky nového typu nelze vyvolávat metodami podtřídy, pokud tyto výjimky samy nejsou podtypy výjimek vyvolávaných metodami nadtřídy.

Funkce využívající znalosti hierarchie tříd porušuje princip, protože používá odkaz na základní třídu, ale musí mít také znalosti o podtřídách. Taková funkce porušuje princip otevřeno / zavřeno, protože musí být upravena při vytváření třídy odvozené od základní třídy.

Příklad porušení LSP

Klasickým příkladem porušení LSP je:

Očekávali byste, že budete moci použít instanci typu Carrékdekoli, kde Rectanglese očekává typ .

Problém: Čtverec, který má ze své podstaty čtyři stejné strany, je vhodné omezit úpravy výšky a šířky tak, aby byly vždy stejné. Pokud se však použije čtverec, kde se z hlediska chování očekává interakce s obdélníkem, může dojít k nekonzistentnímu chování: strany čtverce nelze nezávisle změnit, na rozdíl od obdélníku. Špatným řešením by bylo upravit stavitele čtverce tak, aby byla zachována jeho invariance. To by však porušilo postdekteru seřizovače obdélníků, který určuje, že lze nezávisle měnit výšku a šířku.

Jedním z řešení, jak se těmto nesrovnalostem vyhnout, je odstranit proměnlivou povahu tříd Carréa Rectangle. Jinými slovy, jsou přístupné pouze ke čtení. Nedochází k žádnému narušení LSP, je však nutné implementovat metody „height“ a „width“ do čtverce, což je sémanticky nesmysl.

Řešením není považovat typ Carréza náhradu za typ Rectanglea definovat je jako dva zcela nezávislé typy. To není v rozporu se skutečností, že čtverec je obdélník. Třída Carréje představitelem pojmu „čtverec“. Třída Rectangleje představitelem pojmu „obdélník“. Nicméně, zástupci nesdílejí stejné vlastnosti jako to, co oni reprezentují.

Zjištění porušení LSP

Typický případ narušení LSP lze snadno detekovat při použití operátoru detekce datového typu k podmínění chování podle typu objektu. Například typeofv C nebo C ++, isinstancev Pythonu, instanceofv Javě.

Například ve funkci Python:

def aFunction(anObject): if isinstance(anObject, AType): # do something elif isinstance(anObject, AnotherType): # do something else else: # default actions for the other case

Použití této instrukce isinstancev modulu mimo třídu anObjectje obvykle porušením Liskovova principu substituce a mělo by být nahrazeno využitím polymorfismu v jazyce.

Poznámky a odkazy

  1. Barbara Liskov , Wing, Jeannette , „  Rodinné hodnoty: Behaviorální představa o subtypizaci  “ ,16. července 1993(zpřístupněno 5. října 2006 ) .
  2. Barbara Liskov , Wing, Jeannette , „  Podtypování chování pomocí invarianty a omezení  “ ,Červenec 1999(zpřístupněno 5. října 2006 ) .
  3. "  Epizoda 11, Princip střídání Liskov - 1. část  "

Související články

<img src="https://fr.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;">