开源项目,这样使用才稳

企业动态
在公司的项目中,或多或少都会使用到一些开源的项目。但是在开源项目的选择上,就需要格外的慎重了。本篇文章,就如何选择在商业项目中使用的开源库,做一个介绍。

 [[198246]]

一、前言

在公司的项目中,或多或少都会使用到一些开源的项目。但是在开源项目的选择上,就需要格外的慎重了。

如果只是个人处于学习或者练手的目的,使用的一些比较新颖的开源项目,这个完全随自己,想怎么使用就怎么使用。但是如果是在公司的商业项目上,就需要格外慎重了,因为商业项目***个重点要求,就是一定要能保证稳定。

本篇文章,就如何选择在商业项目中使用的开源库,做一个介绍。

二、正确的使用开源项目

2.1 使用成熟稳定的开源项目

既然商业项目,主要是以稳定为主,那么在选择开源项目上,就需要以成熟稳定为前提条件。

对于一些常用的技术,就那么多种类,网络请求、ORM、图片加载等。找一些明星项目,总是不会错的,这个相信大家都懂。

那么,正常来说,如何选择一个相对稳定的开源项目呢?

1、Github 上的热度

一个开源项目,在 Github 上的 Start 数和 Fork 数,就可以从侧面反应出它的热度。

2、issues 和***更新时间

一个开源项目的 issues ,可以表达很多正在使用它的人碰到的问题,以及作者的回复和有没有得到解决。当然,作者回复的速度和比例也是一个参考。

而***更新时间也反应出这个项目是否有人在积极维护。

3、正在使用它的商业项目

一个优秀的开源项目,注定不是你首先发现的。在你考虑是否将其集成到公司的商业项目的时候,一定也有其他人如此考虑了。所以有什么公司的项目,正在使用它,也是一个稳不稳定的标识。

4、使用稳定版本

Github 上的开源项目,也是在不停的维护和改进迭代的,所以如果需要使用,一定要使用它打了 Tag 标签的版本,这样才能***限度的保持稳定可用。

5、开源协议

并非所有的开源项目都是可以随便使用的。在使用前一定要阅读开源许可协议,看它是否能允许你随便使用在商业项目中。

不过 Github 上的开源项目,大多数限制并不严格。除了 GPL 协议需要额外注意,它规定使用它的项目也必须遵循 GPL 协议,也就是也必须开源,这肯定不适用商业项目。

2.2 了解背后的原理

如果决定使用这个开源项目,一定要理解其原理,这个其实在实际开发开发中,你修改一段别人维护的代码,也需要结合上下文,理解它代码的原理和逻辑,才能保证修改它不会引发其他的问题。

使用开源项目也正是如此,仅仅会用它是不够的,决定是否将它引入的人,一定要对它的原理有足够的了解,不能仅仅停留在 API 的使用上。

在使用前,扒开源码看本质,不是说一定要事无巨细的了解它所有的细节,但是主体的业务线,原理是什么,使用中需要注意什么,在什么场景下可能会出现问题。这些都是需要了解清楚的,避免出现问题而措手不及。

2.3 不要改动源码

大多数情况下,开源项目不可能永远满足我们的需求,有时候我们可能需要对开源项目进行一些定制修改。

那么,***是对其进行扩展而不是直接去修改它的源码。

对于一些真正的明星开源项目,实际上已经设计封装的很好了,如果想要扩展,也非常的简单。例如,OkHttp,如果你在请求响应的时候想做一些额外的操作,只需要增加一个拦截器即可。

而不改动源码的原因也非常的简单,开源项目一般都是会持续维护和更新的,在不修改源码的情况下,之后再进行升级就非常的简单,这里也推荐直接使用 Gradle 远程依赖的方式去集成(一定要明确指定版本号),这样大多数情况下,升级基本上就是改一个版本号的事情。可也不排除会有接口上的变动,但是一般这样的变动,也会提供升级指南之类的帮助文档。

2.4 视情况决定引入方式

有时候需要的一些小的开源项目,并非功能强大的明星项目,可能只是一个 UI 效果。

