Liskov-féle behelyettesítési alapelv

A Wikipédiából, a szabad enciklopédiából
Portrait of Barbara Liskov
A Liskov-féle helyettesítési elvet Barbara Liskov vezette be, a kép 2010-ben készült.

A Liskov behelyettesítési elv (angolul rövidítve: LSP (Liskov Substitution Principle)) az altípus fogalmának sajátos meghatározása,  az úgynevezett erős viselkedéses altípusképzés, amit Barbara Liskov mutatott be egy 1988-ban rendezett konferencia keretén belül Adatabsztrakció és hierarchia címen. A “helyettesíthetőség” elvén alapul az objektum orientált programozás azon állítása, ami szerinte egy objektumnak (pl: osztályok) és egy alobjektumnak (mint pl.: egy osztály, ami kiterjeszti az első osztályt) felcserélhetőnek kell lennie anélkül, hogy megszakítaná a programot. Inkább szemantikus mint csupán szintaktikai kapcsolat, mert garantálni kívánja a típusok szemantikai interoperabilitását egy hierarchiában, különös tekintettel az objektumtípusokra. Barbara Liskov és Jeannette Wing egy 1994-es tanulmányukban tömören a következőképpen írták le az elvet:

“Altípus követelmények: Legyen Φ(Χ) egy T típusú x típusú objektumokról bizonyítható tulajdonság. Akkor Φ(y) igaznak kell lennie az S típusú y objektumokra, ahol S a T altípusa."

Ugyanebben a tanulmányban Liskov és Wing részletezte a viselkedéses altípusalkotás fogalmát a Hoare-logika egy kiterjesztésében, amely bizonyos hasonlóságot mutat Bertrand Meyer szerződéses tervezésével, mivel figyelembe veszi az altípusalkotás kölcsönhatását az előfeltételekkel, utófeltételekkel és invarianciákkal.

Elv[szerkesztés]

A Liskov-féle viselkedési altípus fogalma meghatározza az objektumok helyettesíthetőségének fogalmát; vagyis ha S a T altípusa, akkor egy programban a T típusú objektumok helyettesíthetők S típusú objektumokkal anélkül, hogy a program kívánatos tulajdonságai (pl. a helyesség) megváltoznának.

A viselkedéses altípusmeghatározás erősebb fogalom, mint a típuselméletben definiált tipikus függvény altípusmeghatározás, amely csak a paramétertípusok kontravariánsságára és a visszatérési típus kovarianciájára támaszkodik. A viselkedéses altípusmeghatározás általában eldönthetetlen: ha q az "x metódus mindig befejeződik" tulajdonság, akkor egy program (pl. egy fordítóprogram) számára lehetetlen ellenőrizni, hogy ez igaz-e a T bizonyos S altípusára, még akkor is, ha q a T-re igaz. Mindazonáltal az elv hasznos az osztályhierarchiák tervezésével kapcsolatos érvelésben.


A Liskov-féle behelyettesítési elv néhány szabványos követelményt támaszt az aláírásokkal szemben, amelyeket az újabb objektumorientált programozási nyelvek is átvettek (általában nem típusok, hanem osztályok szintjén; a különbséget lásd a nominális és a strukturális altípusok között):

  • A metódusparamétertípusok kontravarianciája az altípusban.
  • A metódusok visszatérési típusainak kovarianciája az altípusban.
  • Az altípus metódusai nem dobhatnak új kivételeket, kivéve, ha azok a szupertípus metódusai által dobott kivételek altípusai.

