要想重构就需要先识别代码中存在的问题,然而问题有多种也分轻重缓急,所以Code Smell(代码坏味道)可以看作是应该首先动手解决的问题,因此重构过程可以抽象成如下简单的过程。
在之前的文章中介绍了常见的 22 种代码坏味道:
本本将介绍其他 3 个代码坏味道:
- 反复使用单个临时变量
- 无业务意义的临时变量
- 方法结果返回 null
- 多层条件嵌套
- 有副作用的查询方法
- 假设条件符合
01 反复使用单个临时变量
使用单个变量反复进行赋值操作。例如
int temp = level * score;
...
temp = temp * eight;
...
为什么反复使用单个临时变量是一种代码坏味道?
为单个变量在或许中多次在代码中经常见到的一种代码。这种代码的问题就在于变量所要表达的意思并不清楚,除非读完所有涉及到改变量赋值的地方,并把它们串联起来才能了解它到底是在处理什么逻辑。
这种风格的代码如果经常出现在代码中,无意在添加、修改、修复 bug 的时候都会降低代码的阅读速度,
如何解决反复使用单个临时变量这种代码坏味道?
通过非常简单的方法就可以解决上面的提到的语意化问题:为每次赋值创建一个独立的临时变量。重构后代码如下:
final int levelScore = level * score;
...
final int weightedScore = levelScore * weight;
...
将每个变量使用 final 关键字避免后续对其进行值的修改,同时为每个结算结果使用语意明确的变量名命名。
02 无业务意义的临时变量
变量作为某个业务逻辑的一部分,同时很难为变量找到合适的命名,且后续只是被使用了一次。
int tempScore = level * score + commentCount;
int score = tempScore * weight;
int finalScore = score + livenessScore;
...
为什么无业务意义的临时变量是一种代码坏味道?
- 临时变量只在函数中起作用,这非常容易导致长函数的出现。
- 过多的临时变量会导致不容易聚焦;
- 临时变量使用不当还造成函数难拆分。
如何解决无业务意义的临时变量这种代码坏味道?
如果业务中并没有相关的概念,那么就可以选择 Inline Temp(内联变量),用完整的表达时表示某个业务意义,例如
int weightedScore = (level * score + commentCount) * weight;
int score <