1 前言
在实际的学习和工作(我没工作过)中,总是避免不了把自己的代码给别人阅读以及回顾自己以前的代码,或者是对现有项目进行升级。这时候就需要有一个良好的规范来约束自己的代码,以得到更好的可维护性。
本文内容学习自:《Building Maintainable Software, Java Edition》详情见末尾参考文献
2 不写重复代码
重复代码的概念很容易理解,就是相同内容的代码。但是我们在这里把重复的代码的标准定义为最少连续6行重复,又把重复分成两类:
- 几行代码完全相同,为第一类。这一类代码的重复是连带方法定义等代码单元的边界都算在里面的。
- 仅有字面值和标识符名字、注释的辅助不同,其他语法及结构完全相同的为第二类。
我们这里讨论的是第一类重复代码。
想像一下:
- 当你发现某处代码有个错误需要修改或者有些改动,好,你做完了这个工作却忘了你其他地方有一部分代码当初是直接复制的这里的。所以这次升级失败了…
- 你会发现,大量重复代码增加了代码总长度,然后更加地难以分析..
- …很多种情况
所以你不应该写重复代码
2.1 原则
不要复制代码,重复代码不能超过6行
2.2 普通提取方法
按照前面几篇的内容,可以使用提取方法来解决这个问题,把重复的代码提取为一个新的方法,然后在原有位置调用即可。这是在同一个类中可以使用,如果不同的类之间有重复代码,那么你可能需要一个工具类来存放新的方法,这样所有类都可以进行调用。
2.3 提取父类的方法
上面的第一种方法有一个问题,那就是当提取的方法变多了以后,那个工具类会变成一个大杂烩,巨大而繁杂,这也是代码里的不好的情况,那么这个提取父类就可以解决这个问题。
这里假设我们有一个支票账户类CheckingAccount和一个储蓄账户类SavingAccount,他们中都有一个转账Transfer方法,而且这个两个类的方法中包含有一段相似的进行账户校验的代码。这时我们就可以使用提取父类的方法。
首先提取一个父类账户Account类,并在其中定义Transfer方法,两个子类继承这个Account类,然后重构其Transfer进行一些自己独有的处理,然后在调用父类的Transfer方法
super.Transfer(...)
经过这样的处理,这部分代码的可维护性就变得高多了。
参考文献
[1] Visser J, Rigal S, Eck P V, et al. Building Maintainable Software, Java Edition: Ten Guidelines for Future-Proof Code[M]. O’Reilly Media, Inc. 2016.