"De arriba hacia abajo" es already used in computing to describe an analysis technique. Sugiero usar el término "fuera de adentro" en su lugar.
Outside-in es un término de BDD, en el cual reconocemos que a menudo hay múltiples interfaces de usuario para un sistema. Los usuarios pueden ser otros sistemas además de personas. Un enfoque BDD es similar a un enfoque TDD; podría ayudarte, así que lo describiré brevemente.
En BDD comenzamos con un escenario, generalmente un ejemplo simple de un usuario que usa el sistema. Las conversaciones sobre los escenarios nos ayudan a determinar qué debería hacer el sistema realmente do. Escribimos una interfaz de usuario, y podemos automatizar los escenarios contra esa interfaz de usuario si queremos.
Cuando escribimos la interfaz de usuario, la mantenemos lo más delgada posible. La interfaz de usuario usará otra clase, un controlador, un modelo de vista, etc., para lo cual podemos definir una API.
En esta etapa, la API será una clase vacía o una interfaz (de programa). Ahora podemos escribir ejemplos de cómo la interfaz de usuario podría usar este controlador y mostrar cómo el controlador entrega valor.
Los ejemplos también muestran el alcance de la responsabilidad del controlador y cómo delega sus responsabilidades a otras clases como repositorios, servicios, etc. Podemos expresar esa delegación usando simulaciones. Luego escribimos esa clase para hacer que los ejemplos (pruebas unitarias) funcionen. Escribimos solo ejemplos suficientes para hacer que nuestros escenarios de nivel de sistema pasen.
Encuentro que es común volver a trabajar en ejemplos falsos ya que las interfaces de los simulacros solo se adivinan al principio, y luego surgen más completamente a medida que se escribe la clase. Eso nos ayudará a definir la siguiente capa de interfaces o API, para lo cual describiremos más ejemplos, y así sucesivamente hasta que no se necesiten más simulacros y pase el primer escenario.
Como describimos más escenarios, creamos un comportamiento diferente en las clases y podemos refactorizar para eliminar la duplicación donde los diferentes escenarios y las interfaces de usuario requieren un comportamiento similar.
Al hacer esto de forma externa, obtenemos la mayor información posible sobre cuáles deben ser las API, y reelaboramos esas API lo más rápido que podemos. Esto se ajusta a los principios de Real Options (never commit early unless you know why). No creamos nada que no usemos, y las API en sí mismas están diseñadas para la facilidad de uso, más que para facilitar la escritura. El código tiende a escribirse en un estilo más natural utilizando el lenguaje de dominio más que el lenguaje de programación, lo que lo hace más legible. Como el código se lee aproximadamente 10 veces más de lo que está escrito, esto también ayuda a mantenerlo.
Por esa razón, usaría un enfoque de afuera adentro, en lugar de las conjeturas inteligentes de abajo hacia arriba. Mi experiencia es que resulta en un código más simple, más desacoplado, más legible y más fácil de mantener.
¿Tiene algún caso de prueba de alto nivel, que si se aprueba confirmará que la aplicación está funcionando y que el problema se ha resuelto? Algo para demostrar que todo funciona (manteniendo la interfaz de usuario, por supuesto). (También soy un novato de TDD.) –
No tengo ningún caso de prueba de alto nivel, y tal vez eso es lo que falta. La única pregunta es: ¿cómo sería una prueba de alto nivel? La aplicación solo produce texto en la consola. ¿Debo afirmar lo que se escribe allí? – Chris
Cuando dices "integración", esto no significa que quieras probar que el cableado de los objetos sea correcto, pero que todas las clases juntas funcionen como se esperaba. Ahora, la mayoría de las personas recomiendan que debe tener algunos casos de prueba que le digan si ya terminó el trabajo. Lo que tienes en la función principal es probablemente una prueba, como señaló Marcus, una prueba positiva. Los métodos principales, como ve, son los últimos métodos que se escriben en una aplicación impulsada por prueba. Te sugiero que mires las pruebas de aceptación. Este libro podría serle interesante: http://www.growing-object-oriented-software.com/ –