API的设计方法是什么
导读:本文共2407字符,通常情况下阅读需要8分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 假设提供TestFun作为一个对外接口,我们编译并制作为静态库:$g++-capi.cc-I./$ar-rcslibapi.aapi.o关于静态库的制作,请参考《Linux下如何制作静态库?》。另外一个程序main.cc这么使用它://来源:公众号编程珠玑//作者:守望先生#include"api.h"intmain(){Paramparam... ...
目录
(为您整理了一些要点),点击可以直达。假设提供TestFun作为一个对外接口,我们编译并制作为静态库:
关于静态库的制作,请参考《Linux下如何制作静态库?》。
另外一个程序main.cc这么使用它:
编译链接使用:
看起来并没有什么问题,有新的参数,可以直接在Param中增加即可,扩展性也不错。
问题来了
目前来看是没有什么问题的,但是假设,还有另外一个库要使用它,例如:
也将它作为静态库:
这个时候同样主程序会用到我们的原始api,但是却使用了不同的版本,比如,新增了Param中新增了一个字段ext:
重新生成静态库:
这个时候,通过use_api使用api接口,但是链接新的库:
这个时候,再去编译链接,并运行:
看到没有,喜闻乐见的core dumped了,分析core还会发现,是由于访问非法地址导致的。
我们再来梳理一下这个过程:
提供库libapi.a版本A
libuse_api使用版本A进行编译,使用A版本的头文件
libapi.a库升级到B版本,其中头文件中增加了字段,并且实现也引用了新的字段
主程序使用了use_api,但是链接了版本B的libapi.a库
这个时候,版本B的实现访问了新的字段,还是use_api中还是使用A版本,并没有传入新字段,因此自然会导致非法访问。
如何解决?
很简单,不直接暴露成员,而是提供setter和getter,而提供方式和前面提到的PIMPL方法类似。
在这里头文件中只提供setter和getter,而完全不暴露成员,具体成员的设置在ParamImpl中实现:
通过上面的方式,不会直接暴露成员函数,而是提供接口设置或者获取,而在实现中,即便出现新的版本增加了接口,最多也只是获取到默认值,而不会导致程序崩溃。
API的设计方法是什么的详细内容,希望对您有所帮助,信息来源于网络。