zoukankan      html  css  js  c++  java
  • 对一套源代码的规范和风格的讨论及优化改进

      我的工程实践是机器学习相关,因此我在GitHub上选了下面的源代码进行学习:https://github.com/WillKoehrsen/machine-learning-project-walkthrough

    一、对源代码的分析

      1、目录结构

      该源代码使用Python语言,在jupyter notebook上编写。在文件目录下有auto_ml、data、deprecated、images四个文件夹和Machine Learning Project Part 1.ipynb、Machine Learning Project Part 2.ipynb、Machine Learning Project Part 3.ipynb等源代码文件,其中:

      文件夹auto_ml中存放的是管道程序;

      文件夹data中存放的是该项目的训练集和测试集等数据压缩包;

      文件夹deprecated中存放的是对数据进行探索的程序文件;

      文件夹images中存放的是该项目用到的图像文件。

      

      2、代码风格

       由于该项目没有使用类,所有暂不讨论类的相关问题。我们随机选取了源代码中的一段个函数实现代码。

      

    • 代码中实现不同功能的部分用空行隔开,并且在前面都有对本段功能描述的注释语句,清晰易懂;
    • 函数的命名和变量的命名都采用英文半拼+英文全拼且用下划线隔开的组合方式,容易理解该函数或变量表达的含义。但是命名并没有采用Python语言推荐的驼峰命名方式,虽然仍然清晰明了,不过还是建议改为驼峰命名方式;
    • 代码的缩进和空格的使用都符合Python的规范;
    • 由于Jupyter Notebook有独特的代码块编辑方式,可以插入注释说明性的代码块,这样代码的脉络就会更为清晰如下图所示:

      

      

      3、改进建议:

      

    • 如上图第9行代码所示,一行中写了两句代码,这是不规范的行为,建议改为每行一句代码;
    • 还有第2部分所描述的变量命名改为驼峰命名方式。

     二、总结同类编程语言或项目在代码规范和风格的一般要求

      通过对源代码的学习以及相关资料的查阅,下面对python语言的规范和风格做一下总结:

      1、注释的使用

    • 注释的使用在编程中非常重要,因为代码不仅仅是拿来给机器运行的,还是给自己或者别人看的;
    • 要用英文写注释;
    • 如果一个注释是一个短语或句子,它的第一个单词应该大写,除非它是以小写字母开头的标识符
    • 修改代码的时候一定要同步更改注释,代码与注释矛盾会给阅读代码带来很大的困扰;
    • 尽量使用块注释,少使用行注释;
    • 避免没有必要的注释。

      2、缩进

    • 整齐的缩进会使得代码条理清楚,整洁易读;
    • 空格是首选的缩进方式,制表符只能用于与同样使用制表符缩进的代码保持一致,Python3不允许同时使用空格和制表符的缩进
    • 每一级缩进使用4个空格。
    • 续行应该与其包裹元素对齐,要么使用圆括号、方括号和花括号内的隐式行连接来垂直对齐,要么使用挂行缩进对齐;
    • 当使用挂行缩进时,应该考虑到第一行不应该有参数,以及使用缩进以区分自己是续行;
    • 每行最大长度79,换行可以使用反斜杠,最好使用圆括号,换行点要在操作符的后边敲回车。

      3、空格的使用

    • 各种右括号前不要加空格;
    • 逗号、冒号、分号前不要加空格;
    • 函数的左括号前不要加空格。如Func(1);
    • 序列的左括号前不要加空格。如list[2];
    • 操作符左右各加一个空格,不要为了对齐增加空格;
    • 函数默认参数的赋值符左右省略空格;
    • 不要将多句语句写在同一行,尽管使用‘;’允许;
    • if/for/while语句中,即使执行语句只有一句,也必须另起一行。

      4、命名规范

    • 那些暴露给用户的API接口的命名,应该遵循反映使用场景而不是实现的原则
    • 永远不要使用字母‘l’(小写的L),‘O’(大写的O),或者‘I’(大写的I)作为单字符变量名。在有些字体里,这些字符无法和数字0和1区分,如果想用‘l’,用‘L’代替;
    • 模块应该用简短全小写的名字,如果为了提升可读性,可以用下划线;
    • 包命名尽量短小,使用全部小写的方式,不可以使用下划线;
    • 类名一般使用首字母大写的约定。在接口被文档化并且主要被用于调用的情况下,可以使用函数的命名风格代替。注意,对于内置的变量命名有一个单独的约定:大部分内置变量是单个单词(或者两个单词连接在一起),首字母大写的命名法只用于异常名或者内部的常量;
    • 类的属性(方法和变量)命名使用全部小写的方式,可以使用下划线;
    • 因为异常一般都是类,所有类的命名方法也适用于异常。然而需要在异常名后面加上“Error”后缀(如果异常确实是一个错误);
    • 函数名应该小写,如果想提高可读性可以用下划线分隔;
    • 始终要将 self 作为实例方法的的第一个参数。始终要将 cls 作为类静态方法的第一个参数;
    • 常量通常定义在模块级,通过下划线分隔的全大写字母命名。例如: MAX_OVERFLOW 和 NUM。
  • 相关阅读:
    关于MFC消息的总结
    关于VS中包含库、附加包含库、
    关于MFC中重载函数是否调用基类相对应函数的问题
    关于子窗口处理自身消息而不扩散给父窗口的问题
    进程与线程理解-1
    程序设计思想-2
    线程与进程
    网路编程之socket与 socketserver、黏包
    网络编程之TCP协议与UDP协议
    网络编程基础
  • 原文地址:https://www.cnblogs.com/happyyouli/p/11660931.html
Copyright © 2011-2022 走看看