Я вижу, что некоторые люди рекомендуют семь как верхний предел. Очевидно, это не правда, что люди могут держать в голове семь вещей одновременно; они могут вспомнить только четыре (Сьюзен Вайншенк, 100 вещей, которые каждый дизайнер должен знать о людях , 48). Несмотря на это, я считаю, что четыре - что-то вроде высокой околоземной орбиты. Но это потому, что Боб Мартин изменил мое мышление.
В Чистый код , дядя Боб в качестве общего верхнего предела для числа параметров выступает за три. Он делает радикальное утверждение (40):
Идеальное число аргументов для функции - ноль (нильадик). Далее следует одно (монадическое), за которым следует два (диадическое). По возможности следует избегать трех аргументов (триадных). Более трех (многоадресный) требует особого обоснования - и в любом случае его не следует использовать.
Он говорит это из-за читабельности; но также из-за тестируемости:
Представьте себе трудность написания всех тестовых случаев, чтобы гарантировать, что все различные комбинации аргументов работают правильно.
Я призываю вас найти копию его книги и прочитать его полное обсуждение аргументов функций (40-43).
Я согласен с теми, кто упомянул принцип единой ответственности. Мне трудно поверить, что класс, которому нужно более двух или трех значений / объектов без разумных значений по умолчанию, действительно несет только одну ответственность и не будет лучше, если извлечен другой класс.
Теперь, если вы вводите свои зависимости через конструктор, аргументы Боба Мартина о том, как легко вызвать конструктор, не так уж применимы (потому что обычно в вашем приложении есть только одна точка, где вы подключаете это, или у вас даже есть структура, которая делает это за вас). Тем не менее, принцип единственной ответственности по-прежнему актуален: если у класса четыре зависимости, я считаю, что он пахнет большой работой.
Однако, как и во всех вещах в области компьютерных наук, существуют бесспорные обоснованные случаи наличия большого количества параметров конструктора. Не искажайте ваш код, чтобы избежать использования большого количества параметров; но если вы используете большое количество параметров, остановитесь и подумайте, потому что это может означать, что ваш код уже искажен.