ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Лисков (Liskov Substitution Principle, LSP) ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ подклассов Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ взаимозамСняСмы с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Π±Π΅Π· измСнСния повСдСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ подклассы Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ€ΡƒΡˆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ Π»ΠΎΠ³ΠΈΠΊΡƒ. LSP являСтся Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΠΌ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠΌ Π² Π½Π°Π±ΠΎΡ€Π΅ SOLID ΠΈ ΠΈΠ³Ρ€Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² создании устойчивой ΠΈ понятной ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ классов.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ LSP:

  • ΠŸΠΎΠ΄ΠΊΠ»Π°ΡΡΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, Π½Π΅ измСняя Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.
  • ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹, Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ классами, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ строго ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒΡΡ.
  • Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ пСрСопрСдСлСния ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Ссли это измСняСт ΠΈΡ… ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° соблюдСния LSP:

  1. ΠŸΡ€Π΅Π΄ΡΠΊΠ°Π·ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ: Код, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс, Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ подклассы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ.
  2. Π£ΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ тСстирования: БистСма становится ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Π½ΠΎΠΉ ошибкам, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ всСгда ΡΠΎΠ±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ.
  3. Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ: Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… подклассов Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°, Ссли соблюдСн ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ LSP.
  4. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ: Π§Π΅Ρ‚ΠΊΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ обязанностСй ΠΌΠ΅ΠΆΠ΄Ρƒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌΠΈ классами ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ систСмы.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ LSP

Рассмотрим ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ классов для ΠΏΡ‚ΠΈΡ†:

public class Bird {
    public void fly() {
        // Π›ΠΎΠ³ΠΈΠΊΠ° ΠΏΠΎΠ»Π΅Ρ‚Π°
        System.out.println("I can fly!");
    }
}
 
public class Penguin extends Bird {
    @Override
    public void fly() {
        // Пингвин Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π»Π΅Ρ‚Π°Ρ‚ΡŒ β€” Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ LSP
        throw new UnsupportedOperationException("Penguins cannot fly");
    }
}
 

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС класс Penguin Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Bird. Код, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ любой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Bird ΠΌΠΎΠΆΠ΅Ρ‚ Π»Π΅Ρ‚Π°Ρ‚ΡŒ, пСрСстанСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΡ€ΠΈ использовании Penguin. Π­Ρ‚ΠΎ Π²Π΅Π΄Π΅Ρ‚ ΠΊ нСпрСдсказуСмому повСдСнию ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сопровоТдСния.

Для устранСния Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ слСдуСт ΠΏΠ΅Ρ€Π΅ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ классов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ явно Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π»Π΅Ρ‚Π°ΡŽΡ‰ΠΈΡ… ΠΈ Π½Π΅Π»Π΅Ρ‚Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ‚ΠΈΡ†:

public abstract class Bird {
    // ΠžΠ±Ρ‰ΠΈΠ΅ свойства ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для всСх ΠΏΡ‚ΠΈΡ†
}
 
public interface Flyable {
    void fly();
}
 
public class FlyingBird extends Bird implements Flyable {
    @Override
    public void fly() {
        // РСализация ΠΏΠΎΠ»Π΅Ρ‚Π°
        System.out.println("I can fly!");
    }
}
 
public class Penguin extends Bird {
    // Пингвин остаСтся Π½Π΅Π»Π΅Ρ‚Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ‚ΠΈΡ†Π΅ΠΉ
}
 

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΡ‚ΠΈΡ†Ρ‹ становится ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π»Π΅Ρ‚Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΈ Π½Π΅Π»Π΅Ρ‚Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΏΡ‚ΠΈΡ†Π°ΠΌΠΈ, Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Ρ LSP.


ΠœΠ΅Ρ‚Π° информация

ΠžΠ±Π»Π°ΡΡ‚ΡŒ:: 00 АрхитСктура ПО
Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ:: SOLID
Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ::
Π‘ΠΎΠ·Π΄Π°Π½Π°:: 2024-09-27
Автор::

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹

Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