Я бы сказал, чтобы не начинать с TDD. Примите обоснованное решение, когда вы потратите больше времени на изучение стратегий архитектуры в целом. TDD не позволит вам пропустить эту домашнюю работу, хотя вы можете начать верить, что она делает.
Вот моя проблема с этим. Когда вы говорите, что кажется, что потрачено много времени на вещи, которые никогда не сломают TDD, говорят, что вы оцените это, когда одна вещь, которую вы не ожидали в огромной цепочке зависимостей, будет разрушена. Когда вы указываете на то, что невозможно предсказать такие вещи до того, как вы напишите свое приложение, и это ... почему мы тестируем, они говорят вам, что это действительно больше о дизайне, а не тестировании, даже если тестирование пригодится.
Но не являются ли гигантские цепочки непредсказуемых связанных зависимостей продуктом дрянного дизайна?
Так что это?
Вот мысль. Давайте не будем в первую очередь иметь огромные сложные цепочки зависимостей, рассматривая следующие два принципа объектно-ориентированного проектирования из Design Patterns:
«Программа для интерфейса, а не реализация»
То есть ваши объекты не должны заботиться о том, кто выполняет призвание или как они были сделаны. Только то, что были введены правильные аргументы и что методы, которые они вызывают из других объектов, направлены на работу, как и ожидалось. Ваша цепочка зависимостей в большинстве случаев должна находиться в одной точке соединения, вызове метода со стороны вызывающей стороны и месте, где аргументы попадают в ваши методы. Вот где вы регистрируетесь, проверяете и отправляете полезные сообщения для отладки, когда дела идут плохо.
А также:
«Пользуйся композицией объектов по наследованию классов»
Кто дурачок? Парень, который сделал что-то с классом в запутанной каскадной схеме наследования, включающей около 30 классов, что привело к поломке кейса, или разработчик, который первым придумал эту архитектуру? TDD может помочь вам быстрее разобраться в проблемах в этой падающей башне класса Пизы, чем без вас, но делает ли это менее болезненной попытку изменить одну из конечных точек этого кода в следующий раз?
И вот тут я дохожу до того, что меня беспокоит. TDD действительно помогает проектировать или это допускает плохую архитектуру? Мне кажется, что у него есть потенциал для самореализующейся стратегии. Чем больше ваша команда не должна нести ответственность за плохую архитектуру, тем более полезными становятся эти компоненты детального тестирования, но в конечном итоге ваше приложение становится все более и более мощным PITA для работы (при условии, что они никогда не задумывались об архитектуре в первые место). А неспособность признать последствия этого - дело рук, всегда самая дорогая ошибка, которую вы можете совершить, работая над приложением, которое должно быть обновлено и модифицировано с течением времени.