Мне нравится думать об этом так:
- Аргументы конструктора являются деталями реализации
- Они относятся ко всем операциям
- Они не изменяются в ответ на какую-либо операцию (инвариант)
- Интерфейс можно понять без них
- Это значения конфигурации, которые отражают швы приложения
- Аргументы метода являются контекстными
- Они относятся к отдельной операции
- Это значения времени выполнения, которые отражают поток данных приложения
Большая часть искусства заключается в правильном определении проблемы. Например, мы можем сказать себе: «Мне нужно создать новую строку в пользовательской таблице». С этой точки зрения любая из этих подписей выглядит нормально:
void Insert(User user);
void Insert(User user, IDbConnection dbConnection);
Однако мы можем разбить наше определение задачи:
Намерение: Создать нового пользователя
Подробности реализации: Пользователь - это строка в таблице
Давайте вместо этого сформулируем задачу как «Мне нужно создать пользователя». Это дает нам возможность оценить две подписи выше, отдавая предпочтение той, которая соответствует нашему намерению:
void Insert(User user);
Анализ цели операции и применимого объема ее данных обычно дает надежные результаты.