l
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| l [2022/03/09 13:25] – создано chifek | l [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(y) также должно быть верным для объектов y типа S, где S является подтипом типа T. | ||
| + | // | ||
| + | |||
| + | |||
| + | Роберт Мартин перефразировал это так: | ||
| + | |||
| + | // | ||
| + | |||
| + | Иными словами - | ||
| + | |||
| + | // | ||
| + | |||
| + | |||
| + | |||
| + | Приведем пример | ||
| + | |||
| + | // | ||
| + | |||
| + | |||
| + | < | ||
| + | $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.1646832305.txt.gz · Last modified: 2023/09/14 06:06 (external edit)