分析UIS-RNN源代码的代码规范和风格
结合工程实践选题相关的一套源代码,根据其编程语言或项目特点,分析其在源代码目录结构、文件名/类名/函数名/变量名等命名、接口定义规范和单元测试组织形式等方面的做法和特点;
列举哪些做法符合代码规范和风格一般要求;
列举哪些做法有悖于“代码的简洁、清晰、无歧义”的基本原则,及如何进一步优化改进;
总结同类编程语言或项目在代码规范和风格的一般要求。
我的工程实践题目是《多人对话场景中音频分离》,题目要求的任务即说话人区分(Speaker Diarization)任务。我找到了一套实现了说话人区分任务的算法代码,该算法被称为UIS-RNN,出自Google团队于2018年发表的论文 “Fully Supervised Speaker Diarization”。
代码要求
本文以uisrnn包文件为例,讨论该项目的命名风格。参考的命名规范是Google Python Style Guide,该文档是Google团队所用的代码规范,本项目的团队也是来自Google的。下文中将列举一些该规范中的代码风格要求,并且考察该项目的风格十分符合规范。
目录结构
可以看到,该项目和通常的 Github 项目一样,将说明文档、许可证等文件置于根目录,与运行相关的、需要用户直接使用的脚本文件也放在根目录。这些都是与用户直接接触的文件,放在根目录便于用户使用。
算法的核心部分放在uisrnn文件夹,该算法是基于Pytorch框架实现的,按照网络结构、代价函数、参数、工具函数等分为了几个不同的文件。
tests文件中存放了测试文件,data文件夹中存放了测试数据,此外,项目的一些宣传文档和资源被放在了docs文件夹和resources文件夹中。
本项目的目录组织比较合理,用户使用方便,相关的文件也得到了聚合。
命名
表中前三列是Google Python Style Guide中要求的,同时也是Python之父Guido推荐的规范的命名规范,第四列是该项目所用命名举例。
Type | Public | Internal | Examples |
---|---|---|---|
Modules | lower_with_under | _lower_with_under | uisrnn、utils |
Packages | lower_with_under | uisrnn | |
Classes | CapWords | _CapWords | BeamState、UISRNN |
Exceptions | CapWords | TypeError | |
Functions | lower_with_under() | _lower_with_under() | weighted_mse_loss |
Global/Class Constants | CAPS_WITH_UNDER | _CAPS_WITH_UNDER | _INITIAL_SIGMA2_VALUE |
Global/Class Variables | lower_with_under | _lower_with_under | |
Instance Variables | lower_with_under | _lower_with_under (protected) or __lower_with_under (private) | look_ahead |
Method Names | lower_with_under() | _lower_with_under() (protected) or __lower_with_under() (private) | fit_concatenated、_calculate_score |
Function/Method Parameters | lower_with_under | look_ahead_seq | |
Local Variables | lower_with_under |
可以看到,本项目命名基本符合Google Python Style Guide的规范。项目中一些变量名为了可读性使用了较长的单词,很多变量名都很长,可读性有时反而会有所下降。
其他规范
参考Google Python Style Guide,下面列举了一些其他方面的代码规范,这些规范该项目基本都遵守了:
- 不要在行尾加分号, 也不要用分号将两条命令放在同一行。
- 每行不超过80个字符。
- 除非是用于实现行连接, 否则不要在返回语句或条件语句中使用括号。
- 用4个空格来缩进代码。
- 顶级定义之间空两行, 方法定义之间空一行。
- 括号内不要有空格。
注释
该项目严格按照代码规范的要求写了注释,包括函数文档、类文档、模块许可证,逻辑比较复杂之处还额外添加了行注释,对于使用者来说已经足够方便,但是如要理解代码,能再多写一些注释就更好了。
下面列举一些行注释的要求,该项目基本做到了:
- 最需要写注释的是代码中那些技巧性的部分。
- 为了提高可读性,注释应该至少离开代码2个空格。
- 绝不要描述代码。假设阅读代码的人比你更懂Python, 他只是不知道你的代码要做什么。
单元测试
该项目对核心模块uisrnn.py、utils.py、evals.py都按模块生成了单元测试文件,保证了每个模块能够正常工作。
总结
该项目风格严谨,命名规范,注释详尽合理,此种代码风格值得我们学习。
分析UIS-RNN源代码的代码规范和风格的更多相关文章
- C++入职学习篇--代码规范(持续更新)
C++入职学习篇--代码规范(持续更新) 一.头文件规范 在头文件中大家一般会定义宏.引入库函数.声明.定义全局变量等,在设计时最后进行分类,代码示范(自己瞎琢磨的,请多多指点): #ifndef T ...
- 代码规范审查 – Sonar分析项目
Sonar搭建成功之后,就可以通过简单的CMD指令进行项目分析,此篇主要介绍使用Sonar来分析.net项目. 扫描步骤: a. 打开CMD,切换到指定的项目根目录,和.sln同级目录即可(此处 ...
- Jenkins系列——使用checkstyle进行代码规范检查【升级版】
1.背景 在<Jenkins系列——使用checkstyle进行代码规范检查>一文中完成了ant实现代码规范检查的例子.但存在以下缺陷: 每个作业都需要配置一个不同的checkstyle ...
- 好代码是管出来的——.Net中的代码规范工具及使用
上一篇文章介绍了编码标准中一些常用的工具,本篇就具体来介绍如何使用它们来完成代码管理. 本文主要内容有: Roslyn简介 开发基于Roslyn的代码分析器 常用的基于Roslyn的代码分析器 在.N ...
- 玩转Eclipse — 自动代码规范检查工具Checkstyle
大项目都需要小组中的多人共同完成,但是每个人都有自己的编码习惯,甚至很多都是不正确的.那么如何使小组所有开发人员都遵循某些编码规范,以保证项目代码风格的一致性呢?如果硬性地要求每个开发人员在提交代码之 ...
- Java静态检测工具/Java代码规范和质量检查简单介绍(转)
静态检查: 静态测试包括代码检查.静态结构分析.代码质量度量等.它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行.代码检查代码检查包括代码走查.桌面检查.代码审查等,主要检查代码 ...
- Net中的代码规范工具及使用
Net中的代码规范工具及使用 https://www.cnblogs.com/selimsong/p/9209254.html 上一篇文章介绍了编码标准中一些常用的工具,本篇就具体来介绍如何使用它们来 ...
- 扩展阿里p3c实现自定义代码规范检查
前段时间fastjson报出了漏洞,只要打开setAutoType特性就会存在风险,自己测试环境的一个项目被揪出来了-_-!.虽然改动很小,但就是觉得憋屈.fastjson还是挺好的,想着禁用的话太 ...
- 前端规范之JS代码规范(ESLint + Prettier)
代码规范是软件开发领域经久不衰的话题,几乎所有工程师在开发过程中都会遇到或思考过这一问题.而随着前端应用的大型化和复杂化,越来越多的前端团队也开始重视代码规范.同样,前段时间,笔者所在的团队也开展了一 ...
随机推荐
- Cairo初探
https://blog.csdn.net/flexwang_/article/details/38000401 二维解析pdf
- python学习之列表,元祖,字典
python基础 列表 [ ] stats =[1,2,3,4,5] 元素1,2,3,4,5 下标,索引,角标,初始从0开始 增加 stats.append(7)#append方法添加 stats. ...
- Hibernate初探之单表映射——创建对象-关系映射文件
编写一个Hibernate例子 第三步:创建对象-关系映射文件 以下是具体实现步骤: 找到我们要持久化的学生类Sudents 生成对象-关系映射文档Students.hbm.xml: <?xml ...
- Mysql+keepalived
测试环境 192.168.2.201 master slave 192.168.2.202 master slave 配置流程:安装MySQL->优化系统->优化配置my.cnf-> ...
- duilib学习领悟(4)
使用duilib创建的主窗口绘制工作全都发生在一个 真实存在的主窗口句柄当中,这个绘制过程稍稍有些复杂,但再复杂也逃不过WM_PAINT消息,所有的绘制工作也都由这个WM_PAINT消息完成.在上几篇 ...
- C# ClickOnce发布方式
首先编写ClickOnce更新事件, private void button1_Click(object sender, EventArgs e) { if (ApplicationDeploymen ...
- 001_89C52之_Proteus_ADC0809采集电压
一)使用ADC0809采集直流电压 1. 第一个数码管显示的是采样输入口 2. 后面三位是采样电压 (二)使用ADC0809进行交流电的采样 1. 先进行交流电降压,即用变压器降压后使用整桥电路进行整 ...
- 004_linux驱动之_class_create创建一个设备类
(一)解析:class_create函数和class_destroy函数 创建一个类 和 删除一个类. (二)class_create函数原型 struc ...
- Django—Ajax
Ajax-get url url(r'^ajax_add/', views.ajax_add), url(r'^ajax_demo1/', views.ajax_demo1), 视图 def ajax ...
- dubbo——高可用性
一.zookeeper宕机 zookeeper注册中心宕机,还可以消费dubbo暴露的服务 健壮性: 监控中心宕掉不影响使用,只是丢失部分采样数据 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询, ...