Имеет ли значение размер конструктора, если вы используете инверсию управления?

StackOverflow https://stackoverflow.com/questions/123002

  •  02-07-2019
  •  | 
  •  

Вопрос

Итак, у меня есть около 10 объектов, каждый из которых имеет 1-3 зависимости (что, я думаю, нормально с точки зрения слабой связи), а также некоторые настройки, которые можно использовать для определения поведения (тайм-аут, размер окна и т. д.).

Теперь, прежде чем я начал использовать контейнер Inversion of Control, я бы создал фабрику и, возможно, даже простой объект ObjectSettings для каждого из объектов, который требует более 1 настройки, чтобы сохранить размер конструктора на рекомендуемом параметре «менее 4». размер.Сейчас я использую инверсию контейнера управления и просто не вижу в этом особого смысла.Конечно, я мог бы получить конструктор с семью параметрами, но кого это волнует?В любом случае все это заполняет IoC.

Я что-то упускаю или это в принципе правильно?

Это было полезно?

Решение

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

Я работаю над системой, которая в настоящее время имеет 122 класса, экземпляры которых создаются с использованием платформы Spring.NET.Все отношения между этими классами устанавливаются в их конструкторах.Следует признать, что в системе есть немало несовершенного кода, в котором я нарушил несколько правил.(Но, эй, наши неудачи — это возможность учиться!)

Конструкторы этих классов имеют разное количество аргументов, что показано в таблице ниже.

Number of constructor arguments    Number of classes
           0                             57
           1                             19
           2                             25
           3                              9
           4                              3
           5                              1
           6                              3
           7                              2
           8                              2

Классы с нулевыми аргументами представляют собой либо классы конкретных стратегий, либо классы, которые реагируют на события, отправляя данные во внешние системы.

Те, у кого 5 или 6 аргументов, все несколько неэлегантны, и для их упрощения может потребоваться некоторый рефакторинг.

Четыре класса с 7 или 8 аргументами являются отличным примером Бог возражает.Их следует разбить, и каждый из них уже есть в моем списке проблемных мест в системе.

Остальные классы (от 1 до 4 аргументов) (в основном) спроектированы просто, их легко понять и соответствуют стандарту. принцип единой ответственности.

Другие советы

Потребность во многих зависимостях (возможно, более 8) может указывать на недостаток дизайна, но в целом я думаю, что проблем нет, пока дизайн целостный.

Кроме того, рассмотрите возможность использования локатора служб или статического шлюза для решения проблем инфраструктуры, таких как ведение журнала и авторизация, вместо того, чтобы загромождать аргументы конструктора.

РЕДАКТИРОВАТЬ:8, вероятно, слишком много, но я подумал, что это будет странный случай.Посмотрев пост Ли, я согласен, что 1-4 обычно хорошо.

Добрый день, Джордж!

Прежде всего, каковы зависимости между объектами?

Много отношений типа "ISA"?Много отношений «хаса»?

Много фанатов?Или разветвление?

Ответ Джорджа:"в основном старался следовать составу, а не советам по наследству... хотя какое это имеет значение?"

Поскольку это в основном «хаса», с вами все будет в порядке.

Лучше убедиться, что построение (и разрушение) компонентов выполнено правильно, чтобы предотвратить утечки памяти.

И если это на C++, убедитесь, что вы используете виртуальные деструкторы?

Это сложный вопрос, и поэтому я предпочитаю гибридный подход, в котором соответствующие свойства являются изменяемыми, а частью конструктора являются только неизменяемые свойства и необходимые зависимости без полезного значения по умолчанию.Некоторые классы создаются с использованием самого необходимого, а затем при необходимости настраиваются с помощью сеттеров.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top