有意义的命名

作者: b64c74899092 | 来源:发表于2016-05-18 21:47 被阅读147次

有意义的命名

我们给变量,函数,参数,类和封包命名,我们给源代码及源代码所在目录命名,既然有这么多命名要做,不妨做好它。下面列出了取个好名字的几条简单规则。


名副其实

变量含糊或者类的名称应该告诉别人:它为什么存在,做什么事,该这么用。如果名称需要注释来补充,那就不是名副其实,下面有几个例子:

int d;//消逝的时间以日来计算。

名称d什么也没有说明,它没有说明对时间消逝的感觉,更别说以日计算了,我们应该使用更加清晰明确的名称:

int elapsedTimeInDay;

再来看看下面的代码:

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

上面的代码没有复杂的表达式,空格和缩进也是按照格式,用到的变量也很少,没有涉及多态或者继承等复杂情况,但是依然难以了解代码要做什么。

问题不在于代码的简洁度,而在于代码过于模糊,即上下文在代码中未被明确体现。

假如上面的代码实际是:我们在开发一种扫雷游戏,我们发现,盘面是名为theList的矩阵,那就可以改名为gameBoard,矩阵的数字代表着一种状态,状态值为4代表“已标记”,那么代码可以修改为下面的样子:

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

代码依然很简洁,而且变得明确了很多。只是简单改一下名称就能轻易的知道发生了什么,这就是命名的作用。


避免误导

程序员必须避免留下掩盖代码本意的错误线索。应当避免使用与本意相悖的词。例如:hp,aix,sco都不应该用作变量名,因为它们都是unix或者类unix平台的专有名词。

别用accountList来指一组账号,除非它真的是List类型。List一词对程序员来说有特殊的意义。如果存放账号的容器并非真实个List,就会引起错的判断。所以用accountGroup或者accounts都可以。

提防使用不同之处较小的名称。比如XYZControllerForEfficientHandlingOfStrings和XYZControllerForEffcientStorageOfStrings,区别这两个词都会花费大量精力。。

以同样的方式拼写出同样的概念才是信息。拼写前后不一致就是误导。我们很享受现代编程环境的代码自动补全。假如相似的名称依字母顺序放在一起,且差异明显,那就会相当有益。

误导性名称真正可怕的例子,使用小写字母I和小写字母O作为变量名,尤其是组合使用的时候。当然,问题在于它们看起来完全很像“0”和“1”。


做有意义的区分

如果程序员只是为了满足编译器或者解释器的需要而写代码,就会产生麻烦。例如,因为同一作用范围内两样不同的东西不能重名,你可能随手改掉一个名称。有时干脆以错误的拼写充数,结果就是出现在更正拼写错误后导致编译器出错。

以数字系列命名(a1,a2,...)是依义命名的对立面,这样的名称纯属误导,完全没有提供正确的信息,没有提供作者意图的线索。

废话是另一种无意义的区分。假如你有一个ProductData类还有一个ProductInfo类,它们名称虽然不同但是意思却无区别。注意,只要体现出有意义的区分,例如a前缀用在域内变量,而把the用于函数参数,是可以接受的。废话都是冗余。比如NameString,Name已经是一个string型没有必要再加说明。

要区分名称,就要以读者能鉴别不同之处的方式来区分。


使用读得出来的名称

有时你会把某个很长的名称用首字母或者你习惯的缩写来简写,这样的名称最好是能够容易发音的。(英语好的注意。。)


使用可搜索的名称

单个字母名称和数字常量有个问题,就是很难再一大篇文字中找出来。
单字母名称最好只用于短方法中的本地变量。名称长短应该与作用域大小相对应。若常量或者变量可能在代码中多出使用,则应赋予便于搜索的名称

相关文章

  • Clean Code Notes(代码规范)

    [TOC] Clean Code Notes 1_命名 1.1_命名要点 有意义的命名 有意义的区分 有意义命名部...

  • java编码规范(更新中)

    编码规范 命名规范 任何包名、类名、方法名、属性等都要使用有意义的单词,有意义的命名;命名不在于长,而在于解释 包...

  • 有意义的命名

    前言 在开发过程中,给变量以及方法提供一个有意义的命名至关重要。有意义的命名对代码可读性的提升有很大帮助。一个项目...

  • 有意义的命名

    名副其实 变量名应该告诉你:他为什么会存在,他做什么事,他应该怎么用 如果名称需要注释来补充,那就不算名副其实 p...

  • 有意义的命名

    在编程过程中,命名随处可见。我们在编程过程中,应使命名名副其实。这件事很重要也很严肃,选个好的名字要花很多时间,但...

  • 有意义的命名

    当发现更合理的命名时,可以随时替换。 变量、函数和类要依义命名,好的命名可以不用补充注释就知道其用途。好命名能有效...

  • 有意义的命名

    有意义的命名 我们给变量,函数,参数,类和封包命名,我们给源代码及源代码所在目录命名,既然有这么多命名要做,不妨做...

  • 有意义的命名

    名副其实 对于变量、函数或类的名称应该已经回答了如下几个问题,它为什么存在、它做什么事、应该怎么用,无需注释即可明...

  • 有意义的命名

    关于命名 开发过程中的命名无处不在:变量,函数,参数,类和包 命名技巧 名副其实 选个好名字要花时间,但省下来的时...

  • 有意义的命名

    变量、函数和类的名称应该已经答复了所有的大问题。它告诉你,它为什么存在,它会做什么事,应该怎么用。如果名称需要注释...

网友评论

  • Neulana:貌似是《代码整洁之道》这本书里的内容
    b64c74899092:@加速度猫 是这本书删去了些废话……

本文标题:有意义的命名

本文链接:https://www.haomeiwen.com/subject/zoiwrttx.html