LINUX.ORG.RU

История изменений

Исправление Legioner, (текущая версия) :

Получается если это main, то main должен знать про Engine?

Да, тот, кто конструирует граф объектов, должен знать про все их реализации.

В первом же случае, что я написал про Engine знает только Car.

И в этом нет ничего хорошего. Между классами Engine и Car получается тесная связь. Мало того, что Car зависит от публичного интерфейса Engine, так он ещё и привязан к конкретной реализации этого класса. Например ты не сможешь заменить бензиновый двигатель электродвигателем, просто подсунув его в конструкторе. Т.е. такой дизайн ограничивает гибкость твоего приложения. Или, например, подсунуть Car-у какой-то тестовый Engine, чтобы протестировать Car не тратя бензин (конечно аналогии так себе, но, думаю, уловить можно).

Или речь идет про то что там фреймворки вроде Spring или Dagger все это разруливают?

Ну на практике DI обычно используют со фреймворками, которые всё это разруливают. Но ничего не мешает делать это руками, особенно если проект небольшой.

Исходная версия Legioner, :

Получается если это main, то main должен знать про Engine?

Да, тот, кто конструирует граф объектов, должен знать про все их реализации.

В первом же случае, что я написал про Engine знает только Car.

И в этом нет ничего хорошего. Между классами Engine и Car получается тесная связь. Мало того, что Car зависит от публичного интерфейса Engine, так он ещё и привязан к конкретной реализации этого класса. Например ты не сможешь заменить бензиновый двигатель электродвигателем, просто подсунув его в конструкторе. Т.е. такой дизайн ограничивает гибкость твоего приложения.

Или речь идет про то что там фреймворки вроде Spring или Dagger все это разруливают?

Ну на практике DI обычно используют со фреймворками, которые всё это разруливают. Но ничего не мешает делать это руками, особенно если проект небольшой.