Про “вынести код в другое место”.
Переложив код с одного места в другое, мы не решим проблему.
Если проблема заключается в излишней сложности кода, то спихнув эту сложность в другое место мы просто её прячем, а не избавляемся от неё.
Сложность остаётся в проекте, только теперь уже скрытая и становится ещё опаснее.
Например, часто видел как в попытке убрать излишнюю сложность часть методов из класса выносят в родительский класс, тем самым освобождая наследник.
Иногда даже больше цепочка, в три и более уровней наследования.
Потом за такие “хитрые” решения огребают все кто работает с этим кодом. Так как скрытая в родительских классах сложность обязательно где-нибудь выстрелит.
Так в молодёжных комедиях показывают как убирается школьник или студент. Заметает мусор под ковёр, под кровать, в чулан. Мусор никуда не делся, но в комнате якобы чисто. До тех пор, пока кто-нибудь не откроет чулан.
Примеры
Распространённые способы “спрятать” сложность, которая позже выстрелит:
- Eloquent: Scopes и Relations, усложняются SQL запросы “под капотом” но мы этого не видим и думаем что всё в порядке.
- Наследование: выносим в родительские классы и делаем связи неочевидными.
- Yii2 Model: Behaviors, Scenarios, события AfterFind, BeforeSave, AfterSave.
- Перемещение бизнес-логики в конфиги. Особенный вид издевательства над кодом!
- Класс формы, который выполняет бизнес-логику, а не только проверку полей в форме, например сохраняет что-то или отправляет события.
- Хранимые процедуры и View Tables: спихиваем сложность на уровень БД.
Что же делать если не переносить в другое место?
Избавляться от сложности совсем. Упрощать сложные места. Перепроектировать, чтобы сложное стало простым.
Для этого читаем книги, статьи, чужой код, проектируем, рефакторим, нарабатываем навык на практике методом проб и ошибок.
Со временем появляется чутьё на сложный код и понимание как его можно упростить.
Базовое правило
Держите сложные места на виду, пусть они будут очевидными и раздражать вас.
Так вы и не пропустите их и будет мотивация от них избавиться.