作为程序员,如何写出高质量可维护的代码,是一个老生常谈的话题,初级程序员可能是只要完成任务就行了,但当我们逐渐成为中高级程序员的时候,我们要考虑就不单单只是完成任务就行了,而更加要关注如果写出优雅可维护的代码,并且要保证系统的设计更加的合理。
任何一门语言都有其自己的特性,Java 也不例外,另外除了语言的自身特性以外,业内也是有一份通用的规范,在国内大家遵循的 Java 规范,自然是阿里前几年出的《阿里巴巴 Java 开发手册(泰山版)》,这份手册值得每个 Java 程序员熟读百遍,文末也给大家附上了获取指南,需要的自取。
魔数(Magic Numbers)是指直接使用某个看似随机的数字,没有任何解释的数字。它们会使得代码难于理解和维护。应该使用有意义的变量或常量来替代这些数字。
// 不好的做法
double calculateArea() {
return 3.14 * radius * radius;
}
// 好的做法
static final double PI = 3.14;
double calculateArea() {
return PI * radius * radius;
}
相信大家在日常开发中,经常会使用到很多魔数,而且有时候还会在不同的文件和项目中使用到同一个魔数,强烈建议这种魔数采用常量或者配置的形式来进行处理,不然后期如果要发生变更,将会是一个痛苦的过程。
而且根据 1 中提到的《阿里巴巴 Java 开发手册》中也提到了,关于常量我们也要尽量按照功能进行分类,不能使用一个大而全的类来维护所有的常量。
所谓编写可测试的代码,意思是说让我们多写单元测试。
不过说实话,这个道理虽然大家都知道,但是大家都很难执行,不过为了使代码易于维护,我们还是需要确保它可以正常运行,而不会引入任何错误。
所以编写单元测试就是一种很好的方式,因为它为我们的代码提供了一个安全网,确保在修改代码时不会打破任何东西。
除了编写单元测试之外,我们还可以善用一些插件和工具,特别是在当下 AI 加持的时代,我们可以让 AI 来帮我们生成单元测试代码,这就又回到了我们昨天的文章,提到的 Github Copilot
了,它就可以帮我们一键生成单元测试,如下所示。
同样的在《阿里巴巴 Java 开发手册》中也描述了关于单元测试的部分,我们也需要遵守这些规则。
另外为了写出可维护的代码,我们就要适当的降低代码的复杂度,尽可能地将复杂的问题简单化。
这一点往往也是最难的一点,因为如何将复杂的问题简单化是需要经验的,要将复杂的问题进行抽象,再结合适当的设计模式才能是代码更加的优雅。
我们要明白一个道理,代码写出来是给人看的,所以我们要写出人能看懂的代码,我见过很多在写代码的时候有很多风骚的写法,纯粹是为了炫技,毫无实用价值,还增加了阅读成本,这样的行为是不可取的。
此外我们写代码的时候,函数不应该超过20行,类不应该超过1000行。在方法内避免过度嵌套,如果一个方法需要嵌套太多层,那么应该将代码分解成多个方法。
当代码无法自我解释的时候,适当添加注释是个好主意。
注释应该解释为什么需要这样写代码或者某个代码的背后含义,而不能仅仅是重复代码的行为。另一方面,为代码编写良好的文档,包括 Javadoc 注释、README 文件和 wiki 页面,会使得新同事或者别人更容易接手。
在做一些项目或者系统设计的时候,适当的设计文档也是必须的,包括系统涉及的上下游,以及系统关联的一些组件和中间件,以及底层存储模型的设计和是否有缓存等说明。
内部的设计文档不求面面俱到,但也要把关键点都写到,方便日后的查看和维护。
利用 Git 等版本控制工具可以记录代码的历史,并提供回滚错误更改的能力,这是确保代码易于维护的重要一步。
这一点相信现在大家都是这么做的,毕竟 Git 的版本控制,还是很基础的组件,如果谁还没有用起来,那只能说太 out 了,除了代码,其实我们的文档也是可以用 Git 版本控制管理起来的,这个就不多说了。
以上是一些关于如何编写可维护 Java 代码的建议,我们在日常开发中要学会灵活运用。
另外要记住,编程不仅仅是一门科学,也是一种艺术。
在追求代码完美的过程中,我们会学习到更多新的知识,也会找到更多的乐趣。