如何写出优雅的代码

引言

最近在写模拟器的代码,现在需要对整体的架构都进行一个大更改,而当我回过头去看时发现好多代码都写得很丑,越写越像屎山代码,需要对整体进行一轮迭代,故而正好趁此机会来学习一下如何写一个优雅的代码。写之前看了很多博客,这里记录一下对自己比较有启发的点。

什么是优雅的代码

这一个衡量标准很直接:WTF min

优雅的代码

代码最后还是需要给人读的,需要认识到:

任何一个傻瓜都能写出计算机可以理解的代码。唯有写出人类容易理解的代码,才是优秀的程序员。—— Martin Fowler

好的代码最重要的特点:整洁

整洁的代码如同优美的散文。—— Grady Booch

如何保证代码整洁

1. 有意义的命名

命名要尽可能地输出多的信息,让人能快速理解这个类、变量或者函数的含义、功能。花时间来取名是值得的

1
2
3
4
/**
* 创建后的天数
**/
int d;
1
int daysSinceCreation;

后一种命名就能够更加凸显变量的含义了。

命名是越短越好的,但是为了能够清晰表达意思,取长名字也是值得的。

尽量不要取相似的名字以让人困惑。

2. 优雅的注释

一份优雅的代码本身就应该具有足够的表达力,不需要注释就能看懂。注释的存在往往是弥补我们无法用代码清晰表达意图的情况。当发现自己需要对某处的代码写注释时就需要考虑是不是应该用更好的代码对其进行替代了。

好代码>>坏代码+注释

注释应该只需要注重解释上层的东西,包括设计的意图、功能,而不需要解释执行的细节,这由代码来进行展示。

注释不要去写能由git记录的信息。

3. 简洁的函数

控制函数的长度,一般不要长于一个屏幕的大小,也就是控制在30行以内

if语句、else语句、while语句等,其中的代码应该只有一行,该行通常是一个调用语句,这样不但能保持短小,还可以给调用方法命名一个有说明性的名字,进一步增加代码的可读性

函数的功能要单一,具有原子性,以方便函数复用。最简单的规则就是看看该方法是否能在拆出一个方法,且拆出去的方法是不同于该方法的诠释和实现。

需要保证函数中的抽象层级一致。

不要返回null或者特殊对象等,不要传入null。

函数参数不要超过3个,如果超过就需要考虑将其抽象为类。

4. 整齐的代码结构

一个文件的代码数量需要控制在200行以内,最多不要超过500行。

关系紧密的代码放在一起

  • 变量声明放在其使用的位置
  • 函数的调用者要放在被调用者上面,以从上到下展示调用依赖顺序

对象暴露行为,隐藏数据,调用对象时不应该了解该对象的内部情况。

一组代码代表一个完整的思路,不同组的代码中间要用空行间隔。

5. 重构代码

好代码不是一蹴而就的,重构代码是必要的。

重复的代码肯定是可以抽象出一个上层函数的。

  • 都同一个类中就考虑将其提炼出一个函数
  • 不在同一个类中,就需要考虑创建一个共享的地方,可以是一个工具类,以便多个类都可以使用它
  • 只是相似的话,可以重拍顺序,将相同的部分提料出来

过长的函数可以通过提取函数的方式来缩短。

如果一个类不是单一职责的,则可能会导致一旦其变化就需要修改多个其他类,或者不同类的变化都需要修改这个类,这时就需要考虑对其重构,划定职责。

有时候会发现三四个相同的字段,在多个类和函数中均出现,这时候说明有必要给这一组字段建立一个类,将其封装起来。

以查询代替临时变量,也就是对于复杂的赋值表达式,使用函数来进行替代。

对于复杂过长的函数,可能将其转化为一个类进行重构。

小结

写一份优雅的代码远比写一份能跑的代码难,但是这是值得的。想如何写代码远比写代码来得更加重要,写代码时的角度需要变化,不要以自己的角度去看自己写的代码,而是要以一个代码阅读者的角度来审视自己的代码。

参考文档


如何写出优雅的代码
http://example.com/2023/11/09/如何写出优雅的代码/
作者
John Doe
发布于
2023年11月9日
许可协议