Yo diría que no comience con TDD. Tome una decisión informada cuando haya pasado más tiempo aprendiendo estrategias de arquitectura en general. TDD no le permitirá omitir esa tarea, aunque puede comenzar a creer que sí.
Aquí está mi problema con eso. Cuando dices que parece una gran cantidad de tiempo perdido en cosas que nunca romperán, los TDDers dicen que lo apreciarás cuando esa cosa que no anticipaste en una gran cadena de dependencias se rompa. Cuando señala que es imposible predecir tales cosas antes de escribir su aplicación, que es uh ... por qué probamos, le dicen que realmente se trata más del diseño y no de las pruebas, aunque las pruebas son útiles.
¿Pero no son las cadenas gigantes de dependencias vinculadas impredecibles el producto del diseño horrible?
Entonces, ¿cuál es?
Aquí hay un pensamiento. No tengamos enormes cadenas complejas de dependencias en primer lugar al considerar los siguientes dos principios de diseño orientado a objetos de Design Patterns:
"Programa para una interfaz, no una implementación"
Es decir, a tus objetos no debería importarles quién llama o cómo se hicieron. Solo que los argumentos apropiados se introdujeron y que los métodos que llaman desde otros objetos están dirigidos a funcionar como se esperaba. Su cadena de dependencia en la mayoría de los casos debe estar en un punto de enlace, la llamada al método por parte de la persona que llama y el lugar donde los argumentos se dejan caer en sus métodos. Ahí es donde se registra, valida y envía mensajes útiles para la depuración cuando las cosas se resuelven.
Y:
"Favorecer la composición de objetos sobre la herencia de clases"
¿Quién es el muñeco? ¿El tipo que le hizo algo a una clase en un intrincado esquema de herencia en cascada que involucra como 30 clases que resultan en la ruptura del caso marginal, o el desarrollador que ideó esa arquitectura en primer lugar? TDD podría ayudarlo a llegar al fondo de los problemas dentro de esa torre inclinada de clase Pisa antes de lo que podría haberlo hecho, pero ¿eso hace que sea menos doloroso intentar modificar uno de los puntos finales de ese desastre de código la próxima vez?
Y ahí es donde llego a lo que me molesta. ¿TDD realmente ayuda a diseñar o permite una mala arquitectura? Me parece que tiene potencial para ser una estrategia autocumplida. Cuanto más no tenga su propio equipo la responsabilidad de una arquitectura pobre, más útiles serán esos componentes de prueba granulares, pero en última instancia, su aplicación se convertirá en una PITA cada vez más grande para trabajar (suponiendo que nunca pensaron mucho en la arquitectura al principio lugar). Y no reconocer las consecuencias de eso es, sin duda, el error más costoso que puede cometer al trabajar en una aplicación que debe actualizarse y modificarse con el tiempo.