关于使用第三方库、代码复用的一些思考

不管是不要重复造轮子,还是站在巨人的肩膀上,对于软件开发来说,代码复用都是最基本的原则之一。

代码复用,可能是DIY(dont repeat yourself),也可能是使用别人的代码,或者是开源项目,或者是其他团队提供的组件、服务,或者是团队内他人实现的公共模块,这些复用大大减少了项目的开发周期和成本。

但怎样才算是高效、正确的第三方代码使用姿势呢?在实操中,也会出现一些使用第三方代码导致失控的情况,比如使用用了一些第三方代码,但年久失修,当线上事故貌似与第三方代码有关时,无法快速定位、解决问题。

本文是阅读《clean code》的第八章边界(Boundaries)时的一些思考。

本文地址:https://www.cnblogs.com/xybaby/p/11372846.html

本文将复用的代码分为两类:

  • 一类是团队外的代码,具体指第三方库、开源库、公司内其他团队的通用组件,其特征是,这样的代码往往需要做的比较通用,大而全;项目团队只是使用者,很难从根本上影响其设计或实现。
  • 另一类则是团队内的代码,即项目团队成员自行封装的一些通用模块、通用组件,其特征是核心为项目服务,比较方便协商修改。

如何复用第三方库代码

这里的复用,不局限于代码,也包括可供远程调用的服务。一般来说,项目会调研、选择一些开源代码,也会使用公司内基础服务部门或者云计算上的一些服务,我觉得这都算复用。

最小化、集中化代码复用

第三方库往往追求功能(服务)的普适性,这样代码就能在多个环境中工作,吸引更多的用户。而使用者往往只需要满足特定需求的部分接口,对于不需要的功能(以及不建议的使用方式),对项目来说反而是负担,控制不当反而会带来风险。

比如redis,既能做内存数据库,也能持久化;既支持单点部署,也能通过sentinel、cluster提供高可用以及水平扩展;而且还支持pub-sub(以及比较新的stream)。但在我们的项目中,只用来内存缓存,而且对可用性、伸缩性也没有太大需求。

原则上,使用第三方库时,使用到的接口(服务)越少越好,将其封装到单独的文件(类、模块),在其他地方不能直接使用第三方库。通过适配,只将需要的部分功能纳入,不需要的功能(接口)不要暴露出来。

这样的好处在于入口统一,将所有对第三方库的使用集中到最少量的代码里面,便于维护。同时,这也是分层的思想,将业务代码与第三方库解耦合,便于替换实现。

learning tests

要将一个开源项目引入自己的业务代码,需要进行科学的调研和完备的测试。调研包括但不限于:与业务需求的重合度,开源社区的成熟度、活跃度等。而测试应包含以下几个方面

  • 功能测试
  • 性能测试
  • 压力测试
  • 故障测试

前两项是最基础的测试,主要判断是第三方库是否符合业务的功能、性能要求,同时掌握正确的使用姿势。而后两者,则常常是第三方库以单独的服务部署运行时的测试要点。

为了进行测试,我们会有一些测试代码,也许会参考项目自带的unittest、 code sample、tutorial、benchmark。但问题在于,这样的测试代码经常用完就扔,这样导致

  • 如果后面出现问题,我们就需要不断调试,来确定是类库本身的问题,还是我们使用姿势的问题。
  • 当地三方库升级之后,应用不敢跟着升级,因为没有手段保证新版本的类库提供了同等契约。

第二个问题我想很多很多人都会遇到,当依赖的第三方库升级的时候,项目是否跟着一起升级你?两种比较极端的策略我都遇到过,一种是始终更新到第三方库的最新稳定版本;另一种是基本不升级,自己维护某个特定版本。

learning test能解决上述的第二个问题:

我们将所有的测试整理为一整套针对所使用的功能的单元测试,这些测试覆盖了我们对功能、性能、稳定性都诸多方面的需求。当第三方类库的版本更新的时候,我们只要把单元测试再跑一遍,就可以判断新代码的代码是否提供了同等的契约,也就可以比较安全的进行升级。

不难看到,上一小节,“集中化第三方代码使用”是learning test的基础,让我们很清楚的知道应该对那些接口进行测试,如果要扩展对第三方库的使用,也能很方便的增加、维护对应的测试。

如何复用团队内的代码

在团队内,也是非常鼓励代码的复用,比较常见的方式是形成各种通用的组件。那么,如果程序员A使用了程序员B提供的公共模块出了问题,那么责任该如何划分?

如果是开源代码,毫无疑问只能责怪使用者,但是在团队中,似乎并不能完全归咎于使用者。公共组件的使用者一般并不会对使用进行完整的测试,也会认为,“都是一个团队的,就应该提供者保证质量,方便快速使用”。

我认为,使用者的责任占主要,使用者应该就使用方式进行测试,如果提供者已经提供了相应的单元测试,而且能通过,那么就可以直接使用。否则应该添加对应的测试case,如果无法通过,则可以找提供者协商解决。对于通用模块、通用组件的提供者,也应该有义务提供高覆盖率的单元测试,一来开发的时候因为本身就会测试,并不会增加额外的工作量;二来是对使用者的一份正式的保证,也能提高自己在团队的影响力。

原文地址:https://www.cnblogs.com/xybaby/p/11372846.html

时间: 2024-11-11 05:42:25

关于使用第三方库、代码复用的一些思考的相关文章

[jetbrains系列] 外链第三方库+代码补全设置

jetbrains系列的IDE真的是太好用了,有种相见恨晚的感觉. 在开发过程中第三方库是必不可少的,在开发的时候如果有一个可以补全的IDE可以节省查文档的时间. 举个例子:给pycharm配pyspark的环境变量,并且设置代码补全.最终结果应该是这样的: 首先配置的是第三方库的编译(解释)支持,在Run/Edit Configurations里.点+号添加一个新的配置. 在Configuration选项卡里找到Environment中的Environment variables,如下编辑:

创建podSpec,使用pod管理第三方库

提要: podfile文件会先读取.podspec文件,根据.podspec文件的指向来下载第三方库到项目中. 本文先通过一.二.三项,这三个步骤讲解了如何建立一个.podspec文件在本地.cocoaPod库,第三方库在远程机器的例子. 后文中的第四项,讲解了.podspec文件在本地项目中,第三方库在远程机器的设置方法:最后讲了.podspec文件在本地项目中,第三方库也在本地项目中的设置方法. 正文讲解: 一.创建需要pod管理的第三方库 (1) 本地创建第三方库起名为lvPodLibra

关于使用第三方库masonry的代码实例

今天用自动布局纯代码的方式,并且引用第三方库写了一个微博界面的案例,其中的每个约束之间都是相互联 系的,例如label 和 text 不能设置宽度和高度的具体数值,一旦固定下来,可能会出现错误,例如不会 换行,文字显示不全等等一些列问题, 一个技巧,手动布局时,最好从一侧开始进行约束,一般推荐上面和左侧,进行约束,约束时,一定要找一个 固定的控件进行参考,在执行约束,否则,因为优先级的缘故,可能被优先级高的一方拽走,这里是要注意的 地方,下面是截取的一段实例进行了简要的说明,也对自动布局的理解做

Python 第三方库xlrd读取Excel代码

Python 第三方库xlrd读取Excel代码: 安装xlrd 安装xlrd,只需运行setup即可,另外你也可以直接解压缩到你的project中,也可以直接用 xlrd的API 获取Excel,这里称之为work book open_workbook(file_name) 获取指定的Sheet,有两种方式 sheet = xls.sheet_by_index(sheet_no) sheet = xls.sheet_by_name(sheet_name) 获取整行和整列的值(数组) sheet

对第三方库集成方式的分析

前一阵子做了iOS集成新浪微博SDK并实现部分功能的工作,这里正好将事后反思的内容总结一下,欢迎喷冷水. 假定需求是这样:在已经使用微博登陆的前提下,查找一个人的所有好友,筛选出其中年龄.性别等属性符合一定规则的人,然后查找这些人所有的微博,将这些微博按照一定的条件组织并且展示. 首先说明一下,查找好友和查找微博的做法,都是通过网络请求向新浪API请求数据,而登陆则可以通过SDK来简单实现. 那么,从上述描述当中,我们看到了两个大的用例,一个是登陆,一个是后面描述的一系列操作. 首先说登陆这件事

最全面的iOS和Mac开源项目和第三方库汇总

UI 下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.具体使用看“使用方法”. (国人写) XHRefreshControl – XHRefreshControl 是一款高扩展性.低耦合度的下拉刷新.上提加载更多的组件.(国人写) CBStoreHou

iOS 开发第三方库全集

拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.具体使用看"使用方法". (国人写) XHRefreshControl – XHRefreshControl 是一款高扩展性.低耦合度的下拉刷新.上提加载更多的组件.(国人写) CBStoreHo

IOS常用第三方库《转》

UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照相视频音频处理 响应式框架 消息相关 版本新API的Demo 代码安全与密码 测试及调试 AppleWatch VPN 完整项目 好的文章 Xcode插件 美工资源 其他资源 开发资源 UI 下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UITableView或者Collect

iOS 第三方库、插件、知名博客总结

用到的组件1.通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SDWebImage多个缩略图缓存组件 UICKeyChainStore存放用户账号密码组件 Reachability监测网络状态 DateTools友好化时间 MBProgressHUD一款提示框第三方库 MWPhotoBrowser一款简单的 iOS 照片浏览控件 CTAssetsPickerController一个选择器组件, 支持从用户的相片库选择多张照片和视频. QB