1. PEP8、空行、缩进
在方法的 `return`、`break`、`continue`后是否有空行?
在不同语义块之间是否有空行?
循环之前和之后是否有空行?
方法和类定义下方是否有多余空行?
2. 命名
方法名、变量名 是否见名知意?
方法功能必须和方法名是否一致?
3. 长度
函数长度 是否小于`20`行,最长是否小于`50`行?
类的长度 是否小于`100`行,最长是否不超过`300`行?
文件长度 最长是否不超过`1000`行?
行的长度 单行长度是否小于`128`字符?
4. 注释
是否添加业务背景信息,执行频率,执行条件,维护者注意点?
是否移除所有注释代码行?
注释是否是准确的?
5. 函数
如有多个 `return` 的语句,概率高的是否先进行判定?
是否有可以被库函数替代的代码?
是否进行了输入输出参数校验,是否有异常处理?
调用处是否都使用了正确的参数个数?
6. 循环
循环是否设置了长度和正确的终止条件?
7. 日志
是否有可以删除的日志或调试代码?
日志是否必须要在循环内?
8. 默认值
变量初始值是否合理
函数参数默认值
9. 依赖&导入
在导入其他模块的时候是否注明导入的具体类?
不要用`from xx import * `的方式导入
是否存在依赖的三方包?
版本是否有要求?
安装是否有特殊注意的地方?
是否加入`requestment.txt`?
代码是否创建了需要的数据库、工作表、字段、索引等?
是否存在初始化数据?
代码是否有前置后置脚本?
10. 结构
高内聚?松耦合?可扩展性?设计模式是否合理?
11. 性能
对数据结构的选择和设置是否合适?
是否采用通用的线程池、对象池模块等cache技术以提高性能?
是否选择合适的IO类或采用良好的方法以提高性能?
同步方法的使用是否得当,是否过度使用?
12. 安全
日志中是否打印了敏感信息?
所有的数据输入是否都进行了检查(检测正确的类型,长度,格式和范围)并且进行了编码?
在哪里使用了第三方工具,返回的错误是否被捕获?
返回的值是否进行了检查并且编码?
无效的参数值是否能够处理?
13. 功能
代码能够工作么?是否实现预期的功能,逻辑是否正确?
14. 其他
连接是否关闭、是否自动重连?
是否存在多余的或是重复的代码?
代码是否尽可能的模块化了?
是否有可以被替换的全局变量?
代码是否存在任何没有定义或没有引用到的变量、常量、或数据类型?
代码涉及到的常量是否易于修改(如使用配置、定义为类常量、使用专门的常量类等)
代码是否采取措施避免运行时的错误(如数组边界溢出、被零除、值越界、堆栈溢出等)
`DRY(Do not Repeat Yourself)`原则:同一代码不应该重复两次以上
`exception` 是否有太多的业务逻辑?