Я согласен с ответами, приведенными выше, но я подумал, что здесь тоже можно немного рассказать о тестировании:
В сложных системах, где существуют взаимодействия между подсистемами, внедрение зависимостей - лучший из известных мне способов проведения модульного тестирования.
Если у вас есть логический блок X, который имеет известные взаимодействия с логическим блоком Y, вы можете создать MockY с предопределенным поведением и явно проверить логику X.
Без внедрения зависимостей написание тестов - это кошмар. Вы не можете получить хорошее покрытие кода. Некоторые фреймворки (например, django) решают эту проблему, раскручивая фиктивные экземпляры базы данных, чтобы поговорить о тестах и т. Д., Но это в основном плохое решение проблемы.
Должно быть два вида тестов:
- Модульные тесты, которые выполняются в ЛЮБОЙ среде и проверяют логику отдельных единиц кода.
- Интеграционные / функциональные тесты, которые проверяют объединенную логику приложения.
Теперь к вопросу: IoC. Для чего нужен IoC? Это удобно для нескольких вещей, но действительно очень хорошо для , облегчая использование внедрения зависимостей :
// Do this every time you want an instance of myServiceType
var SystemA = new SystemA()
var SystemB = new SystemB()
var SystemC = new SystemC(SystemA, "OtherThing")
var SystemD = new SystemD(SystemB, SystemC)
var IRepo = new MySqlRepo()
var myService = new myServiceType(SystemD, IRepo)
В эту логику:
// Do this at application start
Container.Register(ISystemA, SystemA)
Container.Register(ISystemB, SystemB)
Container.Register(ISystemC, SystemC)
Container.Register(ISystemD, SystemD)
Container.Register(IRepo, MySqlRepo)
Container.Register(myServiceType)
// Do this any time you like
var myService = Container.resolve(myServiceType)
Теперь, почему мы не видим МОК во многих динамических языках?
Я бы сказал, что причина в том, что мы не видим большого внедрения зависимостей в этих языках.
... и это было бы потому, что обычно выполняемое в них тестирование не существует.
Я слышал всевозможные оправдания этому; взаимодействие с DOM усложняет тестирование, мой код достаточно прост, не требует тестов, динамические языки не нуждаются в модульных тестах, потому что они потрясающие и выразительные.
Это все чепуха.
Для проекта без юнит-тестов или юнит-тестов с плохим охватом кода нет оправдания .
... но поразительно количество javascript и python проектов, которые я видел (выбирая эти два именно потому, что они представляют интерес, и я видел больше проектов такого типа, чем другие) без IoC, без DI и, что неудивительно, без тестов.
Здесь есть отличная статья о DI на сайте:
http://code.google.com/p/google-guice/wiki/Motivation
В динамических языках нет ничего, что решало бы любую из этих проблем.
Резюме:
- IoC полезен для вещей, но в первую очередь для реализации DI
- IoC - это НЕ XML-файлы конфигурации. > _ <</li>
- DI полезен для тестов
- Отсутствие МОК свидетельствует об отсутствии DI, что свидетельствует об отсутствии хорошего тестирования.
- Использовать IoC.