Sobes.tech
Senior

Barbara Liskov'un yerine koyma ilkesini açıklayın.

sobes.tech yapay zeka

AI'dan gelen yanıt

Bir programda, S T'nin bir alt türü ise, programdaki T türündeki nesneler, programın işlevselliğini bozmayacak şekilde S türündeki nesnelerle değiştirilebilir.

Ana noktalar:

  • Davranışın korunması: Alt tür, dışarıdan gözlemci açısından temel türü gibi davranmalıdır.
  • Değişmezlikler: Temel sınıfın değişmezlikleri, alt sınıflarda korunmalıdır.
  • Postkoşullar: Alt sınıfın postkoşulları (bir yöntemin çalıştırılmasından sonra doğru olması gereken koşullar), temel sınıfınkilerle aynı veya daha güçlü olmalıdır.
  • Önkoşullar: Alt sınıfın önkoşulları (bir yöntemin çalıştırılmadan önce doğru olması gereken koşullar), temel sınıfınkilerle aynı veya daha zayıf olmalıdır.

Python örneği:

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 # İlke ihlali: genişliği değiştirmek yüksekliği de değiştirir

    def set_height(self, height):
        self._width = height # İlke ihlali: yüksekliği değiştirmek genişliği de değiştirir
        self._height = height

# LSP'yi ihlal eden kullanım örneği:
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) sonrası alan: {enlarge_rectangle(rect)}") # Beklenen 12

square = Square(2)
print(f"Enlarge_rectangle(square) sonrası alan: {enlarge_rectangle(square)}") # Beklenen 9, ancak Square'taki set_width/set_height nedeniyle 16 olur. İhlal!

Bu ilke, kalıtım ve çok biçimlilikte doğruluğu sağlamak ve kodu daha güvenilir ve öngörülebilir hale getirmek için önemlidir.