Sobes.tech
Senior

Барбара Лискованын алмаштыруу принцибин түшүндүрүңүз.

sobes.tech AI

AIден жооп

Эгер программада 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"Аянт after enlarge_rectangle(rect): {enlarge_rectangle(rect)}") # Күтүлгөнү 12

square = Square(2)
print(f"Аянт after enlarge_rectangle(square): {enlarge_rectangle(square)}") # Күтүлгөнү 9, бирок set_width/set_height аркылуу Squareда 16 болот. Бул принцип бузуу!

Бул принцип мурас жана полиморфизмдин туура иштешин камсыз кылуу үчүн маанилүү, кодду ишенимдүү жана алдын ала билүүгө мүмкүндүк берет.