如何写一个公共库
把经常用的功能或函数封装成一个独立模块,作为公共库供其他人共享,是个很好的事情!
但注意几点(也许不全,再补充)
1-作者必须是第一个使用者
作者自己一定是第一个用的,最好正在线系统上7x24运行过, 把常见的坑自己先趟一遍,别先留给别人;
2-让使用者尽可能简单调用
最好只提供一个.h, 一个.so, 一个example.c, 如果功能很复杂的库,再加一份说明文档,
实在没办法,需要额外依赖第三方库的,最好将其作为.a封装在.so内部,尽量不要让使用者再安装、链接第三方库;
3-向后兼容
一个公共库的功能通常是不断膨胀的,
纯新增加的功能或接口还好,
如果对旧接口进行升级改进,怎么在发布新版时,同时兼容旧版,是必须考虑的问题,
我犯过如下错误:
第一版: fun(int a);
第二版需要加参数: fun_v2(int a, int b);
第三版又需要加参数: fun_v3(int a, int b, int c);
由fun升级到fun_v2,确实是没办法的事情,否则新加的功能无法使用,
但还有后续的fun_v3就不应该了,在fun_v2阶段,就应该考虑到一切后续的升级兼容性问题,
可参考Linux接口setsockopt(2)。
4-有足够详细的日志,要能区分日志等级
运行时严禁刷屏,初始化阶段时可打印一些重要信息,
正常运行时,只输出严重错误日志;
遇到问题切换到DEBUG级别时,能输出足够详细的日志,帮助使用者确定大致问题原因,
否则,作者就要不停接电话,聊QQ,或者去现场,最后发现可能就是个配置文件写的不对。
5-防御式or契约式
作为一个公共库,还是要用防御式编程,不要相信任何人,
哪怕牺牲点性能,输入参数一定要检查合法性,否则整天coredump可受不了。
即便某些情况下,需要追求极致性能,也要用宏定义控制开关, 仅必要时开启。
- 1楼 刘庆云 2017-06-12 15:36:24 [回复]
- 公共库的接口设计应该加一个评审环节,广泛收集意见。