最近有代码扫描的需求,这里整理以下各种代码扫描规则的解释和如何修复。
扫描出来的结果大概如下图
一:基本说明:
第一部分 summery -摘要部分:
Files | Total | Blocker/Critical/Major/Minor/Info |
---|---|---|
文件数量 | 代码问题数量 | 从严重到轻微的各代码问题(阻塞/严重/一般/轻微/提示) |
这一部分描述整体代码问题的摘要。
第二部分 Rules -问题规则部分:
Rule | Violations | Severity |
---|---|---|
具体规则 | 问题出现数量 | 严重程度 |
这部分描述代码具体触发的问题规则和数量。
第三部分 Files -问题具体文件部分:
Files | 5/4/3/2/1 |
---|---|
具体的文件(带有跳转连接) | 从轻到重的问题数量 |
这部分描述具体的文件和问题级别并带有跳转连接,可以点击文件路径直接跳转到问题详情。
第四部分 Files(detail) -文件具体问题部分:**
violation | Error Description | Line |
---|---|---|
问题级别 | 错误描述 | 文件中错误位置(行位置) |
这部分具体描述了文件触发的代码问题描述和问题在文件中的位置。
二:规则和如何修复:
[AlibabaJavaNaming] 阿里java命名规则
ConstantFieldShouldBeUpperCaseRule
# ConstantFieldShouldBeUpperCaseRule
# Severity: Critical (级别:2级)
# 解释:常量命名应该全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长
# Examples-例子
public class ConstantNameDemo {
/**
* max stock count
*/
public static final Long MAX_STOCK_COUNT = 50000L;
PackageNamingRule
# PackageNamingRule
# Severity: Major (级别:3级)
# 解释: 包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式
# Examples-例子
com.alibaba.mpp.util / com.taobao.tddl.domain.dto
LowerCamelCaseVariableNamingRule
# LowerCamelCaseVariableNamingRule
# Severity: Critical (级别:2级)
# 解释: 方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase,必须遵从驼峰形式
ClassNamingShouldBeCamelRule
# ClassNamingShouldBeCamelRule
# Severity: Major (级别:3级)
# 解释:类名使用UpperCamelCase风格,必须遵从驼峰形式,但以下情形例外:(领域模型的相关命名)DO / BO / DTO / VO / DAO
[AlibabaJavaSets] 阿里java集合规则
CollectionInitShouldAssignCapacityRule
# CollectionInitShouldAssignCapacityRule
# Severity: Major (级别:3级)
# 解释:集合初始化时,指定集合初始值大小。
# 说明:HashMap使用如下构造方法进行初始化,如果暂时无法确定集合大小,那么指定默认值(16)即可。
# Examples-例子
# 反面教材
Negative example:
Map<String, String> map = new HashMap<String, String>();
# 正面教材
Positive example:
Map<String, String> map = new HashMap<String, String>(16);
[AlibabaJavaOop] 阿里java面向对象规则
PojoMustOverrideToStringRule
# PojoMustOverrideToStringRule
# Severity:Major (级别:3级)
# 解释:POJO类必须写toString方法。使用工具类source> generate toString时,如果继承了另一个POJO类,注意在前面加一下super.toString。
# 说明:在方法执行抛出异常时,可以直接调用POJO的toString()方法打印其属性值,便于排查问题。
# Examples-例子
public class ToStringDemo extends Super{
private String secondName;
@Override
public String toString() {
return super.toString() + "ToStringDemo{" + "secondName='" + secondName + '\'' + '}';
}
}
class Super {
private String firstName;
@Override
public String toString() {
return "Super{" + "firstName=" + firstName + '\'' + '}';
}
}
PojoMustUsePrimitiveFieldRule
# PojoMustUsePrimitiveFieldRule
# Severity: Major (级别:3级)
# 解释:
# 关于基本数据类型与包装数据类型的使用标准如下:
# 1) 所有的POJO类属性必须使用包装数据类型。
# 2) RPC方法的返回值和参数必须使用包装数据类型。
# 3) 所有的局部变量推荐使用基本数据类型。
# 说明:POJO类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何NPE问题,或者入库检查,都由使用者来保证。
#Examples-例子
public class DemoDO {
String str;
Integer a;
}
[AlibabaJavaFlowControl] 阿里java流控制规则
NeedBraceRule
# NeedBraceRule
# Severity: Blocker (级别:1级)
# 解释: 在if/else/for/while/do语句中必须使用大括号,
# 即使只有一行代码,避免使用下面的形式:if (condition) statements;
# Examples-例子
if (flag) {
System.out.println("hello world");
}
AvoidComplexConditionRule
# AvoidComplexConditionRule
# Severity: Major (级别:3级)
# 解释:除常用方法(如getXxx/isXxx)等外,不要在条件判断中执行复杂的语句,将复杂逻辑判断的结果赋值给一个有意义的布尔变量,以提高可读性。
# 说明:很多if语句内的逻辑相当复杂,阅读者需要分析条件表达式的最终结果,才能明确什么样的条件执行什么样的语句,那么,如果阅读者分析逻辑表达式错误呢?
# Examples-例子
# 反面教材
Negative example:
if ((file.open(fileName, "w") != null) && (...) || (...)) {
// ...
}
#正面教材
Positive example:
boolean existed = (file.open(fileName, "w") != null) && (...) || (...);
if (existed) {
//...
}
[AlibabaJavaConstants] 阿里java常量规则
UndefineMagicConstantRule
# UndefineMagicConstantRule
# Severity:Major (级别:3级)
# 解释:不允许任何魔法值(即未经定义的常量)直接出现在代码中。
# Examples-例子
# 反面教材
Negative example:
//Magic values, except for predefined, are forbidden in coding.
if (key.equals("Id#taobao_1")) {
//...
}
# 正面教材:先创建一个常量并赋值给它,再用这个常量进行比较。
Positive example:
String KEY_PRE = "Id#taobao_1";
if (KEY_PRE.equals(key)) {
//...
}
[AlibabaJavaComments] 阿里java注释规则
EnumConstantsMustHaveCommentRule
# EnumConstantsMustHaveCommentRule
# Severity: Critical (级别:2级)
# 解释:所有的枚举类型字段必须要有注释,说明每个数据项的用途。
# Examples-例子
public enum TestEnum {
/**
* agree
*/
agree("agree"),
/**
* reject
*/
reject("reject");
private String action;
TestEnum(String action) {
this.action = action;
}
public String getAction() {
return action;
}
}
AvoidCommentBehindStatementRule
# AvoidCommentBehindStatementRule
# Severity:Major (级别:3级)
# 解释:方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/* */注释。注意与代码对齐。
# Examples-例子
public void method() {
// Put single line comment above code. (Note: align '//' comment with code)
int a = 3;
/**
* Some description about follow code. (Note: align '/**' comment with code)
*/
int b = 4;
}
CommentsMustBeJavadocFormatRule
# CommentsMustBeJavadocFormatRule
# Severity:Major (级别:3级)
# 解释:类、类属性、类方法的注释必须使用javadoc规范,使用/**内容*/格式,不得使用//xxx方式和/*xxx*/方式。
# 说明:在IDE编辑窗口中,javadoc方式会提示相关注释,生成javadoc可以正确输出相应注释;在IDE中,工程调用方法时,不进入方法即可悬浮提示方法、参数、返回值的意义,提高阅读效率。
# Examples-例子
/**
*
* XXX class function description.
*
*/
public class XxClass implements Serializable {
private static final long serialVersionUID = 113323427779853001L;
/**
* id
*/
private Long id;
/**
* title
*/
private String title;
/**
* find by id
*
* @param ruleId rule id
* @param page start from 1
* @return Result<Xxxx>
*/
public Result<Xxxx> funcA(Long ruleId, Integer page) {
return null;
}
}
AbstractMethodOrInterfaceMethodMustUseJavadocRule
# AbstractMethodOrInterfaceMethodMustUseJavadocRule
# Severity:Major (级别:3级)
# 解释:全部的抽象方法(包括接口中的方法)必需要用javadoc注释、除了返回值、参数、异常说明外,还必须指出该方法作什么事情,实现什么功能。
# Examples - 例子
/** * fetch data by rule id * * @param ruleId rule id * @param page page number * @param jsonContext json format context * @return Result<XxxxDO> */
Result<XxxxDO> fetchDataByRuleId(Long ruleId, Integer page, String jsonContext);
ClassMustHaveAuthorRule
# ClassMustHaveAuthorRule
# Severity:Major (级别:3级)
# 解释:所有的类都必须添加创建者信息。
# 说明:在设置模板时,注意IDEA的@author为${USER},而eclipse的@author为${user},大小写有区别,而日期的设置统一为yyyy/MM/dd的格式。
# Examples-例子
/**
* Demo class
*
* @author keriezhang
* @date 2016/10/31
*/
public class CodeNoteDemo {
}
RemoveCommentedCodeRule
Name
RemoveCommentedCodeRule
Severity:Major (级别:3级)
# 解释:及时清理不再使用的代码段或配置信息。
# 说明:对于垃圾代码或过时配置,坚决清理干净,避免程序过度臃肿,代码冗余。
# Examples
# 正面教材:如果一些代码被注释,但可能还要启用,则在注释代码前加一行注释说明
Positive example: For codes which are temporarily removed and likely to be reused, use /// to add a reasonable note.
public static void hello() {
/// Business is stopped temporarily by the owner.
// Business business = new Business();
// business.active();
System.out.println("it's finished");
}
[AlibabaJavaOthers] 阿里java其他规则
AvoidApacheBeanUtilsCopyRule
# AvoidApacheBeanUtilsCopyRule
# Severity: Blocker (级别:1级)
# 解释:避免用Apache Beanutils进行属性的copy。
# 说明:Apache BeanUtils性能较差,可以使用其他方案比如Spring BeanUtils, Cglib BeanCopier。
# Examples-例子
TestObject a = new TestObject();
TestObject b = new TestObject();
a.setX(b.getX());
a.setY(b.getY());
AvoidNewDateGetTimeRule
# AvoidNewDateGetTimeRule
# Severity: Blocker (级别)
# 解释:获取当前毫秒数:System.currentTimeMillis(); 而不是new Date().getTime();
# 说明:如果想获取更加精确的纳秒级时间值,用System.nanoTime。在JDK8中,针对统计时间等场景,推荐使用Instant类。
# Examples-例子
public class TimeMillisDemo {
public static void main(String args[]) {
// Positive example-正面教材
long a = System.currentTimeMillis();
// Negative example-反面教材
long b = new Date().getTime();
System.out.println(a);
System.out.println(b);
}
}
MethodTooLongRule
# MethodTooLongRule
# Severity:Major (级别:3级)
# 解释:单个方法的总行数不超过80行。
# 说明:包括方法签名、结束右大括号、方法内代码、注释、
空行、回车及任何不可见字符的总行数不超过80行。
以上规范不全,仅为遇到的规范,更多规范见下文
文中使用了以下资料
阿里巴巴代码规范: https://blog.csdn.net/WeiHao0240/article/details/88555558