API的设计方法是什么(api,开发技术)

时间:2024-05-03 13:47:39 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    API%E7%9A%84%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88

假设提供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的设计方法是什么的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:怎么掌握AQS下一篇:

11 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18