代码规范 : 自解释的神话

来源:互联网 发布:在日韩国人 知乎 编辑:程序博客网 时间:2024/06/15 19:21

写在前面: 好想找个女朋友,这样就可以帮我想变量名了,(玩笑脸)

多数初学者觉得,特意为代码去取一个名字没有必要.可你该明白: “代码阅读次数远远多于编写的次数, 确保名字更侧重于阅读方便而不是编写方便”
(当然,如果你认为你的程序能够满足”很好的描述了现实生活中的场景”,那么恭喜,你可以不用看着一篇文章了)


基本命名规范

计算机科学家想做的,就是将代码抽象成现实中有的事物,而命名就围绕这个想法展开.

一个好的名字不外乎: 简短, 能描述所代表的含义

  • 接口(双驼峰):
    1 对于Service 和 DAO 类 (下面有列表给出),实现类的后缀是 impl
    2 形容能力的接口 以 able 作为后缀

  • 类名(双驼峰),应该是对一个类别的描述,常常会使用名词

  • 函数(单驼峰),应该是动词,或者是动词短组(动词 + 宾语),并且描述其返回值
    例如:

  • 参数,成员变量(单驼峰): 在多个相同的类型的参数,绝对不允许出现 name1 2name 这样的对象名,最多有人是用来表示 For 4 To 2 这样的

  • 常量(全部大写):

    下划线隔开 MAX_STOCK_COUNT
    不允许出现魔法值(单独未定义的值)    例如:         String personInfo = name + " and " + age    这样是不被允许的
    不允许出现硬编码(和上面一条类似)    // 用硬编码绑定到变量上可读性差    titleBar.color = 0xFF;    // 方法一:用常量代替硬编码( 编译时绑定其值的变量)    private static final int COLOR_BLUE = 0xFF ;     ....    titleBar.color = COLOR_BLUE;    // 方法二: 用子函数,好处在于被调用时进行绑定,而且不暴露数据的来源    titleBar.color = ReadTitleBarColor();
  • 数组: 括号写在定义之前的好处:当你的定义一组变量时,名称可能会残差不齐,将括号放在前面,能够提高理解
        例如 :             String[] args;            String[] currentTimeMillis;        反例 :            String args[];            String currentTimeMillis[];
  • POJO类:强制 is放在表述 表示boolean值 的函数的开头,不能放在变量的开头
    例子:         boolean found = false;        boolean isFound(){            return found;        }    反例: is 放在变量前面的        boolean isFound = false;        boolean isFound(){            return isFound;         }   
  • 抽象类 使用 Abstract 或 Base 开头; 异常类命名使用 Exception 结尾; 测试类命名以它要测试的类的名称开始,以 Test 结尾

  • 枚举类以Enum为 后缀 枚举成员名称需要全大写,单词间用下划线隔开

  • 通用 : 提供语法环境,在归属一类名词的时候,为了帮助你知道那是一类什么东西,可以加上统一的前缀,或者后缀来帮助理解

  • 布尔值命名: done (:标记事情完成),error,found,success/ok ,等等
    有些玩家喜欢在他们的布尔变量名前加上 is,请不要这么做, if(found) 比 if(isFound) 的可读性更高,而且notFound 这样要使用否定时 变成 notNotFound 十分难以理解

    例如 FristName LastName ,如果单独出现在方法中,你很难猜测它的意思
    可以加上 前缀address 来知道语句 , addressFristName addressLastName

  • 缩写: 去掉原有名字的元音字母.
    例如 button = > btn , computer => cmptr
    个人不推荐,毕竟你遵守的缩写规则,除非对方事先知道,不然不能一眼理解命名的含义


下面是常用的命名的列表

常用的命名

对仗词 表 : ( 表述两种对立的含义)

    add/remove        increment/decrement   open/close    begin/end         insert/delete             show/hide    create/destory    lock/unlock               source/target    frist/last        min/max                   start/stop    get/put           next/previous         up/down    get/set           old/new                   init/destory

限定词命名( 限定词加到名字最后)

    数组下界 约定俗成的是  i j k      还可以用 *Index     其他的后缀         *Total   *Sum      *Average         *Record  *String  *Pointer         *Num     *Count

应该避免的命名方式

    避免在名字中使用数字 如 total1 ,total2     不要仅靠大小写来区分变量名    避免混淆的字符(1,l,I)(. ,)(2 z)(; :)(S 5)(G 6)..)
  • java中各层命名规约(来自上面的延展)
A) Service/DAO 层方法命名规约    1) 获取单个对象的方法用 get 做前缀。    2) 获取多个对象的方法用 list 做前缀。    3) 获取统计值的方法用 count 做前缀。    4) 插入的方法用 save(推荐) 或 insert 做前缀。    5) 删除的方法用 remove(推荐) 或 delete 做前缀。    6) 修改的方法用 update 做前缀。B) 领域模型命名规约    1) 数据对象: xxxDO, xxx 即为数据表名。    2) 数据传输对象: xxxDTO, xxx 为业务领域相关的名称。    3) 展示对象: xxxVO, xxx 一般为网页名称。    4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。PS: 这部分的规约很有效,能让你快速的理解冗长函数想表达的含义类型,庞大项目的层次划分

当你能够熟练运用之后, 不要拘泥于以上的命名的规则,你可以打造自己的命名库,来调整自己之前的代码


写在后面: 貌似帮程序取名自己能做到了, 那还要啥女朋友

这篇文章是整理了以下书籍所整理出来的笔记:有兴趣的同学可以去看
< 代码大全2 >
< 重构:改善代码既有设计 >
< 代码整洁之道 >
< 阿里巴巴:java开发手册 >

原创粉丝点击