作为一名程序员,我们的本职工作是写代码。今天,我们来学习下如何提高 Java 代码的质量

1可读性

1.1 准确命名

每种编程语言都有自己的命名规范,不同语言的风格差异有大有小,下面以Java为例:

Java整体命名风格为UpperCamelCase或lowerCamelCase形式。不管是类还是变量命名要见名知意,切勿使用缩写或中文;风格统一,尽量使用英文名词,切勿中英文混合;尽量避免和Java自带类库重名,切勿使用Java关键字命名。

  • 包命名规范

包命名使用小写英文名词,使用“.”分割,每个被分割的单元尽量只有一个名词,命名规范为:

域名.公司/个人名称.项目名称.模块名称

  • 类命名规范

类采用UpperCamelCase命名风格,一些特殊的缩写可以采用全大写,如XML。类命名使用名词描述类的作用。

  • 接口命名规范

接口采用UpperCamelCase命名风格,由于接口定义的是一类功能或动作,所以接口的命名一般使用形容词或动词描述接口的行为。

  • 抽象类命名规范

抽象类除了满足UpperCamelCase风格外,一般需要加上Abstract前缀。

  • 异常类命名规范

异常类除了满足UpperCamelCase风格外,一般需要加上Exception或Error后缀,使用名词描述什么异常或错误。

  • 枚举类命名规范

枚举类除了满足UpperCamelCase风格外,一般加上Enum后缀,枚举类中的枚举值采用全部大写风格,单词与单词之间使用“_”进行分割。

  • 方法命名规范

方法命名采用lowerCamelCase风格,一般使用动词+名词来命名,比较常见的有doXxx,handleXxx,findXxxx。

  • 变量命名规范

变量命名采用lowerCamelCase风格,一般使用名词描述变量的作用,需要注意的是区别于常量,尽量不要使用特殊符号前缀或使用“_”分割符号。

  • 常量命名规范

常量命名采用全部大写,单词与单词之间使用“_”进行分割。

1.2 代码风格

在日常的项目开发中,一个项目有很多人协同开发,每个人使用的开发工具不一样,比如大家常用的vs code和idea,不同的开发工具或代码习惯也会导致代码风格不一致,我们在开发时可能习惯性的进行代码格式化,就会导致整个类改动非常多,在代码合并时容易冲突。

我们可以在项目中增加.editorconfig文件来统一代码风格。

root = true[*.{adoc,bat,groovy,html,java,js,jsp,kt,kts,md,properties,py,rb,sh,sql,svg,txt,xml,xsd}]charset = utf-8[*.{groovy,java,kt,kts,xml,xsd}]indent_style = tab#tab键缩进,可选"space"、"tab"indent_size = 4 #缩进空格为4个end_of_line = lf#结尾换行符,可选"lf"、"cr"、"crlf"charset = utf-8 #文件编码trim_trailing_whitespace = true #不保留行末的空格insert_final_newline = true #文件末尾增加一个空行curly_bracket_next_line = false #大括号不另起一行spaces_around_operators = true#运算符两边都有空格indent_brace_style = 1tbs #条件语句格式是1tbs

1.3 注释规约

类注释

类注释采用/**……*/,在每个类的头部要有必要的注释信息,包括:作者、创建时间、类功能描述

/** * 简单分流算法实验, 每次分流只用考虑当前的桶, 不用回溯历史版本 * {@link https://duapp.yuque.com/team_tech/confluence-data-iwskfg/dzmogk} * @author hufei * @date 2021/6/8 7:59 下午 */

接口注释

接口注释采用/**……*/,在满足类注释的基础上,接口注释应该包含接口的目的、如何使用。

/** * AB分桶算法接口规范 * 对外暴露实验桶计算接口,该接口有一个抽象实现类AbstractBucketAlgorithm,具体的分桶算法实现这个抽象类 * @author hufei * @date 2021/6/8 6:06 下午 */

方法注释

方法注释采用/**……*/,描述方法的功能、输入、输出及返回值说明

/** * 计算实验层的桶信息 * @param layerId 分层 id * @param expId 实验 Id * @param expRatio 新的实验占层流量比例 * @param existsLayerBucket 老的层流量实验配比 * @return 新的层流量实验配比 * @throws BucketAlgorithmException */

方法内部注释

代码做了些什么以及为什么这样做,特别是复杂的逻辑处理部分,要尽可能的给出详细的注释。

全局变量注释

包括变量的功能、取值范围、注意事项等的说明。

/** * 代表kafka收到消息的答复数,0就是不要答复,爱收到没收到.1就是有一个leader broker答复就行,all是所有broker都要收到才行 * 0: Producer不等待kafka服务器的答复,消息立刻发往socket buffer,这种方式不能保证kafka收到消息,设置成这个值的时候retries参数就失效了,因为producer不知道kafka收没收到消息,所以所谓的重试就没有意义了,发送返回值的offset全默认是-1. * 1: 等待leader记录数据到broker本地log即可.不等待leader同步到其他followers,那么假如此时刚好leader收到消息并答复后,leader突然挂了,其他fowller还没来得及复制消息呢,那么这条消息就会丢失了. * all:等待所有broker记录消息.保证消息不会丢失(只要从节点没全挂),这种方式是最高可用的 acks默认值是1. */private String acks = "0";

局部变量注释

主要的局部变量必须有注释,无特别意义的情况下可以不加注释。

2、