zoukankan      html  css  js  c++  java
  • 子程序设计原则

    子程序(routines)是为实现一个特定功能而编写的一个可被调用的方法(method)、函数(function)或过程(procedure)。如Java中的方法,C++里的函数。现代编程语言如Java、C++、VB、JavaScript、Ruby等都同时支持函数和过程。

    一般认为函数指具有返回值的子程序,过程指没有返回值的子程序。C++中把所有子程序成为函数,其实那些返回值为void的函数在语义上也是过程。函数与过程的区别更多是语义上的区别,而不是语法的区别。

    语言纯化论者认为一个函数应该只有一个返回值,这和数学函数一样。即函数只接受输入(参数),通过参数运算返回结果。 除此之外的效果被称为函数的副作用,比如修改全局变量。

    以JS示例

    function sum1(x, y) {
        return x+y    
    }
    function sum2(x, y) {
        alert(x+y)    
    }
    

    sum1是一个函数,它有输入并返回结果;sum2则是过程,接受输入,处理输入(打印输出结果),但没有返回结果。

    好的子程序需要遵循以下原则

    • 高内聚
    • 好的命名
    • 长度适中
    • 合理的参数

    一、高内聚性

    内聚性是计算机科学里很重要的一个概念,由Larry Konstantin在1974年的一篇论文提出。它由分为以下

    1. 功能内聚(Functional cohesion,最高

    最好最强的一种内聚性,即一个子程序仅执行一个操作,有的书也称“只做一件事,做好一件事”。这种子程序执行的操作与其名称多数是相符的,如sum执行相加,deletePage删除页面。

    2. 顺序上的内聚(Sequential cohesion

    指子程序内需按特定顺序执行操作,这些步骤需要共享数据,且在全部执行后才完成子程序的完整功能。比如需要先计算A,再使用A计算B,接着取B计算C。

    3. 通信上的内聚(Communicational cohesion

    是指子程序不同操作使用了相同数据,但不存在任何联系。

    4. 临时的内聚性(Temporal cohesion

    是指含有一些因为需要同时执行才放到一起的操作的子程序。

    5. 逻辑上的内聚性(Logical cohesion

    是指若干操作被放入同一个程序中,通过传入的控制标志选择执行其中的一项操作。

    6. 偶热的内聚性(Coincidental cohesion 最低

    指子程序中各个操作直接没有可以看到的内联,也称为“无内聚性”或“混乱的内聚性”。

    二、好的命名

    好的命名能清晰的描述子程序所做的一切。以下是一些命名注意事项

    1. 描述子程序所完成的功能

    2. 避免使用无意义的、模拟或表达不清的词

    3. 不要仅通过数字来区分不同的子程序名

    4. 根据需要确定子程序名字的长度

    5. 对返回值要有所描述

    6. 一般是动词+名词形式

    7. 使用对仗词,如add/remove, begin/end, first/last, get/put, up/down/, show/hide, open/close。

    三、长度适中

    “子程序/函数的第一要素就是短小,第二条规则还是短小”,鲍勃大叔如此说。理论上认为子程序的长度最大长度通常是一屏代码,大约50-150行。

    一项对子程序的研究发现,平均100-150行代码的子程序需要修改的几率最低(Lind and Vairavan 1989)。

    IBM一项研究发现,最容易出错的是那些超过500行代码的子程序。超过500行后,子程序的出错率和代码行数成正比。在面向对象编程中,一大部分子程序都是访问器子程序(getter),它们都非常短小。任何时候复杂算法总会导致较长的子程序,这种情况下允许长度增加到100到200行。

    四、合理的参数

    子程序之间的接口是程序中最易出错的地方,Basili和Perrricone所做的一项研究发现程序中39%的错误都是属于内部接口错误。也就是子程序间互相通信时所发生的错误。应该按以下原则处理

    1. 按照输入-修改-输出的顺序排列参数。不要随机地按字母顺序排列参数,而应先列出输入参数,然后是即作为输入又作为输出的参数,最后是输出的参数。比如Ada就要专门的关键字in,out。

    procedure InvertMatrix {
        originalMatrix: in Matrix;
        resultMatrix: out Matrix;
    }
    

    2. 如果几个子程序都用了类似的一些参数,应该让这些参数的排列顺序一致。

    dom = {
        setWidth: function(elem, value) {
            // ...
        },
    
        setHeight: function(elem, value) {
            // ...
        }
    }
    

    3. 使用所有的参数,既然定义了该参数就应该使用它,如果不用它就应该删掉它。

    4. 把状态或出错的变量放在后面,状态和那些用于指示发生错误的变量应放在参数表最后。它们只是程序的附属功能且只用于输出的参数。

    5. 不要把子程序的参数用于工作变量

    function process(inputVal) {
        inputVal = inputVal - 10;
        return inputVal  
    }
    

    这段JS代码中,省略了一个变量声明,inputVal很容易让人误解,即是输入又是输出,改为如下

    function process(inputVal) {
        var outputVal = inputVal - 10;
        return outputVal  
    }
    

      

    6. 子程序的参数个数限制在7个以内。鲍勃大叔说的更极端 “最理想的参数数量是零,其次是单参数函数,再次是双参数函数,应尽量避免三参数函数”。心理学研究发现,人类很难记住超过7个单位的信息。这一发现已应用在各个领域。  

    相关:

    Miller 神奇数字7

    子程序(过程、函数、方法)

  • 相关阅读:
    14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp
    14.1 NFS介绍 14.2 NFS服务端安装配置 14.3 NFS配置选项
    13.4 mysql用户管理 13.5 常用sql语句 13.6 mysql数据库备份恢复
    13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令
    12.21 php-fpm的pool 12.22 php-fpm慢执行日志 12.23 open_basedir 12.24 php-fpm进程管理
    12.17 Nginx负载均衡 12.18 ssl原理 12.19 生成ssl密钥对 12.20 Nginx配置ssl
    12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置 12.16 Nginx代理
    在界面workspacebar上添加的OnContextMenu函数打的断点始终进不去,显示当前不会命中断点还未为文档加载任何符号
    VS2019安装闪退, 不出现安装界面,解决办法
    BCGP单元格多列合并需要注意的
  • 原文地址:https://www.cnblogs.com/snandy/p/3720006.html
Copyright © 2011-2022 走看看