# 代码质量管理

代码质量管理(包括复杂度,重复率,代码风格等要素)对项目的实施有重要影响,我司对此高度重视,有如下实行办法:

  1. 规范化:写代码时要按规范写。
  2. 自动化:使用工具自动检查所写代码是否符合规范,不符合的编译不能通过。
  3. 模块化:将通用程序放在撰写模块里,供不同项目使用。
  4. 流程化:将不确定代码放入分支,然后评审通过后合并入主分支。

zongliucheng

# 规范化

规范化指的是依据代码规范,在书写代码时要求开发者按规范书写,包括的范围主要有:

  • 风格规范:缩进、换行、大小写等风格问题
  • 注释规范:注释应该写哪些东西,以怎样格式写
  • 实践规范:规避一些常见的隐患,或者针对特定问题的最佳实践
  • 业务规范:与业务有关的特殊要求,比如文案中的关键词按照约定编写

以约定来规范开发者书写意识,减少沟通成本,让每个人在编写代码时都知道如何写。这是质量保证的第一道保险。详见<<java代码规范>>

# 自动化

在开发者书写代码时,使用工具自动检测是否符合规范,这也在代码评审前保证代码的基本质量。

  • 代码规范检查:包括风格规范、实践规范、业务规范
  • 重复率:重复出现的代码区块占比,通常要求在5%以下
  • 复杂度:总行数,模块大小,循环复杂度等
  • 检查覆盖度:经过检查的行数占代码库总行数的比例

我司主要使用eslint工具,规范的方面有:

for-direction

强制 “for” 循环中更新子句的计数器朝着正确的方向移动

getter-return

强制 getter 函数中出现 return 语句

no-async-promise-executor

禁止使用异步函数作为 Promise executor

no-await-in-loop

禁止在循环中出现 await

no-compare-neg-zero

禁止与 -0 进行比较

no-cond-assign

禁止条件表达式中出现赋值操作符

no-console

禁用 console

no-constant-condition

禁止在条件中使用常量表达式

no-control-regex

禁止在正则表达式中使用控制字符

no-debugger

禁用 debugger

no-dupe-args

禁止 function 定义中出现重名参数

no-dupe-keys

禁止对象字面量中出现重复的 key

no-duplicate-case

禁止出现重复的 case 标签

no-empty

禁止出现空语句块

no-empty-character-class

禁止在正则表达式中使用空字符集

no-ex-assign

禁止对 catch 子句的参数重新赋值

no-extra-boolean-cast

禁止不必要的布尔转换

no-extra-parens

禁止不必要的括号

no-extra-semi

禁止不必要的分号

no-func-assign

禁止对 function 声明重新赋值

no-inner-declarations

禁止在嵌套的块中出现变量声明或 function 声明

no-invalid-regexp

禁止 RegExp 构造函数中存在无效的正则表达式字符串

no-irregular-whitespace

禁止不规则的空白

no-misleading-character-class

不允许在字符类语法中出现由多个代码点组成的字符

no-obj-calls

禁止把全局对象作为函数调用

no-prototype-builtins

禁止直接调用 Object.prototypes 的内置属性

no-regex-spaces

禁止正则表达式字面量中出现多个空格

no-sparse-arrays

禁用稀疏数组

no-template-curly-in-string

禁止在常规字符串中出现模板字面量占位符语法

no-unexpected-multiline

禁止出现令人困惑的多行表达式

no-unreachable

禁止在 return、throw、continue 和 break 语句之后出现不可达代码

no-unsafe-finally

禁止在 finally 语句块中出现控制流语句

no-unsafe-negation

禁止对关系运算符的左操作数使用否定操作符

require-atomic-updates

禁止由于 await 或 yield的使用而可能导致出现竞态条件的赋值

use-isnan

要求使用 isNaN() 检查 NaN

valid-typeof

强制 typeof 表达式与有效的字符串进行比较

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144

自动化检查工具的规则集与代码规范直接对应。通过编辑器插件,在写代码的时候直接给出检查结果。到这个阶段,团队的代码规范文档已经不再需要陈述各种细节,开发者可以直接通过查看自动化工具的规则集来了解代码规范。

# 模块化

在项目中会有一些通用的代码,这些代码的质量至关重要,我司有专门架构师写这部分代码来保证其可靠性。并且让这部分以可配置的方式作为输入,以标准化的方式输出。要模块化的方面主要有:

  1. 用户登陆模块
  2. 日志收集
  3. 定时任务
  4. 开发通用工具类
  5. 全局异常处理
  6. 多数据源切换
  7. excel分析

# 流程化

流程化有几个方面:

  1. 针对项目中的一些不确定代码需要控制其开发流程。

    • buqueding
  2. 将自动化的代码质量检测与代码流动过程绑定,这样大大减轻流程方面的工作,会有如下几个时机:

    • 编辑时:使用编辑器插件,实时运行质量检查
    • 构建时:在本地或者开发机的构建脚本中运行质量检查
    • 提交时:利用Git Hooks,提交代码或者生成Pull Request时运行质量检查
    • 发布时:在发布脚本中再做一次质量检查,通常与自动化测试放在一起
    • liucheng
  3. 针对以下方面的东西,需要向上级主管请示:

    • 数据库
    • 其他人负责的模块
    • 公共模块

通过把开发中的各种情况流程化,保证问题有人落实,有人负责,有人审核以确保其质量。