Table of Contents

一、前言

编程有很大一部分时间都是在阅读代码,一般开源的软件源码编码都非常规范,或者说自成体系,虽然会有部分风格不同,但总体上是一致的。我自己在写代码时,尤其是在命名的时候也会遵从这些规范。但没有成体系的阅读相关的代码规范的书籍,有时候在写代码时,对于类、变量、方法这些命名风格会产生错用(如驼峰命名、蛇形命名、串行命名),特别是在想严格区分变量、方法等的命名风格时。本次体系地阅读阿里java规范来更好规范自己地代码命名风格。

二、命名风格

  1. 驼峰命名法(CamelCase)

    • 【强制】类名使用 UpperCamelCase 风格,必须遵从驼峰形式。
    • 【强制】方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从驼峰形式。
  2. 蛇形命名法(snake_case)

    • 测试方法名、常量、枚举名称需要使用蛇形命名方法
    • 【强制】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。 MAX_STOCK_COUNT
    • 并且,测试方法名称要求全部小写,常量以及枚举名称需要全部大写。

    在蛇形命名法中,各个单词之间通过下划线“_”连接,比如should_get_200_status_code_when_request_is_validCLIENT_CONNECT_SERVER_FAILURE

    蛇形命名法的优势是命名所需要的单词比较多的时候,比如我把上面的命名通过小驼峰命名法给大家看一下:“shouldGet200StatusCodeWhenRequestIsValid”。

  3. 串行命名法(kebab-case)

    在串式命名法中,各个单词之间通过连接符“-”连接,比如dubbo-registry

    建议项目文件夹名称使用串式命名法(kebab-case),比如 dubbo 项目的各个模块的命名是下面这样的。

    img

  4. 其他

    • 【强制】抽象类命名使用Abstract 或Base 开头;异常类命名使用Exception 结尾;测试类命名以它要测试的类的名称开始,以Test 结尾。
    • 【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。
    • 【强制】杜绝完全不规范的缩写,避免望文不知义。
    • 接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁性,并加上有效的Javadoc 注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量。
  5. 命名易读性规范

    • 为了能让命名更加易懂和易读,尽量不要缩写/简写单词,除非这些单词已经被公认可以被这样缩写/简写。比如 CustomThreadFactory 不可以被写成 ~~CustomTF

    • 命名不像函数一样要尽量追求短,可读性强的名字优先于简短的名字,虽然可读性强的名字会比较长一点。 这个对应我们上面说的第 1 点。命名也不要过长。

    • 避免无意义的命名,你起的每一个名字都要能表明意思。

      正例:UserService userService; int userCount;

      反例: UserService service int count

    • 不要使用拼音,更不要使用中文。 不过像 alibaba 、wuhan、taobao 这种国际通用名词可以当做英文来看待。

Codelf 提供了在线网站版本,网址:https://unbug.github.io/codelf/,VScode 插件。

三、常量定义

以下列出部分个人认为自己容易出错的:

  1. 【强制】long 或者Long 初始赋值时,必须使用大写的L,不能是小写的l,小写容易跟数字1 混淆,造成误解。 说明:Long a = 2l; 写的是数字的21,还是Long 型的2?

  2. 【推荐】不要使用一个常量类维护所有常量,应该**按常量功能进行归类,分开维护。**如:缓存相关的常量放在类:CacheConsts 下;系统配置相关的常量放在类:ConfigConsts 下。 说明:大而全的常量类,非得使用查找功能才能定位到修改的常量,不利于理解和维护。

  3. 【推荐】如果变量值仅在一个范围内变化,且带有名称之外的延伸属性,定义为枚举类。下面正例中的数字就是延伸信息,表示星期几。

    image-20211025191417773

四、代码格式

  1. 【强制】大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果 是非空代码块则: 1) 左大括号前不换行。 2) 左大括号后换行。 3) 右大括号前换行。 4) 右大括号后还有else 等代码则不换行;表示终止的右大括号后必须换行。

    这里个人的代码风格不同,以后要修正过来。

  2. 【强制】 左小括号和字符之间不出现空格;同样,右小括号和字符之间也不出现空格。详见第5 条下方正例提示。
    image-20211025191929206

  3. 【强制】if/for/while/switch/do 等保留字与括号之间都必须加空格。

    此处也要注意改正。

  4. 【强制】任何二目、三目运算符的左右两边都需要加一个空格。 说明:运算符包括赋值运算符=、逻辑运算符&&、加减乘除符号等。

  5. 【强制】缩进采用4 个空格,禁止使用tab 字符。

    说明:如果使用tab 缩进,必须设置1 个tab 为4 个空格。IDEA 设置tab 为4 个空格时,请勿勾选Use tab character;而在eclipse 中,必须勾选insert spaces for tabs

    image-20211025192559642

  6. 【强制】单行字符数限制不超过120 个,超出需要换行,换行时遵循如下原则: 1) 第二行相对第一行缩进4 个空格,从第三行开始,不再继续缩进,参考示例。 2) 运算符与下文一起换行。 3) 方法调用的点符号与下文一起换行。 4) 在多个参数超长,在逗号后换行。 5) 在括号前不要换行,见反例。

    image-20211025192842179

  7. 【强制】方法参数在定义和传入时,多个参数逗号后边必须加空格。

    image-20211025192933319

  8. 【强制】IDE 的text file encoding 设置为UTF-8; IDE 中文件的换行符使用Unix 格式, 不要使用windows 格式。