User Tools

Site Tools


l

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
l [2022/03/09 13:26] chifekl [2023/09/14 06:06] (current) – external edit 127.0.0.1
Line 2: Line 2:
  
  
-Это третий из пяти принципов SOLID и наиболее сложный для понимания.+Это третий из пяти принципов **SOLID** и наиболее сложный для понимания.
 В оригинале данный принцип звучит так: В оригинале данный принцип звучит так:
  
Line 17: Line 17:
  
 //Поведение наследуемых классов не должно противоречить поведению, заданному базовым классом, то есть поведение наследуемых классов должно быть ожидаемым для кода который использует базовый класс.// //Поведение наследуемых классов не должно противоречить поведению, заданному базовым классом, то есть поведение наследуемых классов должно быть ожидаемым для кода который использует базовый класс.//
 +
 +
 +
 +Приведем пример
 +
 +//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.1646832391.txt.gz · Last modified: 2023/09/14 06:06 (external edit)