Вопрос о новичке о Внедрении зависимости, когда метод должен создать новые объекты

Ответ Чилла совершенно правильный; Я хотел просто добавить немного цвета из недавнего чтения источника glibc ([master 8b0ccb2], в 2.17). Для ясности, если библиотека не найдена в месте, указанном данным уровнем, пробуется следующий уровень. Если библиотека найдена на заданном уровне, поиск прекращается.

Порядок поиска в динамической библиотеке:

  1. DT_RPATH в двоичном файле ELF, если не установлен DT_RUNPATH.
  2. LD_LIBRARY_PATH записей, если только setuid / setgid
  3. DT_RUNPATH в двоичном ELF
  4. /etc/ld.so.cache, если только -z nodeflib не задан во время соединения
  5. / lib, / usr / lib, если -z nodeflib
  6. Выполнено, "не найдено".
7
задан WW. 11 June 2009 в 04:25
поделиться

4 ответа

Зависит от того, если у вас будет только один тип пуль ...

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

Но если у вас есть ] Bullet, DoubleBullet, PowerBullet, NukeBullet и т. Д.

Затем я бы создал базовый класс Bullet и все остальные производные от него

Затем я бы создал фабрику Bullet, и в ней были бы CreateBullet, CreatePowerBullet и т. Д.

Другой вопрос: будет ли что-нибудь еще делать пулю? Если так, то я бы создал фабрику, чтобы объединить логику создания в одном месте ...

В противном случае это пахнет, как будто вы используете DI просто для использования DI ...

3
ответ дан 7 December 2019 в 07:50
поделиться

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

Обратите внимание, что у вас есть несколько уровней косвенного обращения, каждое из которых дает вам большую гибкость, но требует больше кода и, возможно, труднее для понимания. Самый простой - иметь конкретные типы BulletFactory и Bullet . Это означает, что вы не можете легко иметь разные их реализации, но вы все равно можете расширить их и передать в подкласс BulletFactory , который возвращает подклассы Bullet . Если ваша единственная цель инъекции - упростить модульные тесты, я бы пошел по этому пути. Конечно, вы также можете сделать BulletFactory интерфейсом или Bullet интерфейсом, либо и то, и другое. Если вы собираетесь использовать разные устройства для целей, не связанных с тестированием, я бы выбрал именно этот путь.

Наконец, вы должны решить, будут ли преимущества отделения класса Bullet от вашего PlayerShip класса того стоит. Тесная связь - не зло, и ее не следует избегать любой ценой - в одних контекстах это имеет смысл, а в других нет. Только опыт поможет понять, когда объединять классы, а когда разделять.

вы должны решить, оправданы ли преимущества отделения класса Bullet от вашего класса PlayerShip . Тесная связь - не зло, и ее не следует избегать любой ценой - в одних контекстах это имеет смысл, а в других нет. Только опыт поможет понять, когда объединять классы, а когда разделять.

вы должны решить, оправданы ли преимущества отделения класса Bullet от вашего класса PlayerShip . Тесная связь - не зло, и ее не следует избегать любой ценой - в одних контекстах это имеет смысл, а в других нет. Только опыт поможет понять, когда объединять классы, а когда разделять.

2
ответ дан 7 December 2019 в 07:50
поделиться

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

1
ответ дан 7 December 2019 в 07:50
поделиться

Да, это пахнет чрезмерной архитектурой. Тем не менее, из моей головы, у вас может быть свойство, которое хранит тип маркера, а затем ваша структура DI (здесь ninject) создаст пулю.

public Type BulletType {get; set;}

public void fire()
{
    var b = (BulletType) kernel.get(BulletType);
    b.fire(point, direction);
}
1
ответ дан 7 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: