31 lines
2.6 KiB
Markdown
31 lines
2.6 KiB
Markdown
#рефакторинг #запахи_кода
|
||
|
||
![[Pasted image 20241114071602.png]]
|
||
|
||
> Подклассам полагается наследовать методы и данные своих родителей. Но что делать, если это наследство им не нравится или не требуется? И получив все эти дары, они пользуются только малой их частью.
|
||
> Обычно это означает неправильно продуманную иерархию.
|
||
> В родительском классе должна содержаться только та функциональность, которая используется. Часто вы можете встретить совет делать все суперклассы абстрактными.
|
||
|
||
### **Признаки**
|
||
- Если подкласс использует лишь малую часть унаследованных методов и свойств суперкласса, это является признаком неправильной иерархии. При этом ненужные методы могут просто не использоваться либо быть переопределёнными и выбрасывать исключения
|
||
|
||
### **Причины появления**
|
||
- Кто-то создал наследование между классами только из побуждений повторного использования кода, находящегося в суперклассе. При этом суперкласс и подкласс могут являться совершенно различными сущностями.
|
||
|
||
![[Pasted image 20241114071816.png]]
|
||
|
||
### **Рефакторинги**
|
||
- [[Опускание метода (Push Down Method)]]
|
||
- [[Опускание поля (Push Down Field)]]
|
||
- [[Замена подкласса делегатом (Replace Subclass with Delegate)]]
|
||
- [[Замена суперкласса делегатом (Replace Superclass with Delegate)]]
|
||
|
||
![[Pasted image 20241114071837.png]]
|
||
|
||
|
||
### **Результат**
|
||
- Улучшает понимание и организацию кода. Теперь вы не будете тратить время на догадки о том, почему класс `Стул` унаследован от класса `Животное` (несмотря на то, что оба имеют четыре ноги).
|
||
|
||
### **Ссылки**
|
||
- https://refactoring.guru/ru/smells/refused-bequest
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |