2012年9月19日星期三

第七章 高质量的子程序

第七章 高质量的子程序

什么是子程序?子程序是为实现一个特定的目的而编写的一个可以被调用的方法或过程。比如:JAVA中的方法。

什么是高质量?高质量是没有滥用子程序,在创建子程序的时候,满足各种各样的规范特征,具备各种各样的优点的子程序成为高质量的子程序

一、创建子程序的正当理由

  • 降低复杂度:通过子程序可以帮助开发者隐藏一些信息,这样就不用开发人员考虑被隐藏部分的具体逻辑数据了。
  • 引入中间、易懂的抽象:在隐藏信息的同时,给子程序一个通俗易懂的名称,那么对于代码阅读方面有很大帮助。
  • 避免代码重复:子程序通过代表着一个功能,一个算法。它通常会在很多地方调用。子程序使得其内部的代码无需重复的编写,出现在整个代码的不同地方。
  • 支持子类化:覆盖,子类中覆盖其父类的方法。
  • 隐藏顺序:将处理事件、动作的具体执行顺序隐藏起来。
  • 隐藏指针操作:指针操作的可读性通常很差,也容易出错。子程序可以将指针的相关操作隐藏起来,使得程序员可以关注程序本身的意图(站的高一点,稍微宏观的角度)
  • 提高可移植性:通过子程序将项目中可移植的部分和不可移植的部分隔离开来,为代码重用奠定基础。
  • 简化复杂的布尔判断:1.将判断的细节隐藏起来,2.一个具有描述性的函数名称可以概括出此判断的意图。
  • 改善性能:通过子程序,可以针对某一个子程序进行优化,无需花费很长的时间去寻找,节省时间。
  • 确保所有的子程序都很小:根据代码环境,根据功能点的需要决定。

二、在子程序层上的设计

高内聚:子程序中各种操作之间联系的紧密程度。我们的目标是一个子程序只把一件事做好,不再做其他任何事。

  • 功能的内聚性:让子程序只执行一项操作。而且执行的操作与其名字相符,如果还做了其他的工作,那么就不够内聚。
  • 顺序上的内聚性:子程序内部包含有需要按特定顺序执行的操作。从上到下,从左到右,一步一步,不可调换的。
  • 通信上的内聚性:一个子程序的不同操作,需要同样的数据。
  • 临时的内聚性:一些因为需要执行同样的数据而集合到一起操作的子程序。

下面是不可取的内聚

  • 过程上的内聚性
  • 逻辑上的内聚性
  • 巧合的内聚性

三、好的子程序的名字

好的名字,very important、

  • 描述子程序所做的所有事情
  • 避免使用无意义的、模糊的或者表达不清的动词
  • 不要仅通过数字来形成不同的子程序名字
  • 根据需要确定子程序名字的长度
  • 给程序命名时对返回值有所描述
  • 给过程起名是使用语气强烈的动词加宾语的形式
  • 准确的使用对仗词(in/out….)

四、子程序可以写多长

上百行代码的子程序,好像还没写过。比较喜欢轻巧的。

五、如何使用子程序参数

  • 按照输入-修改-输出的顺序排列参数  不要随机的摆放参数的位置。
  • 如果几个子程序都使用了类似的一些参数,应该让这些参数的排列具有一致性
  • 使用所有的参数   子程序的参数一定要使用到,假如不使用的话,就删掉这个参数
  • 把状态或者出错变量放在最后 
  • 不要使用子程序的参数作为工作变量     参数在起初作为一个输入函数进入子程序,本身的命名通常具有输入的意图。将其作为输出的话,容易造成误解。
  • 在接口中对参数的假定加以说明     类似注释的东西,希望在创建子程序之处就写,因为子程序创建完成之后,很难记住起初的假定。
  • 把子程序的参数个数限制在大约7个以内
  • 考虑对参数采用某种表示输入、修改、输出的命名规则    以in_开头,以out_开头等
  • 为子程序传递用以维持其接口抽象的变量或对象    不懂~~~
  • 使用具名参数   将参数对应起来,类似对仗。
  • 确保实际参数与形式参数相匹配    类型相同

六、使用函数时要特别考虑的问题

  1. 什么时候使用函数,什么时候使用过程   函数是有返回值的子程序,过程是没有返回值的子程序。如果子程序的主要用途就是返回其名字指明的返回值,那么就应该使用函数,否则就应该使用过程。
  2. 设置函数的返回值
  • 检查所有可能的返回的路径
  • 不要返回指向局部数据的引用

七、宏子程序和内联子程序

提到的知识点,都不了解。


TAG: