Внедрение зависимостей ИЛИ объект конфигурации? - PullRequest
1 голос
/ 08 октября 2010

У меня есть следующий конструктор для моего класса

 public MyClass(File f1, File f2, File f3, Class1 c1, Class2 c2, Class3 c3)
{
..........
}

Как видно, у него 6 параметров. Увидев этот код, один из моих старших сказал, что вместо передачи 6 параметров мне лучше передать объект конфигурации.

Я написал код таким образом, потому что недавно я прочитал о «Внедрении зависимости», в котором говорится, что «классы должны спрашивать, чего они хотят». Поэтому я думаю, что передача объекта конфигурации будет против принципа.

Правильна ли моя интерпретация «инъекций зависимости»? ИЛИ Должен ли я принять совет моего старшего?

Ответы [ 2 ]

9 голосов
/ 08 октября 2010

«Объект конфигурации» - это тупой термин, применяемый в этой ситуации; это создает ваши усилия в чисто механическом смысле. Цель состоит в том, чтобы сообщить о своем намерении потребителю класса; давайте рефакторинг к этому.

Методы или конструкторы с многочисленными параметрами указывают на слабую связь между ними. Потребитель, как правило, должен сделать больше выводов, чтобы понять API. Что особенного в этих 3 файлах вместе с в этих 3 классах ? Это информация, которая не передается.

Это возможность создать более содержательный и интуитивно понятный интерфейс, извлекая явное понятие из неявного. Например, если 3 файла связаны из-за пользователя, параметр UserFileSet будет ясно выражать это. Возможно, f1 относится к c1, f2 к c2 и f3 к c3. Объявление этих ассоциаций как независимых классов уменьшит вдвое количество параметров и увеличит объем информации, которую можно получить из вашего API.

В конечном счете, рефакторинг будет сильно зависеть от вашей проблемной области. Не думайте, что вы должны создать один объект для выполнения списка параметров; попытаться провести рефакторинг по контурам отношений между параметрами. Это всегда приводит к коду, который отражает решаемую проблему больше, чем язык, используемый для ее решения.

2 голосов
/ 08 октября 2010

Я не думаю, что использование объекта конфигурации противоречит использованию шаблона внедрения зависимостей. Это больше касается формы, в которой вы вводите свои зависимости, и общего вопроса о том, лучше ли иметь функцию (в данном случае конструктор), которая принимает 20 параметров или объединяет эти параметры в класс, чтобы они были связаны вместе.

Вы по-прежнему можете использовать внедрение зависимостей, то есть создать объект конфигурации с помощью некоторой фабрики или контейнера и вставить его в конструктор при создании экземпляра вашего класса. Является ли это хорошей идеей, зависит также от конкретного случая, серебряных пуль нет;)

...