分析一套源代码的代码规范和风格并讨论如何改进优化代码
1. 结合工程实践选题相关的一套源代码,根据其编程语言或项目特点,分析其在源代码目录结构、文件名/类名/函数名/变量名等命名、接口定义规范和单元测试组织形式等方面的做法和特点;
工程实践为爬取用户评论在对这些数据进行分析,因此选取了一套爬取用户微博信息的代码进行分析,下图是该程序的结构:
search_spider - 根据关键字和时间进行爬取的模块
----hour_fenge.py 时间分隔函数:对要搜索的时间期限进行以每小时为单位的划分,返回包含所有时间单位的列表
----search_start.py 根据关键字和时间条件进行爬取的主要函数:其中包括爬取某页全部微博、微博所有页数的计算、保存数据库等功能
tools - 工具模块
----Config.cfg 数据库等配置文件
----Cookie_Process.py cookie处理函数:其中包括获取文件中存储的cookie、更新文件中存储的cookie等功能
----Date_Process.py 时间处理函数:其中包括对爬取到微博的不同时间格式进行统一
----Emoji_Process.py 表情处理函数:清除掉包含的utf8bm4编码格式的表情 ----Mysql_Process.py mysql数据库工具类:其中包括数据库连接、关闭、增删改查的操作等
----Number_Process.py 转发、评论数处理函数:对爬取到的微博的转发、评论数进行统一
user_spider - 爬取根据关键字搜索到的微博对应的微博用户的基本资料模块
----cookie.file 存储可用的cookie信息
----user_start.py 爬取用户资料的主要功能函数:包括获取所爬取微博的所有用户ID,并根据每个ID爬取其基本信息
weibo_spider - 根据某个用户ID爬取其所有微博的模块
-----cookie.file 存储可用的cookie信息
-----weibo_start.py 爬取用户全部微博的主要功能函数:其中包括爬取某页全部微博、微博所有页数的计算、保存数据库等功能
comment_spider - 爬取根据关键字搜索到的微博对应的微博下的全部评论
----cookie.file 存储可用的cookie信息
----comment_start.py 爬取微博评论的主要功能函数:包括获取所爬取微博的所有微博ID,并根据每个ID爬取其全部评论信息
从图中的代码结构,我们可以发现:
- 目录结构:将各个模块分隔开放在不同的文件夹下,此程序实现了4个功能,每个功能对应了一个文件夹,而另外一个文件夹下存放的是公用的工具类以及相应的配置文件,体现了高内聚低耦合的特点。
- 命名:各个文件名均由有意义的英文单词组成,而多个英文单词之间由“_”分隔开。对于各个模块的文件名,英文字母均以小写字母开头;而对于tools文件夹下的文件名,英文字母均大写字母开头,依次表示与其他模块文件的差异。
- 单元测试模块:在此项目中并没有发现单元测试模块,但在正常开发中,单元测试是必不可少的,下图是使用Java开发的博客项目,可以看到main文件夹下是正常模块文件,而resources下存放的是相应的配置文件。Test是模块测试代码,相应的resources下存放了对应的配置文件。
2. 列举哪些做法符合代码规范和风格一般要求;
- 注释
- 命名
使用有意义的,英文单词或词组,不使用汉语拼音
package/module
名中不要出现 –
- 空格+缩进
*在 list, dict, tuple, set, 参数列表的 , 后面加一个空格
* 在 dict 的 : 后面加一个空格
* 操作符两端加一个空格,如 +, -, *, /, |, &, =
* 接上一条,在参数列表里的 = 两端不需要空格
* 括号((), {}, [])内的两端不需要空格
- 空行
* function 和 class 顶上两个空行
* class 的 method 之间一个空行
* 函数内逻辑无关的段落之间空一行,不要过度使用空行
* 不把多个语句写在一行
* if/for/while 语句中,即使执行语句只有一句,也要另起一行
3. 列举哪些做法有悖于“代码的简洁、清晰、无歧义”的基本原则,及如何进一步优化改进;
语句过长,没有使用换行,虽然是sql语句不是真正操作的代码,但是阅读起来也很不方便,可以使用“\”控制换行。
注释过于简单,虽然说明了每个函数的功能,但是对于输入参数以及输出情况没有说明,对于多人协作开发可能会存在影响。
配置和代码放在一起,在这种比较小的项目中虽然不会造成什么影响。但对于模块较大以及配置较多的项目中,可能会造成混乱,可以将所有配置文件都存放在一个文件夹中。
4.总结同类编程语言或项目在代码规范和风格的一般要求。
- 命名
函数、变量及属性都用小写单词拼写,只见用_连接,不遵循驼峰命名法
类与异常应该首字母大写,不要用_连接
变量要尽可能有意义
- 空白
和语法相关的每一层缩进都用4个空格表示,不能混用Tab和空格
如果一行的字符超过80个时,应进行换行。
赋值时等号两边都要有一个空格
在使用函数进行函数式编程时,函数之间要空两行
在类中的函数,函数之间应该空一行
函数与类是同一个级别,则他们之间应该空两行
- 语句
判断变量是否为None、False或True时,要用is,例如,if a is None
import语句应放在句首,导入时最好指定具体功能。
检测容器不为空时,应使用if 容器名,例如,lists = [] if lists
- 注释
Python中的注释分为单行注释,多行注释。
对某些重要的代码块的功能说明,应使用单行注释
对整个模块功能的说明应使用多行注释