Я полагаю, что ваш вопрос раскрывает что-то в ваших классах Может быть, обязанности можно улучшить? Может быть, перемещение какого-либо кода решит проблемы?
Скажи, не спрашивай.
Вот как мне это объяснили. Существует естественная тенденция вызывать классы для получения некоторых данных. Слишком большой, слишком большой запрос обычно приводит к тяжелым «последовательностям получения». Но есть и другой способ. Я должен признать, что это не легко найти, но постепенно улучшается в конкретном коде и в привычках кодера.
Класс A хочет выполнить расчет и запрашивает данные B. Иногда целесообразно, чтобы A велел B выполнить работу, возможно, передавая некоторые параметры. Это могло бы заменить «getName ()» B, используемое A для проверки правильности имени, методом «isValid ()» на B.
«Запрашивающий» был заменен «говорящим» (вызывая метод, который выполняет вычисления).
Для меня это вопрос, который я задаю себе, когда нахожу слишком много вызовов геттеров . Постепенно методы находят свое место в правильном объекте, и все становится немного проще, у меня меньше получателей и меньше обращений к ним. У меня меньше кода, и он обеспечивает больше семантики, лучшее согласование с функциональными требованиями.
Переместить данные вокруг
В других случаях я перемещаю некоторые данные. Например, если поле перемещает два объекта вверх, длина «цепочки получателей» уменьшается на два.
Я полагаю, что сначала никто не может найти правильную модель.
Сначала я думаю об этом (использование рукописных диаграмм быстро и очень помогает), затем кодирую его, затем снова думаю о реальной вещи ... Затем я кодирую остальное, и любые запахи, которые я чувствую в коде, я думаю снова ...
Разделение и объединение объектов
Если для метода A нужны данные из C, а B - посредник, я могу попробовать, если A и C будут иметь что-то общее. Возможно, A или часть A могут стать C (возможное расщепление A, слияние A и C) ...
Однако есть случаи, когда я, конечно, держу получателей.
Но менее вероятно, что будет создана длинная цепочка.
Длинная цепь, вероятно, будет разорвана одним из методов, описанных выше .