Собственно вопрос может породить холивары, но я в данном случае не стремлюсь докопаться до истины. Допустим есть класс работающий с БД, ему нужно получить настройки, можно передать двумя способами
Первый вариант
DbConnector(ip, host, port);
В данном случае имеем преимущества
1. Видим какие параметры использует класс и что ему нужно. Класс обладает относительной «независимостью» от других классов
2. Проще тестировать, т.к. ip, host, port - простые типы и можно проверить его работу без всяких заглушек.
Недостатки
1. Если вдруг появится потребность в новом параметре, например имя БД, нужно переписывать интерфейсы.
2. Опять же, необходимо помнить последовательность передачи параметров.
4. Увеличение кол-ва передаваемых параметров, что усложняет восприятие класса.
Второй вариант
Создаем класс DbSettings и передаем экземляр классу, DbConnector
DbConnector(DbSettings settings_);
Преимущества
1. Код получается более лаконичным
2. Опять же, проще модифицировать
Недостатки
1. Сложней тестировать, т.к. надо для тестирования создавать объект DbSettings;
2. Сложней для анализа, т.к. для того что бы понять откуда берутся настройки, придется вообще пробираться в класс DbSettings.
Недавно читал книгу по проектированию на Java так там первый вариант описывался как более предпочтительный, сегодня уточню авторство