Sobes.tech
Senior

Vysvetlite princíp náhrady Barbary Liskov.

sobes.tech AI

Odpoveď od AI

Ak je v programe S podtyp T, potom objekty typu T v programe môžu byť nahradené objektmi typu S bez narušenia funkčnosti programu.

Kľúčové body:

  • Zachovanie správania: Podtyp by sa mal správať rovnako ako jeho základný typ, z pohľadu vonkajšieho pozorovateľa.
  • Invariaty: Invariaty základnej triedy by mali byť zachované v podtriedach.
  • Postpodmienky: Postpodmienky (podmienky, ktoré musia byť pravdivé po vykonaní metódy) podtriedy by mali byť rovnaké alebo silnejšie ako u základnej triedy.
  • Prepodmienky: Prepodmienky (podmienky, ktoré musia byť pravdivé pred vykonaním metódy) podtriedy by mali byť rovnaké alebo slabšie ako u základnej triedy.

Príklad v Pythone:

class Rectangle:
    def __init__(self, width, height):
        self._width = width
        self._height = height

    def set_width(self, width):
        self._width = width

    def set_height(self, height):
        self._height = height

    def area(self):
        return self._width * self._height

class Square(Rectangle):
    def __init__(self, side):
        super().__init__(side, side)

    def set_width(self, width):
        self._width = width
        self._height = width # Porušenie princípu: zmena šírky mení aj výšku

    def set_height(self, height):
        self._width = height # Porušenie princípu: zmena výšky mení aj šírku
        self._height = height

# Príklad použitia, ktorý porušuje LSP:
def enlarge_rectangle(rectangle):
    rectangle.set_width(rectangle._width + 1)
    rectangle.set_height(rectangle._height + 1)
    return rectangle.area()

rect = Rectangle(2, 3)
print(f"Plocha po enlarge_rectangle(rect): {enlarge_rectangle(rect)}") # Očakáva sa 12

square = Square(2)
print(f"Plocha po enlarge_rectangle(square): {enlarge_rectangle(square)}") # Očakáva sa 9, ale kvôli set_width/set_height v Square bude 16. Porušenie!

Tento princíp je dôležitý pre zabezpečenie správnosti dedičnosti a polymorfizmu, a robí kód spoľahlivejším a predvídateľnejším.