代码整洁之道第二章:有意义的命名

一、命名的意义

命名,一个随处可见的操作,就像你有一个名字,我也有一个名字一样,看见马,你就能知道是指在草原驰骋的俊秀,看到猫,你就能想到是那个在家等你回去撸的小可爱,在项目中,从项目的创建到函数的实现,每一步都一命名为起点,我们需要给变量、函数、参数、类和封装包命名,这些名字出现在代码的每个角落,随处可见,名字就好像项目的指路牌,也是项目的第一道门面,如果整个项目始终贯穿着一个好的命名规范,就能给阅读者一个神清气爽的开始,也能给阅读者一个好的指引

二、命名规范

1. 名符其实

无论是变量、函数、或者类,在看到他名称的时候应该以及答复了所有的大问题,它应该告诉你,它为什么会存在,他做什么事,应该怎么做。如果在看到名称时,还需要去查找注释来确认自己的理解,那就不算名副其实。而且在发现有更好的命名时,记得果断替换。

如下为扫雷游戏的一个函数片段,只是通过修改命名,你就可以通过这些仅有的代码推断出更多的函数信息

修改前:

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

修改后:

    public List<int[]> getFlaggedCells() {
        List<int[]> flaggedCells = new ArrayList<int[]>();
        for (int[] cell : gameBoard) {
            if (cell[START_VALUE] == FLAGGED) {
                flaggedCells.add(CELL);
            }
        }
        return list1;
    }

2.避免误导

避免使用和本地相悖的词,例如一组账号用accountList来指称,但它却是一个数组,这个时候如果用accountGroup或者bunchOfAccount甚至直接用accounts都会好一点。提防使用不同之处较小的名称,比如XYZControllerForEfficientHandlingOfString和另一处的XYZControllerForEfficientStorageOfString,当你去找其中一个类的时候,会话更多的时间来辨别

3.做有意义的区分

如果单纯只是为了区分两个名称不能一样,就使用就使用诸如数字,字母来做区分的话,那似乎是毫无意义的区分比如

    public static void copyChars(char[] al, char[] a2){
        for (int i = 0; i < al.length; i++) {
            a2[i] = al[i];
        }
    }

如果将a1改为resource,a2改为destination就会好很多

4.使用读的出来的名称

使用读的出来的名称,而不是自造词,这会给你无论是记忆,还是讨论时需要说明是哪个方法时,都能带来便利,例如

    private Date genymdhms;//反例
    
    private Date generationTimestamp;//正例

5.使用可搜索的名称

在idea或者elipse中,当你要搜索某个关键字时,如果你的关键字是 数字或者字母时 ,似乎会有更多扰乱你的选项,比如数字7,他有可能是某些文件名或者产量。

6.成员前缀

使用职责更小的类或者方法来区分职责,而不是在一个类中使用前缀来做领域的区分,因为人们在读代码过程中,读的越多越容易无视前缀。

public class AdBoxAdOperateFacadeImpl {
    
    private CabinetCenterOrderService ad_cabinetCenterOrderService;
    
    private CabinetCenterOrderService dsp_cabinetCenterOrderService;
}

改为:

public class AdBoxAdOperateFacadeImpl{
    
    private CabinetCenterOrderService cabinetCenterOrderService;
}

public class DspBoxAdOperateFacadeImpl{
    
    private CabinetCenterOrderService cabinetCenterOrderService;
    
}

7.接口和实现

不要使用前导字母I来标记接口,因为你没必要告诉用户这是一个接口,也就是这个I属于多余的信息表达,你只需要告诉别人可以用,怎么用就可以了,别人也并不关心它是否是接口或者还是其他。

8.避免思维映射

不应当让读者在脑中把你的名称含义为他们熟知的名称,这种问题经常出现在选择使用问题领域术语还是解决方案领域术语时,例如用r代表不包含主机名和图式的小写字母url

9.类名

类名不要使用动词,应该是名词或者名称短语

10.方法名

方法名应该是动词或者动词短语

11.每个概念对应一个词

给每个抽象概念选一个词,并且一以贯之

12.别用双关语

避免将同一档次用于不同的目的

13添加有意义的语境

用良好命名的类、函数或命名空间来放置名称,给读者提供语境,如果没有这么做,可以考虑添加前缀或者后缀,例如表示地址的相关变量,如 streer、houseNumber、state,如果你把他们放到address类中,很容易理解他们代表地址,但是当单独把state放在一个地方的时候就没那么明显了,这时候,state就可以改为addrState。当然也不要加上多余的语境,比如你已经将他们放到了address类中,似乎就没有必要用addrStreer、addrState来命名了。

总结:

看完这章,感觉自己在这方面做得还不错,基本上能做到见文知意,但是有时候由于项目压力,又会存在部分细节被有意忽视,比如私有方法的参数命名。但是有时候感觉取一个合适的名字真的伤脑筋。。。。

在线取名网址:https://unbug.github.io/codelf/https://unbug.github.io/codelf/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值