Az aláírási követelményeken kívül az altípusnak számos viselkedési feltételnek is meg kell felelnie. Ezeket a szerződéses tervezés módszertanához hasonló terminológiával részletezzük, ami bizonyos korlátozásokhoz vezet a szerződések és az öröklés közötti kölcsönhatás tekintetében:

  • Az előfeltételek nem erősíthetők meg az altípusban.
  • Az utófeltételek nem gyengíthetők az altípusban.
  • Az invariánsokat meg kell őrizni az altípusban.
  • Előzménykényszer (az "előzményszabály"). Az objektumok csak a metódusaikon keresztül módosíthatónak tekintendők (egységbezárás). Mivel altípusok bevezethetnek olyan metódusokat, amelyek a szupertípusban nincsenek jelen, ezen metódusok bevezetése olyan állapotváltozásokat is lehetővé tehet az altípusban, amelyek a szupertípusban nem megengedettek. Az előzményekre vonatkozó korlátozás ezt tiltja. Ez volt a Liskov és Wing által bevezetett új elem. Ennek a megszorításnak a megsértését példázhatjuk azzal, hogy egy változtatható pontot egy megváltoztathatatlan pont altípusaként definiálunk. Ez a történeti megkötés megsértése, mert a megváltoztathatatlan pont történetében az állapot a létrehozás után mindig ugyanaz, tehát nem tartalmazhatja a változtatható pont történetét általában. Az altípushoz hozzáadott mezők azonban nyugodtan módosíthatók, mert a szupertípus metódusain keresztül nem figyelhetők meg. Így egy megváltoztathatatlan középponttal és változtatható sugárral rendelkező kört definiálhatunk egy megváltoztathatatlan pont altípusaként anélkül, hogy az előzményi korlátot megsértenénk.

Eredet[szerkesztés]

Az elő- és utófeltételekre vonatkozó szabályok megegyeznek azokkal, amelyeket Bertrand Meyer 1988-as könyvében, az Object-Oriented Software Construction (Objektumorientált szoftverkonstrukció) című könyvben mutatott be. Meyer és később Pierre America, aki elsőként használta a viselkedéses altípusalkotás kifejezést, bizonyításelméleti definíciókat adtak néhány viselkedéses altípusalkotás fogalmára, de definícióik nem vették figyelembe az aliasinget, amely a hivatkozásokat vagy mutatókat támogató programozási nyelvekben előfordulhat. Az aliasing figyelembe vétele volt Liskov és Wing (1994) nagy előrelépése, amelynek egyik legfontosabb összetevője az előzménykényszer. Meyer és America definíciói szerint egy változtatható pont egy megváltoztathatatlan pont viselkedési altípusa lenne, míg Liskov behelyettesítési elve ezt tiltja.

Kritika[szerkesztés]

Bár széles körben használják, a viselkedéses altípusosítás jellemzése, mint a szupertípus objektumok altípus objektumokkal való helyettesítésének képessége, hibásnak mondható. Nem tesz említést a specifikációkról, így olyan helytelen olvasatra invitál, ahol a szupertípus implementációját hasonlítják össze az altípus implementációjával. Ez több okból is problémás, az egyik, hogy nem támogatja azt a gyakori esetet, amikor a szupertípus absztrakt és nincs implementációja. Továbbá, finomabban, az objektumorientált imperatív programozás kontextusában nehéz pontosan definiálni, hogy mit jelent egy adott típusú objektumok felett univerzálisan vagy egzisztenciálisan kvantifikálni, vagy egy objektumot helyettesíteni egy másikkal. Amikor az altípusok meghatározását alkalmazzuk, általában nem altípus objektumokat helyettesítünk szupertípus objektumokkal, hanem egyszerűen altípus objektumokat használunk szupertípus objektumokként. Vagyis ugyanazok az objektumok, az altípus objektumok, amelyek egyben szupertípus objektumok is.

Egy 2016-os interjúban maga Liskov magyarázza, hogy amit a vitaindító előadásában bemutatott, az egy "informális szabály" volt, hogy Jeannette Wing később azt javasolta, hogy "próbálják meg kitalálni, hogy ez pontosan mit jelent", ami a viselkedési altípusalkotásról szóló közös publikációjukhoz vezetett, és valóban, "technikailag ezt viselkedési altípusalkotásnak hívják". Az interjú során nem használja a helyettesítési terminológiát a fogalmak megvitatására.

Fordítás[szerkesztés]

  • Ez a szócikk részben vagy egészben a Liskov substitution principle című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

Források[szerkesztés]

Konkrét referenciák[szerkesztés]

  • (1988. május 1.) „Keynote address — data abstraction and hierarchy”. ACM SIGPLAN Notices 23 (5), 17–34. o. DOI:10.1145/62139.62141.   A keynote address in which Liskov first formulated the principle.
  • Meyer, B.. Object-oriented Software Construction. Prentice Hall (1988. április 2.). ISBN 0-13-629031-0 

Általános hivatkozás[szerkesztés]

További információk[szerkesztés]