¿El desarrollo guiado por pruebas me obliga a seguir SOLID?

14

Escuché mucho de los practicantes de TDD que una de las ventajas de TDD es que obliga a los desarrolladores a seguir SOLID (Responsabilidad única, Abierto-cerrado, Sustitución de Liskov, Segregación de interfaz e Inversión de dependencia). Pero en lo que a mí respecta, basta con escribir algunas pruebas (prueba de unidad principalmente) para comprender que es importante seguir SOLID (y, por lo tanto, crear una arquitectura comprobable).

¿TDD obliga a los desarrolladores a seguir SOLID más activamente que simplemente escribiendo pruebas unitarias?

    
pregunta SiberianGuy 01.10.2011 - 19:30

4 respuestas

23

En primer lugar, TDD no le obliga estrictamente a escribir el código SOLID. Podrías hacer TDD y crear un gran lío si quisieras.

Por supuesto, conocer los principios SÓLIDOS es útil, porque de lo contrario, es posible que simplemente no tenga una buena respuesta a muchos de sus problemas y, por lo tanto, escriba un código incorrecto acompañado de pruebas incorrectas.

Si ya conoce los principios de SOLID, TDD lo alentará a que piense en ellos y los use activamente.

Dicho esto, no necesariamente cubre todas las letras en SÓLIDO , pero lo alienta y lo promueve a que escriba, al menos en parte, un código SÓLIDO, porque tiene las consecuencias de no hacerlo. Inmediatamente visible y molesto.

Por ejemplo:

  1. Necesitas escribir código desacoplado para que puedas burlarte de lo que necesitas. Esto es compatible con el Principio de inversión de dependencia .
  2. Necesita escribir pruebas que sean claras y cortas para que no tenga que cambiar demasiado en las pruebas (que pueden convertirse en una fuente importante de ruido de código si se hace de otra manera). Esto es compatible con el principio de responsabilidad única .
  3. Esto puede discutirse, pero el Principio de Segregación de la Interfaz permite que las clases dependan de interfaces más ligeras que hacen que el simulacro sea más fácil de seguir y entender, porque no tiene que preguntar "¿Por qué no ¿estos 5 métodos se burlaron también? ", o lo que es más importante, no tienes mucha elección a la hora de decidir qué método simular. Esto es bueno cuando realmente no quiere revisar todo el código de la clase antes de probarlo, y simplemente use prueba y error para obtener una comprensión básica de cómo funciona.

Adherirse al principio Abierto / Cerrado puede ayudar a las pruebas que se escriben después de el código, porque generalmente le permite anular las llamadas de servicio externas en las clases de prueba que se derivan de las clases en prueba. En TDD creo que esto no es tan requerido como otros principios, pero puedo estar equivocado.

Adherirse a la regla de sustitución de Liskov es excelente si desea minimizar los cambios para que su clase reciba una instancia no compatible que simplemente implementa la misma interfaz de tipo estático, pero no es probable que ocurra en los casos de prueba adecuados porque por lo general, no pasará ninguna clase bajo prueba de las implementaciones de sus dependencias en el mundo real.

Lo más importante es que los principios de SOLID se crearon para alentarlo a escribir un código más limpio, más comprensible y fácil de mantener, y también lo fue el TDD. Entonces, si hace TDD correctamente y presta atención a cómo se ven su código y sus pruebas (y no es tan difícil porque obtiene retroalimentación inmediata, API y corrección), puede preocuparse menos por los principios de SOLID, en general.

    
respondido por el Yam Marcovic 01.10.2011 - 21:02
9

No

TDD puede hacer que sea más fácil seguir buenas prácticas debido a la refactorización continua, pero no te obliga a seguir ningún principio. Todo lo que hace es asegurarse de que el código que escribe esté probado. Puede seguir los principios que desee al escribir código para satisfacer la prueba; o ningún principio en absoluto.

    
respondido por el dietbuddha 01.10.2011 - 19:49
2

Mi comprensión de los Principios SÓLIDOS se amplió en un orden de magnitud cuando comencé a hacer TDD. Tan pronto como comencé a pensar en cómo simular las dependencias, me di cuenta de que virtualmente cada componente de la base de código tenía una posible implementación alternativa. Y cuánto más fácil es probar una API pública simple.

También proporcionó una comprensión mucho más sólida de la mayoría de los patrones de diseño. Especialmente el patrón de estrategia.

    
respondido por el Heath Lilley 03.10.2011 - 15:19
0

Sí : TDD es principalmente una buena técnica de diseño (y solo una técnica de prueba secundaria). Ayuda mucho para lograr los principios sólidos, aunque todavía son posibles ejemplos (patológicos) de TDD con muchos olores de código.

La conexión entre TDD y los principios sólidos se disputa (con la conclusión anterior) en este gran podcast de hanselminute llamado" Test Driven Development is Design - The Last Word en TDD ".

    
respondido por el DaveFar 01.10.2011 - 21:39

Lea otras preguntas en las etiquetas