个人工程实践课题是《手写中文汉字识别》,涉及深度学习与神经网络方面的知识,所以这里我找了一份对路透社数据集进行文本分类的源码,对其代码规范和风格进行讨论。python
1.结合工程实践选题相关的一套源代码,根据其编程语言或项目特色,分析其在源代码目录结构、文件名/类名/函数名/变量名等命名、接口定义规范和单元测试组织形式等方面的作法和特色编程
源码结构以下:小程序
(因为图片太长无法所有截屏,我用python写了一个拼接的小程序分两次截屏而后拼起来了)后端
代码中导入的库有tensorflow、keras、numpy和 matplotlib,这都是一些经常使用的库。其中keras框架是以tensorflow为后端运行的。网络
文件名/类名/函数名/变量名等命名框架
文件名:文件名是我本身命名的,没有实际意义。编程语言
类名:这个源代码中并无定义类,不过在python中,类是面对对象编程中重要的概念,通常定义类的格式为:函数
class 类名:单元测试
def __init__(self):学习
self.属性=...
def 方法(self,...):
......
和C++中类的定义类似,但更加简单明了。
函数名:这份源代码中只定义了一个函数vectorize_sequences(),其余都是调用库中的函数,好比“reuters.load_data()、reuters.get_word_index()、model.add()、plt.show()”等等。
变量名:这份源代码中的变量格外的多,但为了读代码的人更容易理解,取得名字会尽可能一目了然,好比“train_data[10]、train_labels[10]、model、x_val、y_val、val_loss”等等,看到变量名就能够猜到用途。
接口定义规范和单元测试组织形式等方面的作法和特色
在python中接口主要的途径就是导入,因此这里分析在python语言中导入的规范。可见这里导入的接口都写在了源代码的最前面,导入应该按照从最通用到最不通用的顺序分组:
1.标准库导入
2.第三方库导入
3.应用程序指定导入
在python中,对单个文件进行测试的方法就是利用main函数,所以,代码应该在执行主程序前老是检查 if name == 'main' , 这样当别的模块被导入时主程序就不会被执行。
2.列举哪些作法符合代码规范和风格通常要求
因为本文源代码是使用python书写的,所以在这里主要基于python语言的书写规范和风格写一写:
Python语言规范
1. imports 仅仅用作包和模块的导入,包的导入每一个尽可能独占一行
2. packages 导入模块尽可能使用模块的全路径
3. Exceptions 必须当心使用
4. Global variables 避免使用全局变量
5. Generator
6. lambda 函数仅仅适用于一行代码能实现的简单函数
7. True or False 尽可能使用[],'',{},0,None来隐式表示False
Python风格规范
一、代码编排
1 缩进:4个空格实现缩进,尽可能不使用Tab,禁止混用Tab和空格
2 行:每行最大长度不超过79,换行可使用反斜杠(\)。最好使用圆括号将换行内容括起来,不建议使用“;”
3 空行:类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其余地方尽可能不要再空行。
4 空格:括号内的第一个位置,不要空格。紧靠右括号的位置也不要空格。冒号(:)、逗号(,)、分号(;)以前不要加空格。切片木有参数,不要加空格等
5 括号:对于单元素tuple必定要加,和括号
二、命名规范
module_name
package_name
ClassName
method_name
ExceptionName
function_name
GLOBAL_CONSTANT_NAME
global_var_name
instance_var_name
function_parameter_name
local_var_name
三、注释规范
1.块注释,在一段代码前增长的注释。在‘#’后加一空格。段落之间以只有‘#’的行间隔。好比:
# Description : Module config. # # Input : None # # Output : None
2. 行注释,在一句代码后加注释。好比:x = x + 1 # Increment x 可是这种方式尽可能少使用。
3. 避免无谓的注释。
四、编程建议
1. 字符串拼接,尽可能使用join。使用str的方法而不是内置方法。使用startswith或endswith拉检查前缀和后缀
2. 单例对象,尽可能使用is 、is not,不要使用==
3. 使用is not而不是not is
4. 使用def来定义函数,而不是将匿名函数赋给某个变量
5. 尽可能使代码整齐,简洁
6. 使用isinstance()来判断instance的类型
3.列举哪些作法有悖于“代码的简洁、清晰、无歧义”的基本原则,及如何进一步优化改进
对于python代码来讲,缩进的使用是很是重要的,合理使用缩进也使得代码看起来简洁明了,但缩进使用的不正确就会致使代码产生歧义从而出错。优化能够经过单步调试程序来进行。
4.总结同类编程语言或项目在代码规范和风格的通常要求
对于python程序而言:
·仅对包和模块使用导入,即模块间共享代码的重用机制,命名空间管理约定十分简单. 每一个标识符的源都用一种一致的方式指示. x.Obj表示Obj对象定义在模块x中.
·使用模块的全路径名来导入每一个模块,避免模块名冲突. 查找包更容易。
·容许使用异常, 但必须当心。经过使用异常,咱们能够在错误发生的时候继续执行与这个错误无关的余下代码,维持程序的正常运行。
·避免使用全局变量,即定义在模块级的变量,由于导入时可能会改变模块行为。
·鼓励使用嵌套/本地/内部类或函数。
·使用单行函数时推荐使用条件表达式,简化if语句。
·构建函数时鼓励使用默认值。
·不要在行尾加分号, 也不要用分号将两条命令放在同一行。
·每行不超过80个字符。
·宁缺毋滥的使用括号。
·用4个空格来缩进代码,即悬挂缩进,此时第一行不该有参数。
·顶级定义之间空两行, 方法定义之间空一行。好比类定义之间应该空两行。
·按照标准的排版规范来使用标点两边的空格。一个函数必需要有文档字符串好比:在逗号、分号后加空格;通常表达式在等号的两端加空格;括号里不要有空格等。
·确保对模块, 函数, 方法和行内注释使用正确的风格。好比:一个函数应该要有注释,包含函数作什么, 以及输入和输出的详细描述。对于块注释(#)和行注释(""" """)的使用,也要细心考量。
·最后着重说一下命名的规范:
1)“Internal”表示仅模块内可用, 或者, 在类内是保护或私有的.
2)用单下划线“_”开头表示模块变量或函数是protected的(使用from xxx import *时不会包含在内).
3)用双下划线“__”开头的实例变量或方法表示它是private的.
4)将相关的类和顶级函数放在同一个模块里。
5)对类名使用大写字母开头的单词(如Car), 可是模块名应该用小写加下划线的方式(如speed)。
6)应避免:单字符名称(除了计数器和迭代器);包/模块名中的连字符“-”;双下划线开头并结尾的名称。