代码重构神秘命名

网友投稿 787 2022-05-30

我们开始学习写代码的时候,肯定学到过,代码中的命名,不能乱取名字,比如表示时间的变量,就取个t作为时间的名字,当然,这样的命名方式很极端,大多数人都不会犯这样的错误,但是,命名不规范的问题,在我们的项目代码中,是经常发生的。如何去分析不规范的命名,并去重构不规范的命名方式,这就是接下来要讨论的问题。

一、神秘命名

1.1 定义

什么是神秘命名,在阅读代码时,一些会影响我们阅读体验的命名(不知道什么意思的命名),叫做神秘命名。

1.2 影响

代码重构之神秘命名

为了读懂这段代码,你需要画大把的时间去"猜测"这段代码的意思,严重影响可读性

如果代码难以命名,其背后可能潜藏更多的设计问题。

不规范的命名,容易在后续开发中,因为误解产生bug。

1.3 神秘命名改进目标

重构的目标就是让代码直观明了,让函数、模块、变量和类命名能清晰地表明自己的功能和用法。

二、神秘代码案例

2.1 不规范的代码

下面是一段命名不规范的代码,看看有什么问题

完整代码如下:

public class MysteriousExample { public int amont(Perf perf, Type type) { switch (type) { case TYPE1: return resfortype1(perf); case TYPE2: return resfortype2(perf); default: throw new IllegalArgumentException("Illegal type : " + type); } } private int resfortype1(Perf perf) { int s = 40000; if (perf.getAud() > 30) { s += 1000 * (perf.getAud() - 30); } return s; } private int resfortype2(Perf perf) { int s = 30000; if (perf.getAud() > 20) { s += 1000 + 500 * (perf.getAud() - 20); } return s; } } class Perf { private final int aud; public Perf(int aud) { this.aud = aud; } int getAud() { return aud; } } enum Type { TYPE1, TYPE2, UNKNOWN }

看出代码有如下问题:

1、这段代码想计算一个数字,但方法名拼写错误,而且命名没有按照动词+名称的形式;

2、函数的参数,Perf使用了缩写,这里使用缩写是不恰当的,因为这个单词有歧义。

3、方法根据枚举值执行不同的方法,但枚举值的命名用TYPE1和TYPE2,这显然是不恰当的。

4、下面两个具体做处理的方法,命名不规范;

5、perf.getAud,难以理解Aud是什么意思;

6、方法内,变量s,虽然方法体内代码很少,但也不应该使用这样的单字符命名。

2.2 实际意义:

看不懂这段代码,于是通过查阅相关的技术文档,重要知道这段代码的需求,如下:

看到这需求后,代码方法就很容易看懂了,但是如果后续开发人员着手这段代码,难道还需要去查文档吗?这将非常浪费时间,于是,让我们着手重构这段代码。

2.3 修改建议

方法名字使用动词+名词的形式

变量名使用名词

避免拼写错误

方法、变量、枚举等等,都使用有具体含义的单词,不用使用含义模糊的词

避免随意的单词简写

三、使用IDEA开发工具去重构

我们应该如何去重构,直接一个变量一个变量去改的话,因为方法、类直接有相互调用关系,往往你改一处,所有使用这个变量的地方,都需要你手动去修改,在引用非常多的情况下,工作量将会非常大。

好在为了解决这个问题,IDEA内置了重命名的重构功能。

IDEA重构快捷键:shift+f6

3.1修改方法名

3.2、重构类名

在修改类名时,IDEA会提示你,是否连同类名定义的变量名一同修改为小写形式,

比如之前是Perf per,在Perf修改为Performance后,是否把Performance perf修改成Performance performance.

3.3、使用IDE重构变量

3.4、使用鼠标进行重构

一般推荐使用快捷键的方式进行重构,但有时候快捷键可能被占用导致无法使用,下面介绍一下使用鼠标点击进行重构使用方法:右键---->Refactor-------->Rename

3.5 重构后的代码

具体重构代码如下:

public class RenamedExample { public int calculateAmount(Performance performance, PlayType playType) { switch (playType) { case TRAGEDY: return calculateTragedyAmount(performance); case COMEDY: return calculateComedyAmount(performance); default: throw new IllegalArgumentException("Illegal type : " + playType); } } private int calculateTragedyAmount(Performance performance) { int totalAmount = 40000; if (performance.getAudienceNum() > 30) { totalAmount += 1000 * (performance.getAudienceNum() - 30); } return totalAmount; } private int calculateComedyAmount(Performance performance) { int totalAmount = 30000; if(performance.getAudienceNum() > 20){ totalAmount += 1000 + 500 * (performance.getAudienceNum() - 20); } return totalAmount; } } /** * 剧种枚举 * */ public enum PlayType { TRAGEDY, COMEDY, UNKNOWN } /** * 演出信息 * */ public class Performance { private final int audienceNum; public Performance(int audienceNum) { this.audienceNum = audienceNum; } int getAudienceNum() { return audienceNum; } }

IDE

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java.util.Random和concurrent.ThreadLocalRandom对比
下一篇:我的 Serverless 实战 — 保姆级带你部署云函数
相关文章