Eu diria para não começar com TDD. Tome uma decisão informada quando gastar mais tempo aprendendo estratégias de arquitetura em geral. O TDD não permitirá que você pule essa lição de casa, embora possa começar a acreditar que sim.
Aqui está o meu problema com isso. Quando você diz que parece gastar muito tempo com coisas que nunca quebram os TDDs, você vai gostar quando uma coisa que você não previu em uma enorme cadeia de dependências é perdida. Quando você ressalta que é impossível prever essas coisas antes de escrever seu aplicativo, o que é ... por que testamos, eles dizem que é realmente mais sobre design e não sobre testes, mesmo que o teste seja útil.
Mas as cadeias gigantes de dependências vinculadas imprevisíveis não são o produto de um design ruim?
Então qual é?
Aqui está um pensamento. Não vamos ter enormes cadeias complexas de dependências, considerando os dois princípios a seguir do design orientado a objetos do Design Patterns:
"Programa para uma interface, não uma implementação"
Ou seja, seus objetos não devem se importar com quem está chamando ou como foram feitos. Somente que os argumentos adequados foram alimentados e que os métodos que eles chamam de outros objetos são direcionados para o trabalho conforme o esperado. Sua cadeia de dependência na maioria dos casos deve estar em um ponto de ligação, a chamada do método por parte do chamador e o local onde os argumentos são inseridos nos seus métodos. É aí que você registra, valida e envia mensagens úteis para depuração quando as coisas são ruins.
E:
"Favorecer a composição do objeto sobre a herança de classe"
Quem é o boneco? O cara que fez alguma coisa para uma classe em um esquema de herança em cascata complicado envolvendo cerca de 30 aulas, resultando em quebra de casos adicionais ou o desenvolvedor que criou essa arquitetura em primeiro lugar? O TDD pode ajudá-lo a entender os problemas dentro dessa torre inclinada da classe Pisa mais cedo do que você poderia ter sem, mas isso torna menos doloroso tentar modificar um dos pontos de extremidade desse desastre de código na próxima vez?
E é aí que chego à coisa que me incomoda. O TDD realmente ajuda a projetar ou permite uma arquitetura ruim? Parece-me que tem potencial para ser uma estratégia auto-realizável. Quanto mais sua equipe não tiver responsabilidade por arquitetura ruim, mais úteis esses componentes granulares de teste parecem se tornar, mas, em última análise, seu aplicativo se tornará uma PITA cada vez maior para trabalhar (supondo que eles nunca tenham pensado muito em arquitetura no primeiro Lugar, colocar). E deixar de reconhecer as conseqüências disso é sempre o erro mais caro que você pode cometer ao trabalhar em um aplicativo que deve ser atualizado e modificado ao longo do tempo.