重构:给“娃”起个好名字吧

回想一下,我们平时写代码过程中,做得最多一件事是什么?创建一个类,我们要给类起一个名字;创建一个方法,我们要给方法起一个名字;创建一个变量,我们要给变量起一个名字。可想而知,我们无时无刻都在命名,所以我们重构的第一招就是给“娃”起个好名字。

但是也有人会问了:不好、一般或者好的命名对代码编译、运行并没有影响,为什么要花把时间浪费在这个无意义的事上。话虽如此,但实际上一个好的命名是整洁编程的核心。写出来的代码在大部分的情况下,是给人看的,我们应该追求写出人能够读懂而不是仅机器能够读懂的代码。在我还没有太多编程经验时,我对写出漂亮代码往往有心无力,因为我不知道什么样的代码是漂亮的,随着经验越来越丰富,我开始学习各种技巧。其中的一个技巧就是给任何需要命名的地方反复斟酌,争取做到看到这个变量名就能知道这一段程序是要做什么。可能我们一时半会不能立即想出一个很好的名字,没关系,我们可以先放下等发现有更好的名字时再返回来修改。

这么说,可能也是太泛泛而谈了,下面我们举一些列子来说明。

1. 名字要做到名副其实

变量名、方法名或者类名应该能够尽可能地答复所有的大问题。通过名字,我们就能知道它为什么会存在,它做什么事,应该怎么用等等。如果一个名字还需要注释来补充说明,那就不算是名副其实。比如下面的这段代码:

public List<int[]> getThem() {
    List<int[]> list = new ArrayList<int[]>();
    for (int[] x : theList) {
        if (x[0] == 1) {
            list.add(x);
        }
    }
    return list;
}

上面的这段代码并没有复杂的表达式,代码也不长,甚至没有涉及任何其他类或多态方法,但是第一眼看到这个代码,谁能告诉我它在做什么?

问题不在于代码的简洁度,而是在于代码的模糊度:即上下文在代码中未被明确体现的程度。要看懂上面代码,我们至少需要了解这些问题:

(1)theList中的类型是什么?

(2)theList下标为0是什么?4又是什么含义?

(3)我们怎么使用返回的列表?

我们从代码片段中无法找到上述问题的答案,但返回来说,这些问题的答案不应该就在这里告诉给读者吗?看到这,也许你很想知道那该如何重构了。往下看:

public List<Cell> getSelectedCells() {
    List<Cell> selectedCells = new ArrayList<Cell>();
    for (Cell cell : cells) {
        if (cell.isSelected()) {
            selectedCells.add(cell);
        }
    }
    return selectedCells;
}

重构后的代码在没有任何业务背景下是不是也比重构前的代码好理解很多,即使我不再解释它要做什么,相信你们也知道这段代码大概要干嘛。而我们实际上什么都没修改,只是简单地修改了一些变量名和方法名,这就是选用好名字的力量。

2. 做有意义的区分

如果我们只是为了满足编译器而写代码,那将给团队的其他成员带来麻烦。比如以数字区分结尾,这样的名字纯属误导,因为它们没有提供任何正确信息,没有提供导向作者意图的线索。如:

public Entity convert(Entity e1, Entity e2) {
    // do something
    return e2;
}

如果我们能够将参数名字修改为source和target,那么看上去就好很多。还有在很多场景包括我自己在很多时候也没有做到很好的区分,比如我们有一个Product类和ProductInfo类,它们的名称虽然不同,但表达的意思是相同的,我们也通常称之为废话,而废话是没有意义的,是冗余的。再举个明了点的例子,比如nameString,试问一下,谁会认为nameString会比name好?难道name除了字符串,还会是一个整数类型?如果真是这样,别在误导他人了,请赶快另想一个名字。

3. 使用可搜索的名字

单字母名称和数字常量有个问题,就是很难在一整个工程中找出来。找DEFAULT_MIN_VALUE比找数字0容易多吧?找name比找n容易多吧?采用能表达意图的名称,貌似使代码看起来变长,但想想当你想要在全局中找到它时,结果搜出来一堆无相关的东西,那是多么糟糕的一种体验。

取好名字最难的地方在于需要良好的描述技巧和共有的业务背景,与其说这是一种技术问题,还不如说是一种教学问题,而结果是我们大多数人并没有学会做得更好。一个好的名字可以是整段代码的关键字,通过这些关键字我们就能将业务描述清楚,就像我们通过关键字,就能将整篇文章大意记住。

重构从取一个好名字开始,实际上我大部分在重构过去的代码,第一件事就是重新理解业务逻辑,然后看到不爽的名字直接改掉。而重构后,你对自己写过的代码会更加的自信,而这种自信仿佛是与生俱来的。

——End——
更多精彩分享,可扫码关注微信公众号哦。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值