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. Повреда!
Овај принцип је важан за обезбеђивање исправности наслеђивања и полиморфизма, чинећи код поузданијим и предвидљивијим.