Sobes.tech
Senior

Објасните принцип замене Барбаре Лисков.

sobes.tech АИ

Одговор од АИ

Ако у програму S је подтип T, онда објекти типа T у програму могу бити замењени објектима типа S без нарушавања функционалности програма.

Кључне тачке:

  • Очување понашања: Подтип треба да се понаша као његов основни тип, из перспективе спољашњег посматрача.
  • Инваријанте: Инваријанте основне класе треба да се одржавају у подкласи.
  • Постуслови: Постуслови (услови који треба да буду истинити након извршавања методе) подкласе треба да буду исти или јачи од постуслови основне класе.
  • Преуслови: Преуслови (услови који треба да буду истинити пре извршавања методе) подкласе треба да буду исти или слабији од преуслови основне класе.

Пример у Python-у:

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 # Повреда принципа: промена ширине мења и висину

    def set_height(self, height):
        self._width = height # Повреда принципа: промена висине мења и ширину
        self._height = height

# Пример коришћења који крши 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"Површина након enlarge_rectangle(rect): {enlarge_rectangle(rect)}") # Очекује 12

square = Square(2)
print(f"Површина након enlarge_rectangle(square): {enlarge_rectangle(square)}") # Очекује 9, али због set_width/set_height у Square ће бити 16. Повреда!

Овај принцип је важан за обезбеђивање исправности наслеђивања и полиморфизма, чинећи код поузданијим и предвидљивијим.