在开发中,学会如何写出优质的代码很重要,学会使用三方库也很重要,但更重要的,是研习别人写代码的方式,然后从中学到些什么。
现在就业竞争环境相当激烈,自己没点本事,还真的没法拿捏住各种奇葩的面试官,面试官最喜欢问的问题就是:你读过哪些开源库的源代码呢?
他们在问这个问题的时候,在考验你技术水平的同时,也在看,你是否有自主学习的动力,是否能阅读一个体系完善的结构性的代码,是否能理解并转化成自己的知识并使用。
那么,阅读开源代码就尤其重要,无论是拿来充实自己,还是拿来震慑(bushi)面试官,都是一把利器。
我们读源码时,最主要的基本方向是这三个:
- 它解决了什么问题
- 针对特定的问题,它是如何解决的
- 它有哪些闪光点是值得我们学习的
简单讲一下这三个方向。
1. 这个库解决了什么问题
显页易见,每个轮子被制造出来,就是为了解决某个问题,我们需要知道的,就是这个库主要解决了什么问题,顺带解决了什么问题,如此一来,就可以带着疑问去读代码。
拿 Glide 这个著名的图片加载库来举个例子。
Glide 主要解决了什么问题?
从 Glide 的官方文档来看,它是一个快速、高效的图片加载库,并且提供了简洁易用的 API 供开发者调用。在保证性能的同时,还提供了高拓展性的图片解码管道(decode pipeline)。它甚至可以拉取和解码视频的缩略图,展示 GIF 图片,并支持网络请求拦截器。如果你喜欢,你甚至可以将它的网络请求部分替换成 Volley 或者 OkHttp。
Glide 的主要目标在于让列表中的图片滑动起来不卡顿,但它也同时能帮你解决图片加载时的其他问题,比如本地图片加载、远程拉取加载、裁剪等等。
可以看到,这个阶段的内容主要来自于库的官方文档。
Glide 是如何实现它的主要目标的?
我们知道,开发时的大部分时间,图片加载都可以使用 imageView.setImageResource(resId)
或者 imageView.setImageBitmap(bitmap)
来搞定,那 Glide 究竟做了些什么,来替代这两句代码呢?
通过读源码,我相信我们一定能找到这个问题的答案。此处不赘述,后面会有详细的文章。
Glide 是如何实现它的次要目标的?
先不提本地图片加载,远程图片加载其实令我们很头痛,图片下载、图片保存、图片缓存、大小适配、错误重试、断点续传。。。每一个都是我们需要考虑的问题。
那么在保证性能的前提下,Glide 是如何解决这些次要的问题的呢?
还是要通过阅读源代码,来找到这个问题的答案。此处亦不赘述,后面会有详细的文章。
2. 针对上述几个问题的方式,它的解决方式是什么。
主要问题是,解决列表图片滑动不卡顿的问题,在读源码的过程中,我们可以轻易地发现 RequestBuilder
、RequestManager
这样的管理模块,将所有图片的加载变为一个个的请求,进行调度与管理,从而让每一次图片的加载与展示变得有序且高效。
次要问题我们举其中一个例子——缓存。Glide 使用了四级缓存来完成缓存功能,活动资源(Active Resources)、内存缓存(Memory Cache)、资源缓存(Resource)、数据文件缓存(Data)。每增加一级缓存,都会让加载图片的速度有一个保障,同样地,也必须要设计好代码的架构,否则有可能会弄巧成拙。
3. Glide 源码中有什么闪光点值得我们学习吗?
有,当然有。Glide 运用了大量的工厂模式及Builder模式,是我们平时可能不太会用到,但是用起来就会事半功倍的一些开发技巧。
通过上面的三个大问题,基本就可以将源码拆解并读明白。
在读源码时,我们不要急于纠结各种细节,可以以先整体后局部的思路去读,太过纠结细节反面会阻挡你的脚步,也许在读到某个地方的时候,你突然就能明白刚才的某个困扰你的点是怎么搞定的了。
那么,我们《透读源码》系列的开山之作,就由此拉开序幕,大家鼓掌!!
最后附上《透读源码》系列的目录,方便快速查看。
return 0;