风行的博客

代码重构

代码重构 - 重构就是在不改变软件系统外部行为的前提下,改善它的内部结构。

Martin Flower 在《重构》中有一句经典的话:"任何一个傻瓜都能写出计算机可以理解的程序,只有写出人类容易理解的程序才是优秀的程序员。"

重构原则

随着时间推移,需求的频繁变化等原因都会导致代码质量逐步下降,所以持续重构就变得越来越重要,并且重构对开发人员技术水平及经验的要求会更高一些,下面列出几条重构原则:

  • 要充分理解旧代码后再进行修改,模块之间过度耦合导致牵一发而动全身,不易控制影响范围,有时代码摆放顺序的修改都会造成问题

  • 优先重构经常修改的部分,如果代码一两年都没有修改过,那么说明改动的收益很小

  • 重构可能需要很长时间,主要取决于团队对于风险的容忍程度

  • 删除无用代码是提高代码可维护性最有效的方式

  • 小范围重构,当重构后会导致大量测试工作时,需要谨慎决定是否有必要重构

  • 要构建可扩展系统,我们需要认同错误的不可避免性,有时候避免这些错误会带来高昂的成本,因此我们不妨将注意力集中在对问题的快速检测以及出现后的应对措施上


哪种代码需要重构

  • 臃肿的类:一个类应该只做一件事,可通过一些设计模式去拆分

  • 长方法:方法应尽量短小,专注一个功能点,并且要放在合适的类里

  • 重复代码:往往由于开发人员对框架不熟悉,也有个别不讲究的情况

  • 方法有多个参数:可通过提取成类对象或字典解决,个别情况也可拆分方法

  • 魔鬼数字:尽量用常量去定义数字,或在使用处添加注释说明用意

  • 模糊的命名:要做到见名知意

  • if/else 嵌套过多:尽量不超过3层,如果不能简化逻辑,可通过拆分方法或添加注释方式解决


Xcode 提供的重构功能

跟别的开发工具相比 Xcode 提供的重构功能简直弱暴了,不过有总比没有好,Xcode 提供了以下几个重构功能,从菜单栏中进入:Edit -> Refactor,或在代码上右键,然后选择 Refactor

  • Rename:重命名类、方法、变量
  • Extract:将方法中的一段代码抽取为一个独立的方法
  • Create Superclass:给当前选中的类创建父类
  • Move Up:将选中方法或属性移到父类中
  • Move Down:将父类中选中的属性移到子类中
  • Encapsulate:封装,生成 setter/getter,一般用不上

相对来说,Rename 更常用一些,有时也会用到 Extract,最后吐槽一下

  • Extract:使用时 Xcode 经常崩掉
  • Rename:并不能保证全部覆盖到,还需要自己再次检查


代码 Review

重构的目的是保证代码质量,但是代码质量不能仅仅依靠重构,重构更多时候是一种补救措施,更多时候还是需要我们在写代码时讲究一些,适当的有一些代码洁癖,也需要通过持续的代码 Review 保证代码质量,在 Review 上需要注意:

  • 要有一个 CheckList,对一些代码问题进行定义,要求开发人员以此为准写代码

  • review 代码不应只是代码规范层级上的检查,这些应该是各开发人员必须做好的事情

  • review 别人代码时不要直接修改不规范的代码,可以用 #warning … 标注有问题的代码,review 的目的不仅是要保证代码质量,提高团队开发人员技术水平也是一个重要目的

  • review 时需要对代码逻辑及性能上的问题进行检查

  • 对方改完代码后要进行验证