Estoy pasando por esta serie . El autor menciona que, dado que el estado se mantiene en la programación orientada a objetos, es más difícil escribir pruebas unitarias. También dice que, dado que la programación funcional no mantiene el estado (no siempre), es más fácil escribir pruebas unitarias. No vi ningún ejemplo que demuestre este problema. Si esto es cierto, ¿podría darme un ejemplo comparando pruebas unitarias en programación funcional y orientada a objetos?
9
State
mónada (que emula el estado). Parcialmente tiene un punto: el código escrito en ese estilo tiene interacciones no locales, pero a los efectos de la prueba unitaria, todavía puede pasar explícitamente en el estado, no tiene que burlarse de nada. Por otro lado, con mónadas comoST
yIO
(que tienen un estado mutable verdadero e implícito), simplemente está haciendo una programación con estado, y las pruebas unitarias no serán más fáciles que en cualquier otro lenguaje.Respuestas:
Quiero distinguir entre dos formas diferentes de abordar la programación orientada a objetos
Una regla general es que un objeto programado en la primera forma tendrá más métodos y más
void
métodos que en la segunda forma. Digamos que íbamos a escribir un simulador de vuelo y estábamos diseñando una clase de avión. Tendríamos algo como:Esto es quizás un poco más extremo de lo que uno podría encontrar, pero hace que se entienda. Si desea implementar este tipo de interfaz, debe mantenerse dentro del objeto:
Escribir una prueba unitaria para un objeto escrito en el modo es muy difícil porque:
Básicamente, comienzas con una interfaz que parece razonable y que se adapta bien al dominio, pero la simulación de la simulación te ha engañado para crear un objeto que es realmente difícil de probar.
Sin embargo, puede crear objetos que cumplirían el mismo propósito. Querrías
Plane
dividirlo en pedazos más pequeños. Tenga unPlaneParticle
dispositivo que rastree los bits físicos del avión, la posición, la velocidad, la aceleración, el balanceo, la guiñada, etc., etc., exponiendo y permitiendo que uno los manipule. Entonces unPlaneParts
objeto podría rastrear el estado de. Se podría enviartick()
a un lugar completamente diferente, por ejemplo, tienen unPlanePhysics
objeto parametrizado por, por ejemplo, la fuerza de la gravedad, que sabe dar unaPlaneParticle
y unaPlaneParts
forma de escupir una nuevaPlaneParticle
. Todo esto podría ser completamente inmutable, aunque no es necesario que sea por algún ejemplo.Ahora tiene estas ventajas en términos de pruebas:
Aquí está el truco: el segundo enfoque orientado a objetos que describí está muy cerca de la programación funcional. Tal vez en los programas funcionales puros sus registros y sus funciones estén separados y no unidos en objetos, definitivamente un programa funcional garantizaría que todas estas cosas. Lo que creo que realmente facilita las pruebas unitarias es
La programación funcional fomenta estas cosas (pero uno puede escribir programas malos en cualquier paradigma), pero se pueden lograr en programas orientados a objetos. Y destacaría que la programación funcional y la programación orientada a objetos no son incompatibles.
fuente