Внедрение зависимостей для процедурного программирования

Предположим, я решил написать большое приложение на C или любом другом процедурном языке программирования. В нем есть функции с зависимостями вызовов, которые выглядят следующим образом:

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

Очевидно, модульное тестирование функций листьев, C11, C12, C21 и C22 очень просто: настроить входы, вызвать функции, подтвердить выходы.

Но какова правильная стратегия для обеспечения хорошего модульного тестирования для B1, B2 и A?

Может ли Внедрение зависимостей предполагать, что B1 B2 также) быть объявленным следующим образом?

// Declare B1 with dependency injection for invoking C11 and C12.
int B1(int input, int (*c11)(int), int(*c12)(int));

Но эта стратегия не кажется масштабируемой, если у меня много уровней вызовов. Только представьте, как будет выглядеть объявление для A :

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));

Фу! Должен быть способ получше.

Иногда, Я чувствую, что DI и другие подобные шаблоны, которые призваны способствовать модульности и простоте обслуживания, на самом деле затрудняют ясность кода и усложняют то, что должно быть простым кодированием, превращая его в бессмысленные абстракции и запутанные косвенные ссылки.

Как создаются крупные программные проекты на C, такие как Perl и Ruby. , имеет дело с модульным тестированием?

11
задан kirakun 6 April 2011 в 16:32
поделиться