Допустим, у нас есть сайт с товарами. У нас есть метод
Product::getProducts
возвращает массив товаров.
Затем к нам пришел менеджер и сказал: хотим сделать акции на
сайте (скидки, распродажи). В каждой акции будут прикреплены
товары. Мы написали метод
Action::getProductsByActionId(actionId)
Затем к нам снова пришел менеджер и сказал что нужны еще статьи,
к которым прикреплены товары. Добавим метод
Article::getProductsByArticleId(arcticleId)
.
Вы скажите давайте сделаем 1 метод с параметрами. Ок, мы до этого дойдем.
И тут внимание: к нам пришел менеджер и говорит мы хотим иметь возможность отключать товары на сайте. Т.е. необходимо добавить флаг active для товаров, имеющий значение true/false. Товары с флагом false не должны отображаться на сайте.
Итог: нам надо найти в коде все места, которые достают товары и
везде добавить логику, чтобы возвращались только товары с флагом
active=true. Т.е. надо поправить 3 метода:
Product::getProducts,
Action::getProductsByActionId(actionId),
Article::getProductsByArticleId(arcticleId)
То, что нам надо поправить код не в 1 месте, пораждает ошибки в каком-то месте забыли поправить.
Что же, давайте сделаем так, чтобы у нас было только 1 место, откуда доставать товары. Тогда такой ошибки не будет.
Опять та же ситуация: достаем товары для основного каталога
сайта, акций и статей: пишем метод
Product::getProducts(actionId = null, articleId =
null)
. Если не задан ни один параметр, то достаются товары
как в Product::getProducts
раньше, если задан
articleId, то достаются товары
Action::getProductsByActionId(actionId)
, и т.д.
Пока остановимся на том моменте, что мы не включали флаг активации товаров, т.е. менеджер с таким требованием не приходил.
Приходит менеджер и говорит: хотим показывать товары в складской
программе. Ок. Мы уже поняли, что будет, если мы добавим метод
Store::getProducts
в какой-то момент доработки
программы мы можем просто про него забыть, и не внести в него
необходиму логику. По-этому переиспользуем метод
Product::getProducts
. На складе должны показываться
абсолютно все товары (вообще всегда все, это может быть не
складская программа, а какая-нибудь админка или другая бек-система
для персонала), по-этому мы вызываем этот метод без параметров.
И тут внимание: приходит менеджер и говорит:
хотим сделать активные и неактивные товары, флаг active. Чтобы на
сайте показывались только активные товары. Ок. У нас есть 1 метод
Product::getProducts
и мы правим его и добавляем чтобы
из него возвращались только товары с флагом active=true.
Мы вносим изменения в единственный метод. И опять нам надо
посмотреть везде где этот метод используется. И если в 1 месте мы
забыли посмотреть, то это приведет к ошибке на складе пропадает
часть товаров. Хотя там по ТЗ должны отображаться вообще все
товары. Мы просто забыли, что наш универсальный метод
Product::getProducts
используется еще и в
бек-системах, где флаг active не должен применяться к товарам.
Получается при написании 1 метода тоже возникает ошибка.
Вывод
Получается что написать 1 метод это приведет в определенной ситуации к ошибке, и написать несколько методов это приведет в другой ситуации к ошибке. Получается сколько методов не напиши всегда когда-нибудь, при изменении бизнес-требований будет ошибка. Получается программист решает нерешаемую без ошибок задачу. Тогда становится понятно, почему идеального кода не бывает.