代码重构之神秘命名

简介: 聊聊代码中关于命名的重构手段
我们开始学习写代码的时候,肯定学到过,代码中的命名,不能乱取名字,比如表示时间的变量,就取个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;
    }
}
相关文章
|
2月前
|
Java 开发者
在Java编程中,正确的命名规范不仅能提升代码的可读性和可维护性,还能有效避免命名冲突。
【10月更文挑战第13天】在Java编程中,正确的命名规范不仅能提升代码的可读性和可维护性,还能有效避免命名冲突。本文将带你深入了解Java命名规则,包括标识符的基本规则、变量和方法的命名方式、常量的命名习惯以及如何避免关键字冲突,通过实例解析,助你写出更规范、优雅的代码。
67 3
|
5月前
|
JavaScript 前端开发 Java
驼峰命名规范及其在代码可读性中的重要性
驼峰命名规范及其在代码可读性中的重要性
|
7月前
|
存储 缓存 算法
代码简洁之道:我们该如何规范代码的命名?
代码简洁之道:我们该如何规范代码的命名?
122 1
|
6月前
|
Web App开发 前端开发 定位技术
前端命名规范以及常用命名整理
这是一份关于HTML和CSS编码规范的摘要: - 文件编码统一使用UTF-8。 - 命名遵循语义化,CSS属性书写规范,推荐使用中线命名法(如`hello-world`),避免下划线和驼峰命名。 - 样式应复用,模块化,便于移植。 - 避免使用CSS Hack,优先考虑浏览器兼容性。 - 针对Firefox设计,用IE条件注释做修正。 - 使用英文命名,避免拼音,少用缩写,不以数字开头。 - 常见命名包括页面结构(如`container`、`header`)、导航(`nav`、`subnav`)、功能区域(`logo`、`search`)等,提供了一套常见的ID和Class命名约定。
|
7月前
|
算法 开发者
【CMake 设计命名思路】自定义命令命名规范与风格指南
【CMake 设计命名思路】自定义命令命名规范与风格指南
102 0
常见代码命名规范
常见代码命名规范
131 0
|
程序员 C++
代码规范:类的继承与组合
【规则 10-1-2】若在逻辑上 B 是 A 的“一种”(a kind of ),则允许 B 继承 A 的功能和属性。例如男人(Man)是人(Human)的一种,男孩(Boy)是男人的一种。那么类 Man 可以从类 Human 派生,类 Boy 可以从类 Man 派生。
34 0
|
前端开发 JavaScript
|
设计模式 前端开发 Java
项目开发-依赖倒置、里式替换、接口隔离的应用深入理解
项目开发-依赖倒置、里式替换、接口隔离的应用深入理解
129 0
|
OLAP
代码命名规范
代码命名规范
139 0