Я пытаюсь обернуть голову вокруг TDD, особенно в части разработки. Я посмотрел некоторые книги, но те, которые я нашел, в основном касаются части тестирования - История NUnit, почему тестирование хорошо, Red / Green / Refactor и как создать String Calculator.
Хорошие вещи, но это "просто" модульное тестирование, а не TDD. В частности, я не понимаю, как TDD помогает мне получить хороший дизайн, если мне нужен дизайн, чтобы начать его тестирование.
Для иллюстрации представьте эти 3 требования:
- Каталог должен иметь список продуктов
- Каталог должен помнить, какие продукты просматривал пользователь
- Пользователи должны иметь возможность искать продукт
На этом этапе многие книги вытаскивают волшебного кролика из шляпы и просто погружаются в «Тестирование ProductService», но они не объясняют, как они пришли к выводу, что это ProductService. Это та часть «развития» в TDD, которую я пытаюсь понять.
Должен быть существующий дизайн, но ничего за пределами сущностных сервисов (то есть: существует Продукт, поэтому должен быть ProductService) нигде не найти (например, второе требование требует от меня иметь некоторую концепцию Пользователь, но куда мне поместить функцию напоминания? И является ли функция поиска компонентом ProductService или отдельным SearchService? Как узнать, какой вариант выбрать?)
Согласно SOLID , мне потребуется UserService, но если я спроектирую систему без TDD, у меня может получиться целый набор Single-Method Services. Разве TDD не предназначен, чтобы заставить меня открыть мой дизайн в первую очередь?
Я разработчик .net, но ресурсы Java тоже подойдут. Я чувствую, что, похоже, нет реального примера приложения или книги, которые бы касались реального направления бизнес-приложений. Может ли кто-нибудь привести наглядный пример, иллюстрирующий процесс создания дизайна с использованием TDD?