User Tools

Site Tools


l

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
l [2022/03/09 13:25] – создано chifekl [2023/09/14 06:06] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Принцип подстановки Барбары Лисков. (Liskov Substitution Principle, LSP) ====== ====== Принцип подстановки Барбары Лисков. (Liskov Substitution Principle, LSP) ======
  
 +
 +Это третий из пяти принципов **SOLID** и наиболее сложный для понимания.
 +В оригинале данный принцип звучит так:
 +
 +//Пусть q(x) является свойством, верным относительно объектов x некоторого типа T.
 +Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.
 +//
 +
 +
 +Роберт Мартин перефразировал это так:
 +
 +//Функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа, не зная об этом.//
 +
 +Иными словами -
 +
 +//Поведение наследуемых классов не должно противоречить поведению, заданному базовым классом, то есть поведение наследуемых классов должно быть ожидаемым для кода который использует базовый класс.//
 +
 +
 +
 +Приведем пример
 +
 +//index.php://
 +
 +
 +<code>
 +$bird    = new Bird();
 +$birdRun = new BirdRun($bird);
 +$birdRun->run();
 +</code>
 +
 +
 +//bird.php://
 +
 +<code>
 +/**
 +* Реально используемый в коде класс
 +*/
 +class Bird {
 +    public function fly() {
 +        $flySpeed = 10;
 +        return $flySpeed;
 +    }
 +}
 + 
 +/**
 +* Дочерний класс от Bird. 
 +* Не изменяет поведение, но дополняет.
 +* Не нарушает принцип LSP
 +*/
 +class Duck extends Bird {
 + 
 +    public function fly() {
 +        $flySpeed = 8;
 +        return $flySpeed;
 +    }
 +     
 +    public function swim() {
 +        $swimSpeed = 2;
 +        return $swimSpeed;
 +    }
 +}
 + 
 +/**
 +* Дочерний класс от Bird. 
 +* Изменяет поведение.
 +* Нарушает принцип LSP
 +*/
 +class Penguin extends Bird {
 + 
 +    public function fly() {
 +          //die('i can`t fly (((');  // не типичное поведение - die или exception
 +          return 'i can`t fly ((('; // не типичное поведение - возвращаем string, а не integer
 +    }
 + 
 +    public function swim() {
 +        $swimSpeed = 4;
 +        return $swimSpeed;
 +    }
 +}
 +</code>
 +
 +
 +//birdRun.php://
 +
 +<code>
 +class BirdRun {
 + 
 +    private $bird; 
 +    public function __construct(Bird $bird) {
 +        $this->bird = $bird;
 +    }
 + 
 +    public function run() {
 +        $flySpeed = $this->bird->fly();
 +    }
 +}
 +</code>
 +
 +//index.php://
 +
 +<code>
 +$bird = new Bird();
 +//$bird = new Duck();
 +//$bird = new Penguin();
 +$birdRun = new BirdRun($bird);
 +$birdRun->run();
 +</code>
 +
 +
 +После замены использования Bird на Duck код будет работать как и прежде - принцип LSP соблюден. 
 +После замены Bird на Penguin код меняет свое поведение, следовательно в данном случае принцип LSP нарушен.
 +
 +Следовать этому типу очень важно при проектировании новых типов с использованием наследования.
 +Этот принцип предупреждает о том, что изменение унаследованного производным типом поведения очень рискованно.
  
  
l.1646832305.txt.gz · Last modified: 2023/09/14 06:06 (external edit)