C++开发SDK库的一些个人心得

目录

日志打印相关

对外接口加打印

内部过程加打印

调用第三方库加打印

所有函数过程加Trace打印

抛出异常前打印异常信息

版本号相关

提供获取版本号接口

打印库版本号

头文件相关

接口头文件中的复杂类型定义单独的类型

接口头文件中的基本数据类型使用大小明确的基本数据类型

代码健壮性相关

代码尽可能健壮

检查接口输入参数

其他

字符串统一编码

持续更新中......


日志打印相关

对外接口加打印

基本上库的所有接口都要将外界调用接口时传入的所有参数打印成info级别的日志,以便在出现问题时,界定问题的归属。

库的某些会被频繁调用的查询接口可以要将外界调用接口时传入的所有参数及返回的结果打印成trace级别。因为如果在这种接口打印info级别日志,将导致info级别日志过多,影响后续问题分析。

内部过程加打印

库内部的一些过程加debug级别的打印,以便在出现问题时,对问题进行具体定位。

调用第三方库加打印

库内部如果调用了第三方库(尤其是其他同事负责维护的),需要将调用第三方库的所有参数都打印成debug级别的日志,以便出问题时,对出现问题的范围进行界定。

所有函数过程加Trace打印

库内自己开发的所有函数都要在进入和退出函数的时候加Trace级别的打印,以获得最详尽的程序运行过程信息。

抛出异常前打印异常信息

在抛出异常信息前,将异常信息打印成error或fatal级别的日志。因为外部代码可能不会捕获异常或捕获异常后也不打印异常中包含的信息。

版本号相关

提供获取版本号接口

提供获取库版本号的接口,以便外接在运行时获取库的版本信息。

打印库版本号

在库刚运行时以info级别打印库的版本信息,以便出现问题时通过日志确定外接使用的库的版本。

头文件相关

接口头文件中的复杂类型定义单独的类型

接口头文件中如果有复杂类型(如函数指针),则使用typedef或using定义成单独的类型。例如

using callback_t = double(*)(int, float);

这样做的好处是如果这个复杂类型定义发生改变,只需要修改定义即可,不需要修改其他地方。

接口头文件中的基本数据类型使用大小明确的基本数据类型

接口头文件中的基本数据类型使用大小明确的基本数据类型,如int32_t。

因为在跨语言和跨平台调用库时,会出现基本数据类型不一致的可能。例如,Java中int固定占用4个字节。但int在64位C++程序中可能占用8个字节。

代码健壮性相关

代码尽可能健壮

很多外部代码调用库接口的方式不一定是正确的。例如库需要先调用授权接口,才能调用其他接口。这种情况库的所有接口(除授权接口)外,在被调用调用后,首先就要检查是否已经授权成功。

检查接口输入参数

检查所有外界输入库接口的参数。如果参数有问题,则抛出异常,并在异常中附带具体的错误信息。

有些库的接口采用的是返回错误码的形式,这种形式不如抛出异常灵活。

其他

字符串统一编码

内部字符串使用统一的编码(推荐UTF8),只在接口和调用其他库时进行编码转换。这样做的好处是避免内部字符串编码混乱。

持续更新中......

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值