l
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| l [2022/03/09 13:26] – chifek | l [2023/09/14 06:06] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 2: | Line 2: | ||
| - | Это третий из пяти принципов SOLID и наиболее сложный для понимания. | + | Это третий из пяти принципов |
| В оригинале данный принцип звучит так: | В оригинале данный принцип звучит так: | ||
| Line 17: | Line 17: | ||
| // | // | ||
| + | |||
| + | |||
| + | |||
| + | Приведем пример | ||
| + | |||
| + | // | ||
| + | |||
| + | |||
| + | < | ||
| + | $bird = new Bird(); | ||
| + | $birdRun = new BirdRun($bird); | ||
| + | $birdRun-> | ||
| + | </ | ||
| + | |||
| + | |||
| + | // | ||
| + | |||
| + | < | ||
| + | /** | ||
| + | * Реально используемый в коде класс | ||
| + | */ | ||
| + | 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() { | ||
| + | // | ||
| + | return 'i can`t fly ((('; // не типичное поведение - возвращаем string, а не integer | ||
| + | } | ||
| + | |||
| + | public function swim() { | ||
| + | $swimSpeed = 4; | ||
| + | return $swimSpeed; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | // | ||
| + | |||
| + | < | ||
| + | class BirdRun { | ||
| + | |||
| + | private $bird; | ||
| + | public function __construct(Bird $bird) { | ||
| + | $this-> | ||
| + | } | ||
| + | |||
| + | public function run() { | ||
| + | $flySpeed = $this-> | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | // | ||
| + | |||
| + | < | ||
| + | $bird = new Bird(); | ||
| + | //$bird = new Duck(); | ||
| + | //$bird = new Penguin(); | ||
| + | $birdRun = new BirdRun($bird); | ||
| + | $birdRun-> | ||
| + | </ | ||
| + | |||
| + | |||
| + | После замены использования Bird на Duck код будет работать как и прежде - принцип LSP соблюден. | ||
| + | После замены Bird на Penguin код меняет свое поведение, | ||
| + | |||
| + | Следовать этому типу очень важно при проектировании новых типов с использованием наследования. | ||
| + | Этот принцип предупреждает о том, что изменение унаследованного производным типом поведения очень рискованно. | ||
l.1646832391.txt.gz · Last modified: 2023/09/14 06:06 (external edit)