稀有猿诉

十年磨一剑,历炼出锋芒,说话千百句,不如码二行。

如何有效的减少重复的代码

重复的代码一直都是可维护性的大敌,重构的重要任务之一也就是要去除掉重复的代码,有效的减少重复代码,可以大大提高软件的扩展性。

在Android开发中,很容易产生重复的代码。因为Android是组件,模板式开发,每个页面都是独立用Activity或Fragment实现,布局文件都是用XML方式去写,所以很容易造成代码的重复,虽然二个页长的差不多,但毕竟是二个Activity,于是就拷一份出来,改吧改吧就成了。

那么我们如何做才能去掉重复的代码呢?

为你的项目定义一个基Activity或Fragment

无论你的项目大或小,定义一个基Activity或Fragment总是有好处的。随着项目的发展,会有大量的公共代码可以抽出来放到基类里去。或者在基类里面做一些项目特色的事情。再或者添加一些统计,崩溃反馈等等。在一个基类里面改动总比把每个Activity或Fragment里面都改一遍要好的多。

代码的去重复技巧

从代码上去除重复的代码就是用通用的重构技巧,比如提炼方法,抽象基类,提炼常量等。但是光是代码还不够,因为Android的页面代码跟布局文件的关联非常大,通常Activity或者Fragment都是为了操作布局页写的,所以要想彻底的减少代码的重复,还必须先减少布局的重复。

include减少局部布局的重复

标签是减少布局重复的利器,它的作用是把另外一个布局文件全部无修改式的嵌入到标签所在的位置。这与C/C++语言的预处理指令#include是一样的。在WEB框架式开发中,也非常常用HTML模板,其中也有类似的include。目的也是减少代码的重复。

要想把include用的恰到好处,首先要做的就是把整体布局模块化,从整体的布局出发,找出可复用的局部布局或布局组合,把它们放入单独一个布局文件中,然后在其他的地方就可以include了。

ViewStub减少整体的布局的重复

前面是找出布局中的可复用布局组合,include以减少重复。但有些时候是反过来的,也就是说有几个页面,它们整体的一样的,但是某个局部是不同的,这个时候include就不行了。这个时候就可以使用一样的整体布局+ViewStub来做布局。

ViewStub是一个轻量级别的,不可见的View,当ViewStub被设为visible时,或者显示调用layout()时,才会去把它所指向的布局渲染出来,所以它非常适合处理整体相同,局部不同的情况。关于ViewStub的使用可以参考这篇博客。 具体的策略是:

  • 规划整体布局,抽象出共同的布局,把可变的布局识别出来
  • 写整体布局,对于可变的局部布局用ViewStub替代
  • 用一个基Fragment来操作整体布局。
  • 创建基Fragment的子类,每个子类,用真正的布局来替换ViewStub。

多用引用而不是写死

这点是非常重要的,Android的强大之处在于,所有的资源的指定都可以用引用,而非直接写死,直接写死就会出现重复代码,比如颜色,背影,字串,布局,ID,度量(dimen),风格等等。那么,我们在使用的时候,也尽可能的使用引用,这样非常易于复用,修改和定制,从而也就更方便复用。

分析,分离变与不变

其实代码的去重复的关键都在于要分析出可变与不可变,共性和特性,这是抽象与封装的基础。这个没有直接可操作性的建议,只能靠自己平时多多积累,以及遇到问题时多多思考。

另外,就是对于重复的定义是达到三次及三次以上。如果仅出现二次,并且,无可能出现别一次,这个时候其时,要不要去重复有在商榷,写第二次时,花时间重构,与拷贝或重新实现,其实代码差不多。当发现第三次实现某个东西时,就要考虑好好的重构一下,减少重复。

还有,就是,在项目开始不要考虑的太多,不要过度设计。孤认为,不过过度设计,更不要过早优化,就根据需求和进度和发展状况综合来看。当出现了重复,需要重构时就立马去做,这样就不会出问题。但如果没能及时去做重构,欠了债,那么由于涉及代码,功能和模块都比较多时,再去重构,难度大,风险也大。就好比房屋的维护保养,当出现灰尘时就去打扫,很容易,个把小时就搞定了,但如果一直拖着,一年才打扫一次,可能要十天半个月才能完事。

Comments