一些开源项目,为了功能上的大而全,可能会集成一些我们不需要的额外功能。而假如我们需要的只是这个开源项目中,很小的一部分,其实是可以考虑将其相关代码类拷贝出来,单独维护的。

这个的前提是此开源项目的耦合性太高了,导致内部太多的类相互引用,这样的情况下,我们只需要将我们关注的代码拷贝出来,进行简单的修改解耦,即可直接使用。这样的方式可以适当减少方法数和 dex 的大小。

而如果开源项目本身耦合并不严重,实际上依然推荐使用 Gradle 远程依赖的方式引入,在最终打包的时候,只需要开启 shrinkResources 即可,它会将一些项目内没有用到的资源移除掉,从而不用担心方法数和安装包大小的问题。

2.5 使用前需要进行封装

优秀的开源项目,其实已经封装的非常好了,可能最终到使用者这边,只需要一行代码即可搞定。

但是哪怕是再好的封装,我依然建议在使用前对其进行一层封装,哪怕是最简单的封装也可以。

对开源库进行封装后使用,一个根本性的好处就是,接口统一。哪怕有一天,随着业务的增长或者技术的迭代,之前的开源库已经没有办法满足现在的需求了,需要对整个项目的该库进行替换。这个时候如果有一层封装,那么替换起来只需要修改业务的接口实现类即可,而不是需要整个项目进行代码替换。

有些人可能会想了,我接手这个项目的时候,前人已经是在直接使用这个开源项目了,现在我需要替换它,不是依然需要全文进行代码替换吗?

这样的问题其实非常的常见,那么如果遇上这样的问题,实际上我们既然已经要移除它了,完全可以在项目内建立与它包名类名都相同的同名类文件,然后根据它对外的接口,去实现它。这样我们只需要处理两个库之间,接口使用的差异即可,其实也可以达到快速替换的效果。

但是,也有人说了,这样是不是就可以不封装了?反正最终替换的时候,处理两个库接口的差异即可。其实并不是这样的,提前封装是为了更优雅更从容的替换,有时候不同库的使用方式,去处理它们的差异会让我们的代码非常的混乱和不可读。就像在修改之前,自己给自己制定了一系列的规则去束缚自己一样,所以提前封装,把规则掌控在自己手里。

所以,如果可以,封装一层再进行使用。

2.6 实时关注更新

开源项目必然是会保持更新的,在使用过程中,如果碰到问题,可以去看看最近的提交以及 issues,看看有没人碰到与你相同的问题,或者可能你的问题已经在***版得到解决。

三、结语

在商业项目中,使用那个开源项目大多数情况下都是项目 Leader 去决定的,但是这并不影响我们了解自己维护的项目中,使用到的开源项目,不仅更有利于我们在工作中更快速的发现问题。阅读优秀的开源项目,是提高技术能力非常快的一个手段。

【本文为51CTO专栏作者“张旸”的原创稿件,转载请通过微信公众号联系作者获取授权】

戳这里,看该作者更多好文

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2021-10-15 06:58:57

零信任高危漏洞

2021-02-05 11:36:42

数据业务指标

2020-10-25 19:58:04

Pythonic代码语言

2021-04-20 10:50:38

Spring Boot代码Java

2021-10-17 22:23:43

5G4G数据

2020-05-15 15:28:51

爬虫Python学习

2022-04-24 08:23:19

Redis内存淘汰策略

2023-06-27 08:58:03

2020-06-17 21:22:56

Serverless面试官架构

2023-08-01 08:54:02

接口幂等网络

2018-01-02 09:36:55

程序员加薪年终

2016-11-09 20:21:12

简历开源时间管理工具编程语言

2024-04-07 08:48:13

WebSocket集群MQ

2021-02-10 07:00:07

WiFi无线路由器无线信道

2022-08-21 14:00:11

消息中间件MQ

2015-09-21 09:38:14

营销H5

2018-04-23 14:33:31

笔记本接口布局

2017-07-04 10:09:54

Wi-Fi路由器网络

2018-06-27 16:04:07

2015-01-26 09:57:47

GradleMaven Centr
点赞
收藏

51CTO技术栈公众号