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

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

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

我的工程实践题目是《多人对话场景中音频分离》,题目要求的任务即说话人区分(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. usb相关

    https://github.com/daynix/UsbDk/tree/master/UsbDk 更应该关注下libusb

  2. 0011SpringBoot的@EnableWebMvc全面接管SpringMVC的自动配置(源码)

    所谓的@EnableWebMvc全面接管SpringMVC的自动配置,是指@EnableWebMvc注解会使SpringMVC的自动配置失效,原理如下: 1.查看@EnableWebMvc的源码,如下 ...

  3. Pycharm----默认字体大小的设置

    设定前 设定后,修改字体的大小为:15号 设置方式:按照截图操作选择后,点击”apply“即可

  4. mysql对两个字段进行自定义排序

    Mysql order by 多字段排序 ') desc,ADD_DATE desc mysql单个字段降序排序: select * from table order by id desc; mysq ...

  5. wxpython图形化界面编程(一):添加菜单,设置图片大小,添加文本框等,并简要布局

    #-*-encoding:utf-8-*-import wx def loadframe(): app = wx.App() mywindow = myframe() mywindow.Show() ...

  6. C# Transaction 事务处理

    class //student [Serializable] public class Student { public string FirstName { get; set; } public s ...

  7. Java进阶知识21 Spring的AOP编程

    1.概述 Aop:(Aspect Oriented Programming)面向切面编程          功能: 让关注点代码与业务代码分离! 关注点:重复代码就叫做关注点:切面: 关注点形成的类, ...

  8. bzoj3694

    /* * 对于不在最短路树上的边(x, y) * 1 * | * | * t * / \ * / \ * x-----y * 考虑这样一种形态的图, ‘-’ 标记为非最短路树的边 * 对于边集(x, ...

  9. alarm函数

    alarm函数 设置定时器(闹钟).在指定seconds后,内核会给当前进程发送14)SIGALRM信号.进程收到该信号,默认动作终止. 每个进程都有且只有唯一个定时器. unsigned int a ...

  10. nginx下载 并将vue项目部署上去

    这是一个比较全的nginx配置说明:新手可以先忽略,直接往下看:https://www.cnblogs.com/findbetterme/p/11289273.html nginx官网下载地址:htt ...