Есть что-то, что можно сказать о «Проектировании больших сложных систем», которое не следует связывать с TDD - , особенно , когда TDD интерпретируется как «Test Driven Design», а не «Test Driven Development».
В контексте «Разработка» использование TDD гарантирует, что вы пишете тестируемый код, который дает все преимущества, упомянутые в TDD (обнаружение ошибок на ранних этапах, высокий уровень кода: коэффициент покрытия тестов, более простой рефакторинг в будущем и т. Д. и др.)
Но в «Проектировании» больших сложных систем TDD особо не учитывает следующие проблемы, присущие архитектуре системы
- (Техника для) Производительность
- Безопасность
- Масштабируемость
- Наличие
- (и все другие «способности»)
(т. Е. Все вышеперечисленные проблемы волшебным образом не проявляются через «сначала написать неудачный тестовый пример, а затем рабочую реализацию, Refactor - lather, rinse, repeat ...»).
Для этого вам нужно будет подойти к проблеме с помощью интерактивной доски сведений о высоком, а затем низкоуровневом уровне системы с учетом ограничений, налагаемых требованиями и проблемным пространством.
Некоторые из вышеперечисленных соображений конкурируют друг с другом и требуют осторожных компромиссов, которые просто не «возникают» при написании множества юнит-тестов.
Как только ключевые компоненты и их обязанности определены и
Понятно, что TDD может использоваться в реализации этих
компоненты . Процесс рефакторинга и постоянно
проверка / улучшение вашего кода обеспечит низкоуровневый дизайн
детали этих компонентов хорошо продуманы.
Мне еще предстоит встретить довольно сложную часть программного обеспечения (например, компилятор, базу данных, операционную систему), которая была выполнена в стиле Test Driven Design . В следующей статье блога об этом очень хорошо говорится ( Компиляторы, TDD, Mastery )
Кроме того, посмотрите следующие видеоролики по архитектуре , которые добавляют здравого смысла к мыслительному процессу.