结合工程实践选题相关的一套源代码,根据其编程语言或项目特点,分析其在源代码目录结构、文件名/类名/函数名/变量名等命名、接口定义规范和单元测试组织形式等方面的做法和特点;

列举哪些做法符合代码规范和风格一般要求;

列举哪些做法有悖于“代码的简洁、清晰、无歧义”的基本原则,及如何进一步优化改进;
总结同类编程语言或项目在代码规范和风格的一般要求。

我的工程实践题目是《多人对话场景中音频分离》,题目要求的任务即说话人区分(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源代码的代码规范和风格的更多相关文章

  1. C++入职学习篇--代码规范(持续更新)

    C++入职学习篇--代码规范(持续更新) 一.头文件规范 在头文件中大家一般会定义宏.引入库函数.声明.定义全局变量等,在设计时最后进行分类,代码示范(自己瞎琢磨的,请多多指点): #ifndef T ...

  2. 代码规范审查 – Sonar分析项目

    Sonar搭建成功之后,就可以通过简单的CMD指令进行项目分析,此篇主要介绍使用Sonar来分析.net项目. 扫描步骤: a.    打开CMD,切换到指定的项目根目录,和.sln同级目录即可(此处 ...

  3. Jenkins系列——使用checkstyle进行代码规范检查【升级版】

    1.背景 在<Jenkins系列——使用checkstyle进行代码规范检查>一文中完成了ant实现代码规范检查的例子.但存在以下缺陷: 每个作业都需要配置一个不同的checkstyle ...

  4. 好代码是管出来的——.Net中的代码规范工具及使用

    上一篇文章介绍了编码标准中一些常用的工具,本篇就具体来介绍如何使用它们来完成代码管理. 本文主要内容有: Roslyn简介 开发基于Roslyn的代码分析器 常用的基于Roslyn的代码分析器 在.N ...

  5. 玩转Eclipse — 自动代码规范检查工具Checkstyle

    大项目都需要小组中的多人共同完成,但是每个人都有自己的编码习惯,甚至很多都是不正确的.那么如何使小组所有开发人员都遵循某些编码规范,以保证项目代码风格的一致性呢?如果硬性地要求每个开发人员在提交代码之 ...

  6. Java静态检测工具/Java代码规范和质量检查简单介绍(转)

    静态检查: 静态测试包括代码检查.静态结构分析.代码质量度量等.它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行.代码检查代码检查包括代码走查.桌面检查.代码审查等,主要检查代码 ...

  7. Net中的代码规范工具及使用

    Net中的代码规范工具及使用 https://www.cnblogs.com/selimsong/p/9209254.html 上一篇文章介绍了编码标准中一些常用的工具,本篇就具体来介绍如何使用它们来 ...

  8. 扩展阿里p3c实现自定义代码规范检查

     前段时间fastjson报出了漏洞,只要打开setAutoType特性就会存在风险,自己测试环境的一个项目被揪出来了-_-!.虽然改动很小,但就是觉得憋屈.fastjson还是挺好的,想着禁用的话太 ...

  9. 前端规范之JS代码规范(ESLint + Prettier)

    代码规范是软件开发领域经久不衰的话题,几乎所有工程师在开发过程中都会遇到或思考过这一问题.而随着前端应用的大型化和复杂化,越来越多的前端团队也开始重视代码规范.同样,前段时间,笔者所在的团队也开展了一 ...

随机推荐

  1. java8之Metaspace

         HotSpot JVM是java中最常用的java虚拟机.在java8 HotSpot JVM 中,虚拟机的内存模型做了修改调整.以前HotSpot JVM的内存模型分为新生代,老年代,永久 ...

  2. C# EPPlus 导出Excel

    一.Excel导出帮助类 /*引用NuGet包 EPPlus*/ /// <summary> /// Excel导出帮助类 /// </summary> public clas ...

  3. tkinter_战队数据查询系统

    # 导入tkinter模块 import tkinter from tkinter import ttk # 导入库 import pymysql # 创建主窗口对象 root = tkinter.T ...

  4. [唐胡璐]Selenium技巧- 如何处理Table

    由于webdriver中没有专门的table类,所以我们需要简单的封装出一个易用易扩展的Table类来帮助简化代码。 以下是我之前用C#语言来实现的一个简单的封装: 只是一个大概的思路,有些具体实现就 ...

  5. 使用docker配置gitlab服务器

    下载gitlab镜像,导入 [root@gitlab ~]# docker load < gitlab_zh.tar 容器需要22端口,所以修改ssh的默认端口 [root@gitlab ~]# ...

  6. IO 的底层实现问题

    最近在看 JAVA NIO 的相关知识,了解一下IO的底层实现原理. IO涉及到的底层的概念大致如下: 1) 缓冲区操作.2) 内核空间与用户空间.3) 虚拟内存.4) 分页技术. 一,虚拟存储器 虚 ...

  7. 解决zabbix的cannot allocate shared memory of size错误

    问题状态:zabbix_server 不能启动,系统CentOS 6.7 原因分析:这是因为内核对share memory的限制造成的. 用到如下命令ipcs [-m|l|a],sysctl [-a| ...

  8. mapreduce 倒序 排序 最简单 易上手

    对于mapreduce倒序只需要建立一个类,然后继承WritableComparator 在重写 Compare函数最后在main里调用一下,就可以实现倒序排序: 代码: public static ...

  9. Echarts案例-柱状图

    一:先在官网下载 https://www.echartsjs.com/zh/download.html 然后再建立工程,导入这两个包: 写代码: <!DOCTYPE html> <h ...

  10. HDU 1114 Piggy-Bank ——(完全背包)

    差不多是一个裸的完全背包,只是要求满容量的最小值而已.那么dp值全部初始化为inf,并且初始化一下dp[0]即可.代码如下: #include <stdio.h> #include < ...