Supongamos que he decidido escribir una aplicación grande en C o en cualquier otro lenguaje de programación de procedimientos. Tiene funciones con call-dependencias que tener este aspecto:Inyección de dependencia para la programación de procedimiento
A
|
+-------------+
| |
B1 B2
| |
+------+ +------+
| | | |
C11 C12 C21 C22
Obviamente, la unidad de pruebas de las funciones de hojas, C11, C12, C21 y C22 es muy fácil: Configuración de las entradas, invocar las funciones, afirmar la salidas.
Pero, ¿cuál es la estrategia adecuada para permitir una buena prueba unitaria para B1, B2 y A?
¿Dependency Injection sugieren que B1
(y B2
también) se declaren como se siguen?
// Declare B1 with dependency injection for invoking C11 and C12.
int B1(int input, int (*c11)(int), int(*c12)(int));
Pero esa estrategia no parece escalable si tengo muchas capas de llamadas. Imagínense lo que la declaración de A
se vería así:
int A(int input, int (*b1)(int, int (*)(int), int(*)(int)),
int(*b2)(int, int (*)(int), int(*)(int)),
int (*c11)(int),
int (*c12)(int),
int (*c21)(int),
int (*c22)(int));
qué asco! Tiene que haber una mejor manera.
A veces, siento que DI y otros patrones similares que pretenden promover la modularidad y la facilidad de mantenimiento en realidad dificultan la claridad del código y complican lo que debería ser la codificación directa en abstracciones sin sentido e indirecciones intrincadas.
¿Cómo se tratan los grandes proyectos de software en C, como Perl y Ruby, con pruebas unitarias?
Esta es una idea interesante. Tendré que intertarlo. – kirakun
También puede programar OO en C, no solo de procedimiento. Simplemente declare una estructura con miembros de datos y funciones tomando la estructura como primer argumento (pseudo este puntero). Implementación en archivo c y tú mismo has creado una pseudoclase. El polimorfismo y cosas así son posibles, simplemente complicadas;) – sanosdole