文档章节

如何写好C代码之依赖注入

frank21
 frank21
发布于 01/25 22:50
字数 1468
阅读 1537
收藏 77

依赖注入(Dependency Injection 简写为DI)开发过程中解除耦合的经典手段,但是似乎从一开始这货就是为面向对象而生的,我所看到的示例都没有将C语言考虑在内。难道C语言不能使用这么经典的设计模式?本文就来介绍一下C语言如实使用依赖注入来解除耦合。

参数注入

对应于面向对象语言的构造函数注入,C语言作为过程语言,参数注入法是最简单、也是最直接的方法。最常见的排序方法qsort就是用这种方法:

void qsort(void* base, size_t num, size_t size, int (*compar)(const void*,const void*));

可以看到qsort函数的第四个参数compar就是外部依赖的对象(函数),因为不同场景有不同的比较元素大小的方式,通过参数将外部依赖注入,使该函数更加具有通用型,因为实际上我们用qsort,只是用他的排序算法,其他的都是和具体使用场景有关。

设置(set)接口注入

上一篇我们介绍的设置回调函数的方法其实就是使用这种方法,其本质就是专门对外提供一个接口,用来将依赖的外部对象或者函数注入到本模块中来。比如开发一个模块,需要申请内存,但是为了易用性,除了使用系统自带的内存申请函数,我们需要支持第三方的内存池模块来申请内存,我们就可以提供一个API来设置申请释放内存的函数,如下示例:

///默认申请内存方式为系统自带的函数
static void *(*malloc_function)(size_t size) = malloc;
static void (*free_function)(void *p) = free;

int sample_module_init()
{
    return 0;    
}

///设置新的分配内存的函数
int sample_module_set_memory_api(void *(*get)(size_t size), void(*put)(void *p))
{
    malloc_function = get;
    free_function = put;
    
    return 0;
}

///申请一个size大小的int类型数组
int *sample_module_create_int_array(size_t *size)
{
    int *p = (int *)malloc_function(sizeof(int) * size);
    return p;
}

这样我们