#рефакторинг #запахи_кода ![[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]]