当前课程知识点:软件工程 > 第2章 编写高质量代码 > 2.4 代码静态检查 > 讲课视频
代码审查是指通过阅读代码
来检查源代码和编程规范
是否符合
以及代码本身质量的一种活动
它被公认为是一个提高
代码质量的有效手段
这种活动比较容易发现
架构和时序相关的
较难发现的一些问题
同时还可以帮助团队成员
统一编程风格
提高编程技能等
代码审查主要是检查
代码编写的规范性
代码设计的合理性
以及处理代码中的一些地雷区
也就是一些最常出错
但测试不容易发现的地方
这里我们给大家列出了
一部分示例的问题
在实际的开发中
需要大家根据项目的要求
和实践经验
进行进一步的归纳总结
编程规范是最基本的检查项
主要是检查源代码
是否符合具体编程语言的
规范要求
另外还要检查设计抽象
是否合理
是否考虑了未来扩展性的要求
关于性能方面
主要是检查代码实现中
是否存在性能问题
比如说 数据结构的选择
线程和缓存的使用
以及并发访问策略等
这里并不考虑架构和
功能方面的性能问题
内存也是影响效率和可靠性的
主要因素
重点是要检查内存的申请
和释放是否正确
是否存在内存泄露的问题
另外还要检查程序处理逻辑
是否正确
尤其是循环的结束条件
以及循环处理是否存在
影响性能的问题
线程处理是否存在安全
和死锁的问题
数据库的处理是否正确
尤其是事务的完整性和隔离性
方面的问题
还有通讯的编程实现
机制是否合理
在具体的编程语言中
对象的创建和删除是否正确
异常处理
也是一个重要的检查项
主要是检查异常处理
是否考虑了所有可能的错误
并且处理正确
方法或者函数的检查
重点在于接口参数
变量初始化等
代码的安全主要是涉及
参数合法性检查
信息加密和通讯安全等问题
其他方面还有一些关于日志
配置等方面的问题
在代码审查过程中
我们可以借助工具
来帮助自动地执行
静态代码分析
以便快速定位代码中隐藏的
错误和缺陷
减少人工逐行检查上
花费的时间
提高代码审查的效率
Pylint
是一个Python代码的
静态分析工具
下面我们简单介绍一下
如何使用这个工具
进行代码检查
Pylint的功能主要包括三个方面
第一是对代码风格进行检查
主要是检查代码是否符合
PEP8规范
第二是检查代码中
是否存在一些常见的错误
比如说是否所有变量
在访问之前
都已经定义等等
大家可以从下面的这个链接
看到一个完整的检查列表
第三 是检查代码
是否存在重复代码
以便为重构提供帮助
Pylint的安装很简单
可以通过Python的包管理工具
pip进行安装
另外只要在命令行中输入
Pylint加选项
加要检查的模块包
或者文件的名称
就可以使用Pylint进行检查
Pylint常用的选项有以下几项
rcfile用来指定检查时
所用的配置文件
默认是当前目录下的
Pylintrc文件
ignore用来指定不进行检查的
文件列表
disable用来关闭
某种类型的检查
f指定报告的类型
默认情况下是文本类型
我们可以通过-f来输出
html格式的报告
Pylint还有一些其他命令
比如help参数
是用以查看某种类型问题的
帮助信息
这里给出的例子
是一个查看关于
无效命名的说明
generate是根据当前配置
生成配置文件
默认情况下
使用当前目录下的Pylintrc文件
作为配置
有关Pylint命令及其使用的
详细说明
可以查阅官方文档
下面我们通过一个简单的例子
来说明Pylint的使用
这一段程序的功能
是凯撒密码的加密解密
我们在命令行中
输入Pylint命令
对这一段程序进行静态分析
Pylint的输出结果分为两部分
一个是源代码的分析部分
另一个是一系列详细报告
下面我们先来看一下源代码
分析部分
第一行是说没有找到配置文件
这里使用默认配置
下面是检查到的问题列表
它是按照错误类型 出现位置
说明信息这样的格式列出的
主要的错误类型包括
约定 是指违反了编码标准
重构 是写的很糟糕的代码
警告 是某些Python特定的问题
错误 是指代码中可能有的错误
下面就是一系列的报告
第一行是总计分析了
多少行语句
在这个例子中是20行语句
第一个表格列出了所查文件的
模块 类 方法和函数的数量
这个表列出了实际代码
文档字符串 注释 空行等
分别有多少行
以及所占的百分比
在这个给出的例子中
代码是22行 占95.65%
没有docstring
一般的注释有一行
这个程序的注释比较少
这里显示的是前一次的结果
可以用来做对比
这个表是显示是否有重复的
代码行
那么这个程序
是没有重复代码的
这个表是对前面的源代码
分析信息进行汇总
分别按照不同的错误类型
列出各是多少
这个表是根据问题的标识
进行汇总
最后Pylint会给出一个评分
10分是满分
还会把这一次的得分
和前面的结果做比较
因为我们这里的程序
是第一次运行
所以得分的变化是零
现在我们对之前介绍的
生命游戏程序进行静态分析
下面看一下分析结果
第一类问题就是行过长
PEP8规定代码长度
一般不超过79个字符
最长可以宽限到100
Pylint会检查
是否有代码行的宽度
超过了100
我们可以看到
项目中有两行代码超过了100
过长的代码会造成阅读的困难
降低可读性
第二类问题是缺少docstring
一般情况下
模块和公共方法 函数
都要添加docstring
第三类问题是不合法的命名
默认的配置中
变量名至少需要三个字符
所以这里的d和nc
都不符合规则
bad-builtin是说使用了
不好的内置函数
例如map和filter
这是因为Pylint认为
使用Python的列表推导
更符合Python的习惯
列表推导通常具有较好的
可读性
并且会有少量的性能提升
bare-except是指在使用try
except捕捉异常时
没有指定异常类型
通常我们都应该明确异常类型
并进行处理
下面我们对代码检查的错误
进行修改
行过长的问题
可以通过换行使行变短
例如这样的修改
缺少docstring的问题
应该是补充有意义的说明
这里暂时关闭这项检查
但是在实际开发中
不建议这样做
无效命名的问题
要具体分析原因
我们这里是把命名规则
进行重新设定
关于bare-except问题
生命游戏这个程序
没有必要在except中
做异常处理
相应的处理
已经在主函数中实现
所以可以关闭这项检查
在某些情况下
可能需要关闭某个文件中的
某些警告信息
这种情况往往不是配置文件中
那种全局配置的情况
那么我们可以通过上面的方式
来实现
并且在文件头加上注释
现在生命游戏的评分
达到了10分
各种不同的编程语言
都有自己的静态分析工具
这里列出的是Java语言的
还有C++
JavaScript
HTML等
建议大家结合具体的编程
学习使用
代码审查已经被广泛地公认为
是一种非常好的工程实践
在Google公司
任何产品
任何项目的程序代码
都要在经过有效的
代码审查之后
才能提交到代码库中
也正是因为这种很彻底
很普遍的应用
让Google的程序变得非常优秀
如果你在编程的时候
知道会有同事检查你的代码
那么你的编程态度
就会完全不一样
你写出的代码将会更加的整洁
有更好的注释和更好的结构
希望同学们在编程实践中
学会应用这种做法
不断地提升编写
高质量代码的能力
-1.1 软件无处不在
--讲课视频
-1.2 软件的本质特性
--讲授视频
-1.3 软件工程的产生与发展
--讲授视频
-1.4 软件工程的基本概念
--讲授视频
-1.5 软件质量实现
--讲授视频
-1.6 业界人士谈软件工程
-测验题--作业
-讨论题
--讨论题
-作业题
--第一张 作业题
-2.1 编程过程与规范
--讲课视频
-2.2 良好的编程实践
--讲课视频
-2.3 Python集成开发环境
--讲课视频
-2.4 代码静态检查
--讲课视频
-2.5 代码性能分析
--讲课视频
-2.6 结对编程实践
--讲课视频
-2.7 刘贺谈软件工程
--讲课视频
--讨论
-测验题--作业
-作业题
--第二章 作业题
-3.1 单元测试概述
--讲课视频
-3.2 黑盒测试方法
--黑盒测试方法
-3.3 白盒测试方法
--基本概念
--代码覆盖标准
--基本路径测试
-3.4 单元测试工具
--单元测试工具
--html
-测验题--作业
-作业题
--第三章 作业题
--作业题附件
-4.1 软件过程
--讲课视频
-4.2 软件过程模型
--讲课视频
-4.3 敏捷开发过程
--讲课视频
-4.4 微软公司开发过程
--邹欣经理自我介绍
--微软开发过程之一
--微软开发过程之二
-测验题--作业
-5.1 团队组织与管理
--讲课视频
-5.2 项目沟通管理
--讲课视频
-5.3 软件项目计划
--讲课视频
-5.4 软件项目估算
--讲课视频
-测验题--作业
-讨论题
--讨论
-6.1 敏捷开发之Scrum
-- 敏捷开发之Scrum
--html
-6.2 用户故事与估算
--讲课视频
-6.3 团队协作工具Tower
-6.4 配置管理
--讲课视频
-6.5 配置管理工具Git
--讲课视频
-测验题--作业
-作业题--作业
-7.1 需求工程师
--讲课视频
-7.2 需求定义
--讲课视频
-7.3 需求的类型
--讲课视频
--讲课视频(2)
-7.4 需求工程过程
--讲课视频
-7.5 需求的主要来源
--讲课视频
-7.6 需求获取技术
--讲课视频
--讲课视频二
--讲课视频三
-7.7 撰写需求文档
--讲课视频
-测验题--作业
-讨论题
--讨论
-8.1 用例建模概念
--讲课视频
-8.2 用例建模过程
--讲课视频
-8.3 用例建模精讲
--讲课视频
-8.4 建模工具介绍
--讲课视频
-8.5 微信抢票应用案例
--讲课视频
-测验题--作业
-讨论题
--讨论
-9.1 面向对象分析
--讲课视频
-9.2 CRC卡片分拣法
--讲课视频-1
--讲课视频-2
-9.3 面向对象设计
--讲课视频-1
--讲课视频-2
-9.4 类图建模
--讲课视频-1
--讲课视频-2
-第9章 面向对象分析与设计--测验题
-讨论题
--讨论
-10.1 顺序图概念
--讲课视频
-10.2 顺序图建模
--讲课视频
-10.3 顺序图风格
--讲义视频
-10.4 状态建模
--讲课视频
-10.5 状态图
--讲课视频
-10.6 状态图精讲
--讲义视频
-测验题--作业
-讨论题
--讨论
-11.1 软件体系结构概念
--讲授视频
-11.2 软件设计原则
--讲授视频
-11.3 软件体系结构风格(一)
--讲授视频
-11.4 软件体系结构风格(二)
--讲授视频
-11.5 软件体系结构风格(三)
--讲授视频
-11.6 软件设计过程
--讲授视频
-11.7 Web系统架构设计
--讲授视频
-11.8 数据库选择策略
--讲授视频
-测验题--作业
-作业题
--html
--html
--html
-作业题--作业
-12.1 交互设计概述
--讲授视频
-12.2 交互设计目标
--讲授视频
-12.3 GUI设计原则
--讲课视频
-12.4 KLM效率模型
--Video
-12.5 Fitts定律
--讲授视频
-12.6 交互设计过程
--讲授视频
-测验题--作业
-13.1 软件测试概念
--讲课视频
-13.2 软件测试类型
--讲课视频
-13.3 软件功能测试
--讲课视频
-13.4 软件性能测试
--讲课视频
-测验题--作业
-14.1 软件部署与交付
--讲课视频
-14.2 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)