Sobes.tech
Senior

Kas ir Barbary Liskov aizstājības princips (LSP) un kā tas tiek piemērots Python izstrādē?

sobes.tech AI

Atbilde no AI

Liskov aizvietošanas princips (LSP) nosaka, ka pamata (vecāku) klases objektiem jābūt aizvietojamiem ar apakšklases objektiem, neradot programmas pareizas darbības traucējumus. Tas nozīmē, ka, ja klase B ir A apakšklase, kur sagaidāms A klases objekts, droši var izmantot B klases objektu.

Piemērošana Python:

  1. Mantošana bez izmaiņām: Apakšklases jāpaplašina funkcionalitāte, nevis jāmaina vai jātraucē pamata klases darbība.

    # Labs piemērs: Square ir taisnstūris, kur platums == augstums
    class Rectangle:
        def __init__(self, width, height):
            self.width = width
            self.height = height
    
        def area(self):
            return self.width * self.height
    
        def set_width(self, width):
            self.width = width
    
        def set_height(self, height):
            self.height = height
    
    class Square(Rectangle):
        def __init__(self, side):
            super().__init__(side, side)
    
        def set_width(self, width):
            super().set_width(width)
            super().set_height(width)
    
        def set_height(self, height):
            super().set_width(height)
            super().set_height(height)
    
    # Slikti: Ja `set_width` un `set_height` Square navētu pielāgoti,
    # tad `area()` uzvedība varētu būt nepareiza,
    # izmantojot Square, kad sagaidīts Rectangle.
    
  2. Vienādas metožu parakstu saderība: Apakšklases metodes jāuztur saderīgas ar pamata klases metodēm (argumentu skaits un tipi, atgriešanas vērtība).

  3. Negaidītas izņēmumi: Apakšklases nedrīkst izsist izņēmumus, kurus pamata klase nav paziņojusi.

  4. Invariantu saglabāšana: Apakšklases jāatbalsta pamata klases invarianti (nosacījumi, kas vienmēr ir patiesi).

LSP pārkāpums bieži noved pie negaidītas programmas uzvedības un sarežģī tās uzturēšanu.