Inyección de dependencia para programación procesal

Suponga que he decidido escribir una aplicación grande en C, o en cualquier otro lenguaje de programación procesal. Tiene funciones con dependencias de llamadas que se ven así:

A
|
+-------------+
|             |
B1            B2
|             |
+------+      +------+
|      |      |      |
C11    C12    C21    C22

bviamente, la prueba unitaria de las funciones de hojas, C11, C12, C21 y C22 es muy fácil: configure las entradas, invoque las funciones, confirme las salidas.

Pero cuál es la estrategia adecuada para permitir una buena prueba de unidad para B1, B2 y A?

HaríaInyección de dependenci sugerir queB1 (yB2 también) se declarará como sigue?

// 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. Solo imagina cuál es la declaración paraA 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));

Yuck! Tiene que haber una mejor manera

A veces, creo que DI y otros patrones similares que pretenden promover la modularidad y la facilidad de mantenimiento en realidad obstaculizan la claridad del código y complican lo que debería ser una codificación directa en abstracciones sin sentido e indirectas intrincadas.

¿Cómo los grandes proyectos de software en C, como Perl y Ruby, se ocupan de las pruebas unitarias?

Respuestas a la pregunta(5)

Su respuesta a la pregunta