8高质量子程序剖析ppt课件_第1页
8高质量子程序剖析ppt课件_第2页
8高质量子程序剖析ppt课件_第3页
8高质量子程序剖析ppt课件_第4页
8高质量子程序剖析ppt课件_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

上午3时11分 高质量的子程序High qualityroutines 任课老师 黄武 46 1 上午3时11分 提纲 创建高质量子程序正当理由子程序的内聚性子程序的名字子程序的长度子程序的参数函数还是过程宏子程序和内联函数 46 2 上午3时11分 1 创建高质量子程序正当理由 从低质量的子程序说起 46 3 C 示例 低质量的子程序voidHandleStuff CORP DATA 这个程序有什么问题 上午3时11分 1 1低劣程序可能存在的问题 这个程序目的不明 名字不清 46 4 voidHandleStuff CORP DATA 上午3时11分 1 2低劣程序可能存在的问题 这个程序参数太多 排列不清 46 5 voidHandleStuff CORP DATA 上午3时11分 1 3低劣程序可能存在的问题 这个程序布局不清 结构混乱 46 6 voidHandleStuff CORP DATA 上午3时11分 1 4低劣程序可能存在的问题 这个程序存在太多的神秘数字 46 7 voidHandleStuff CORP DATA 上午3时11分 1 4低劣程序可能存在的问题 这个程序循环不清 存在错误 46 8 voidHandleStuff CORP DATA 上午3时11分 1 5上述子程序存在问题总结 名字不能表达意思 HandleStuff 没有文档说明布局很差 不一致的布局 输入变量inputRect的值被修改使用了全局变量 corExpense子程序没有一个单一的目的使用了很多神秘数据 比如100 4 0 12等子程序的参数太多了 11个 子程序的一些参数未被引用 screenX 子程序的参数混乱并且未经注释 46 9 1 2为什么要构建高质量的子程序 降低代码复杂度易于理解代码重用 节约空间改善性能创建高质量的子程序是创建高质量程序的基础 上午3时11分 46 10 1 2 1降低代码复杂度 隐藏实现细节 隐藏复杂的算法 隐藏顺序 堆栈操作 隐藏指针操作隐藏易变化的部分 提高可移植性 隐藏全局数据 上午3时11分 46 11 1 2 2易于理解 引入中间 易懂的抽象简化复杂的布尔判断例如 IsReady boolIsReady if device bOpen Flag true 上午3时11分 46 12 上午3时11分 1 2 2 1引入中间 易懂的抽象 对于上面的代码 难于一眼看出其含义 如果我们把它写成如下的子函数leafName getLeafName node 那么这个函数让我们很容易理解其含义是获取叶子节点的名字 46 13 以下代码代表什么意思 if nodeNULL thenwhile node nextNULL donode node nextleftName node nameendwhileelseleftName endif 1 2 3代码重用 避免代码重复支持子类化voidFill Compress Data To Disp Buf intiSample Number if iSample Number m iScreen Width intiStart iSample Number m iScreen Width Fill A Segment Compress Data To Disp Buf iStart else Fill A Segment Compress Data To Disp Buf 0 上午3时11分 46 14 上午3时11分 1 3简单操作也可写成子函数 下面的例子为一条语句Points deviceUnits POINTS PER INCH DeviceUnitsPerInch 但要直接理解上面语句的意思并不容易 如果将其写成函数形式Points DeviceUnitsToPoints deviceUnits 函数名具有自解释性 让代码变得清晰 46 15 2 子程序的内聚性 高质量子程序的基础就是子程序的内聚性内聚性是指子程序中各种操作之间联系的紧密程序 上午3时11分 46 16 2 1内聚性的作用 一项针对450个子程序的研究发现 高内聚性的子程序中有50 没有任何错误 而低内聚性的子程序中只有18 没有错误 Card CarchandAgresti1986 另一项针对450个子程序的研究发现 耦合度和内聚性之比最高的和最低的子程序其所含错误相差7倍 SelbyandBasili1991 上午3时11分 46 17 上午3时11分 2 2最好的内聚性 功能内聚性 functionalcohesion 是最强也是最好的一种内聚性 它要求一个子程序只执行一项操作例如 sin getCustomerName eraseFile calculateLoanPayment 46 18 上午3时11分 2 3可用的内聚性 顺序上的内聚性 sequentialcohesion 通讯上的内聚性 communicationalcohesion 临时性的内聚性 temporalcohesion 上午3时11分 46 19 上午3时11分 2 3 1顺序上的内聚性 顺序上的内聚性 sequentialcohesion 是指在子程序内包含有需要按特定顺序执行的操作 这些步骤需要共享数据 而且只有在全部执行完毕后才完成一项完整的功能例如 Get Retire Year DATAbirthday intiAge Get Age birthday intiRetire Get Residual Year iAge return iRetire 如何将顺序内聚性变为功能内聚性 上午3时11分 46 20 上午3时11分 2 2 2通讯上的内聚性 通讯上的内聚性 communicationalcohesion 是指一个子程序中的不同操作使用了同样的数据 但不存在其他任何联系Print Avenue DATAavenue REPORTreport Make Report avenue Print report Initialize avenue 如何将通讯内聚性变为功能内聚性 上午3时11分 46 21 上午3时11分 2 2 3临时性的内聚性 临时性的内聚性 temporalcohesion 是指含有一些因为需要同时执行才放到一起的操作例如 startup shutdown Initialize 如何将临时内聚性变为功能内聚性 上午3时11分 46 22 上午3时11分 2 3不可用的内聚性 过程上的内聚性 proceduralcohesion 逻辑上的内聚性 logicalcohesion 巧合的内聚性 coincidentalcohesion 上午3时11分 46 23 上午3时11分 2 3 1过程上的内聚性 过程上的内聚性 proceduralcohesion 是指一个子程序中的操作是按特定的顺序进行的GetFirstPartofEmployee EMPLOYEEdata GetSecondPartofEmployee EMPLOYEEdata GetOtherPartofEmployee EMPLOYEEdata 如何将过程内聚性变为功能性的内聚性 上午3时11分 46 24 上午3时11分 2 3 2逻辑上的内聚性 逻辑上的内聚性 logicalcohesion 是指若干操作被放入到同一个子程序中 通过传入的控制标志选择执行其中的一项操作 而这些操作之间没有逻辑上的关联通过传入控制标志来控制一个子程序的执行打破了打破了子程序封装性例如 InputAll EditAll 等 上午3时11分 46 25 上午3时11分 2 2 3巧合的内聚性 巧合的内聚性 coincidentalcohesion 是指子程序的各个操作之间没有任何可以看到的关联 因此也被称为 无内聚性 或 混乱的内聚性 课程开始的例子对于这种子程序只能重新设计 上午3时11分 46 26 上午3时11分 3 好的子程序名字 好的子程序名字能清晰地描述子程序的目的 为自说明代码打下基础 有如下原则 描述子程序所做的所有事情避免使用无意义模糊或表述不清的动词不要仅通过数字来形成不同的子程序名字根据需要确定子程序名字的长度 字符 给函数命名时要对返回值有所描述给过程命名时使用动词加宾语的形式准确使用对帐形式为常用操作确定命名规则 46 27 上午3时11分 3 1描述子程序所做的所有事情 子程序的名字应当描述其所有的输出结果以及副作用比如 有一个程序的作用是计算报表总额并打开一个输出文件 则命令为computeReportTotals 是不完整的 应该命名为computeReportTotalsAndOpenOutputFile 如果你感觉上面完整的子程序名字又长又笨 说明子程序本身有问题 46 28 上午3时11分 3 2避免模糊的动词命名子程序 有些动词意义灵活 但含义广泛 表达的意思不清晰 不能用于命名子程序 否则这些子程序的真实意义将无法被理解比如 HandleCalculation PerformServices ProcessInput DealWithOutput 上午3时11分 46 29 上午3时11分 3 3不要仅通过数字来形成不同名字 为了方便序列化的构成子程序 有时采用数字编号形成子程序例如 为了形成不同的模块处理函数 采用数字构成名字 Model1 Model2 Model3 可以吗 上午3时11分 46 30 上午3时11分 3 4准确使用对帐形式 准确对账使程序清楚getData还是readData 上午3时11分 46 31 上午3时11分 3 5为常用操作确定命名规则 没有规则容易造成混乱比如 对于获取对象的标识 可以有多种的命名方式 选择哪种 employee id Get dependent GetID supervisor candidate id 上午3时11分 46 32 上午3时11分 4 子程序可以写多长 现代的计算机程序通常由很多极短的子程序外加少量较长的子程序构成现代程序 短子程序 多 长子程序 少 同学们认为子程序多长为好呢 46 33 上午3时11分 4 1子程序长短对程序的影响 1984年Basili和Perricone所做的一项研究发现 子程序的长度和错误量成反比1985年Shen另一项研究发现 子程序的长度与错误量没有关联1986年Card的一项研究发现 短小的子程序与更低成本或错误率无关 有证据表明 较长的子程序使得每行代码的成本更低 46 34 上午3时11分 4 2子程序长短对程序的影响 续 1986年 IBM公司Jones的一项研究发现 最容易出错的是那些超过500行代码的子程序 超过500行之后 子程序的出错率就会和长度成正比1989年Lind的研究发现 平均长度为100行到150行代码的子程序需要被修改的几率最低1991年SelbyandBasili一项针对450个子程序所做的研究表明 短小的子程序 包括注视在内小于143行 中每行代码所含的错误数量要多23 而长的程序的修改成本要高2 4倍 46 35 上午3时11分 4 3多长的代码合适 数十年的经验表明 100至200行长度的子程序和短小的子程序一样不易出错对于超过200行的程序 没有哪项研究发现它能降低成本或降低出错率 而且可读性也会变差理论上认为子程序最佳最大长度通常是50 150行代码 46 36 上午3时11分 5 如何使用子程序参数 子程序之间的接口是程序中最容易出错的部分之一Basili和Perricone1984年所做的一项研究发现 程序中有39 的错误都是属于内部接口错误 46 37 上午3时11分 5 1减少接口错误的指导原则 按照输入 修改 输出的顺序排列参数如果几个子程序都使用了一些类似的参数 应该让这些参数的排列顺序保持一致使用所有的参数把状态或出错变量放在最后不要把子程序的参数用做工作变量在接口中对参数的假定加以说明把子程序的参数个数限制在7个以内 46 38 上午3时11分 5 1 1按输入 修改 输出顺序排列参数 不要随机排列参数 按照子程序使用参数的顺序排列参数易于记忆和检查 不易出错 46 39 Ada示例 按照输入 修改 输出的顺序排列参数procedureInvertMatrix originalMatrix inMatrix resultMatrix outMatrix procedureChangeSentenceCase desiredCase inStringCase sentence intoutSentence procedurePrintPageNumber pageNumber inInteger status outStatusType 上午3时11分 5 1 2类似参数应该排列顺序保持一致 子程序的参数顺序可以产生记忆效应 不一致的顺序会让参数难于记忆比如 在C语言中 fprintf 和printf 函数只相差一个文件参数 其余完全相同strncpy 和strcpy 函数也是如此 46 40 上午3时11分 5 1 3使用所有的参数 原则上 传递到子程序中的每个参数都应该被使用到 如果不被使用则应该删除1986年Card和Church的研究表明 不出现未被用到的变量的子程序中有46 没有错误 而含有超过一个未被用到的变量的子程序中则仅有17 29 没有错误 46 41 上午3时11分 5 1 4不要把子程序的参数用作工作变量 子程序的参数不要被当做工作变量 46 42 上午3时11分 5 1 5在接口中对参数的假定加以说明 如果传递的参数具有某种特征 则应该说明 这些特征包括 参数仅是用于输入的 要被修改的还是仅用于输出的表示数据的参数单位 英尺 米 其它 如果没有枚举类型的话 应该说明状态和错误值的含义所能接受的数值的范围不该出现的特定的数值在代码中使用断言 assert 有时比注释更有效 46 43 上

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论