在C语言中,简单包装函数的目的是什么?

4
在“学习C语言的艰苦之路”(Learn C the Hard Way)的ex26中,在db.c文件中,Zed定义了两个函数:
static FILE *DB_open(const char *path, const char *mode) {
return fopen(path, mode);
}
static void DB_close(FILE *db) {
fclose(db);
}

我很难理解将这些非常简单的fopenfclose调用包装起来的目的/需求。像上面给出的例子一样,包装非常简单的函数有什么优点(如果有的话)?

2
通过使用包装器来使用库,库的消费者可以自由地更改其实现方式,而无需对库代码进行修改。 - Jonathon Reinhart
2
你可能会对这里粘贴的代码不是一个很好的包装器感到有些困惑 - 它暴露了底层实现的确切参数和类型,这意味着如果实现发生变化,调用者也很可能需要进行修改。一个更好的包装器应该抽象出一些内容,以便可以在不导致代码使用者改变的情况下更改实现。 - Michael Kohne
@MichaelKohne 在给定的示例中抽象出来是否可能?还是更多地作为封装函数时的一般建议? - Toke Faurby
3个回答

7
在这种情况下,使用包装器来隐藏 DB_openDB_read 或者 DB_close 全部映射到文件操作的细节。这种方法实现了一个抽象层,通过该层访问所有与数据库相关的功能。此外,它还提供了可扩展性,以后可以添加更多打开/读取/关闭数据库的方法。
正如 Michael Kohne 在评论中所解释的那样,应改进此包装器,使其完全隐藏 FILE *db 类型,用 struct DB_context *context; 替换它。

1
包装器(或存根)通常用于保护代码中被包装函数的更改,以防影响其他区域。
它还是与动态库和共享对象交互的有用方式。

0
基本上,Wrapper 意味着使用我们或开发者的自定义函数来隐藏底层程序的所有相关信息。
您已经提到文件名本身是 db.c,因此开发者可能希望所有被使用/声明的关键和重要函数都必须以 DB_ 开头。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接