分析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)
代码规范是软件开发领域经久不衰的话题,几乎所有工程师在开发过程中都会遇到或思考过这一问题.而随着前端应用的大型化和复杂化,越来越多的前端团队也开始重视代码规范.同样,前段时间,笔者所在的团队也开展了一 ...
随机推荐
- 玩深度学习选哪块英伟达 GPU?有性价比排名还不够!
本文來源地址:https://www.leiphone.com/news/201705/uo3MgYrFxgdyTRGR.html 与“传统” AI 算法相比,深度学习(DL)的计算性能要求,可以说完 ...
- Oracle自动化安装脚本-part02-亲试ok
此为网络配置文件 network.conf [PUBLIC-IP] IP-LIST:192.168.7.198,192.168.8.221 HOSTNAME-LIST:mysql-198,RAC2 ...
- 将CHROME WEBSTORE里的APPS和扩展下载到本地 转载自:http://ro-oo.diandian.com/post/2011-05-28/1103036
Chrome Webstore 自动改版后就不能再直接下载到本地... 下载地址: https://clients2.google.com/service/update2/crx?response=r ...
- hbase实践之flush and compaction
本文主要涉及flush流程,探讨flush流程过程中引入的问题并阐述2种解决策略,最后简要说明Flush执行策略. 对于Compaction,本文主要探讨Compaction要解决的本质问题以及由Co ...
- docker容器日志管理
docker容器日志分为两类:docker引擎日志(Docker本身运行的日志)和容器日志(各个容器内产生的日志) 一.Docker引擎日志: Centos系统下的docker引擎日志一般给syste ...
- sql 查询 between and 和 >= <= 比较
好久没有更新博客了,积累了很多问题没有得到解决,自己也在纠结有些东西需不需要花时间研究一下,认真想了想,不管怎么样,不能停止更新博客,继续保持一周至少一篇的习惯,不能放弃. 今天说的问题比较简单,就是 ...
- python自动华 (六)
Python自动化 [第六篇]:Python基础-面向对象 目录: 面向过程VS面向对象 面向对象编程介绍 为什么要用面向对象进行开发 面向对象的特性:封装.继承.多态 面向过程 VS 面向对象 ...
- Windows服务操作
资料 https://docs.microsoft.com/zh-cn/dotnet/api/system.serviceprocess.servicecontroller?redirectedfro ...
- winfrom窗体自适应
using System.Runtime.InteropServices; public class Win32 { public const Int32 AW_HOR_POSITIVE = 0x00 ...
- Asia-Jakarata 2018
目录 Contest Info Solutions Problem A. Edit Distance Problem C. Smart Thief Problem D.Icy Land Problem ...