《代码大全2》读书笔记——子程序

阅读完第 7 高质量的子程序 ,并对其进行了归纳。
1 、子程序是为实现一个特定的目的而编写的一个可被调用的方法 (method) 或过程 (procedure)
子程序应该使程序变得更加易读,更易于理解,比任何编程语言的任何功能特性都更容易。
子程序能用来节约空间和提高性能。可以将重复的代码设计成子程序,在需要的地方进行调用;也可以方便地对子程序进行修改而改善整个代码的性能。
    2 、为什么要创建子程序
(1) 降低复杂程度。
可以通过创建子程序来隐藏一些信息。当编写好一个子程序后,就不必再考虑子程序的工作细节了,只需直接调用它以实现所需功能。
(2) 引入中间、易懂的抽象
把一段代码放入一个命名恰当的子程序内,是说明这段代码用意最好的方法之一。反之,给子程序取个好的名字,足以说明程序的用意,也使得代码更具可读性,更容易理解,也降低了代码的复杂度。
(3) 避免代码重复
让相同的代码只出现一次可以节约空间;只需在一处修改,代码改变起来也更方便;只需检查一处代码,代码也更加可靠;也避免了对多处需做相同修改时会犯的错误。
(4) 支持子类化
覆盖简短而规整的子程序所需新代码的数量更少,实现派生类时也会减少犯错的几率。
(5) 隐藏顺序
隐藏处理事件的顺序是一个好方法。
(6) 隐藏指针操作
把可读性差且容易出错的指针操作隔离在子程序内部,集中研究操作的意图。同时,如果此类操作都能在一个位置完成,代码的正确性就更有把握。若在程序中发觉有比指针更合适的数据类型,可对程序做出修改而不必担心会破坏那些原本要使用指针的代码。
(7) 提高可移植性
可用子程序来隔离程序中不可移植的部分,相应地明确识别和隔离了未来的移植工作。
(8) 简化复杂的布尔判断
为了理解程序的流程,没必要研究那些复杂的逻辑判断。把这些判断放入到函数中,并命名以具有描述性的名字,以提高代码的可读性。
(9) 改善性能
可以只在一个地方优化代码,并且能让使用该子程序的所有代码都从中受益;也可以更方便地查出哪些代码的运行效率低下;也能让想用更高效的算法或更快速的语言来重写代码更容易。
******************************************************
(10) 隔离复杂度
大型的或相当复杂的东西会容易引发错误,如果所发生的错误在一个子程序中,找到它会较容易,也容易修改错误而不影响其它的代码。若原有的算法是在子程序中的话,如果发觉有更好、更简单或更可靠的算法,可以很容易地进行替换。
(11) 隐藏实现细节
只关注子程序的功能,而不管它是如何工作的。因为如何工作已在设计子程序时进行过考虑。
(12) 限制变动的影响范围
把容易变动的部分写成子程序,这样应很容易修改。
(13) 隐藏全局数据
通过访问器子程序来操控全局数据,可以改变数据结构而无须修改程序本身,可以监视对这些数据的访问。
(14) 形成中央控制点
在一处控制一项任务是一个好方法。
(15) 促成可重用的代码
将有单独功能且可能被其它部分调用的代码单独分离出来。
(16) 达到特定的重构目的
能更好的实现目标。
******************************************************
3 、什么时候创建子程序
[ 情形一 ] 当内部循环或条件判断的嵌套层次很深时,则需要从子程序中提取出新的子程序了。把嵌套的部分提取出来形成一个独立的子程序,可以降低外围子程序的复杂度。
[ 情形二 ] 当程序中有复杂的布尔判断时,将其放入单独的函数中。
[ 情形三 ] 不能表面上看起来过于简单(只有两三行代码)而不想编写子程序。一个很好而又小巧的子程序会很有用。它们能够提高可读性;也会使得当简单的操作变得更复杂时更易修改。
[ 情形四 ] 如果程序的某部分容易变动,则可将它设计成子程序。如硬件依赖性、输入/输出、复杂数据类型等。
 
…… ( 可以继续总结归纳 )
4 、子程序设计原则
(1) 对子程序而言,内聚性是指子程序中各种操作之间联系的紧密程度。设计的目标是让每一个子程序只把一件事做好,不再做任何其他事情,以得到更高的可靠性。因此,应该让子程序尽可能地内聚,即让一个子程序仅执行一项操作,实现功能的内聚性。
(2) 给子程序命名一个好的名字,好的子程序名能清晰地描述子程序的功能和作用。下面是有效命名的原则。
描述子程序所做的所有事情 子程序的名字应该描述其所有的输出结果和附属功能。
避免使用无意义的、模糊或表述不清的动词
不要仅通过数字来形成不同的子程序名
根据需要确定子程序名字的长度 尽可能含义清晰。
给函数命名时要对返回值有所描述
给过程起名时使用语气强烈的动词加宾语的形式
准确使用对仗词 命名时遵守对仗词的命名规则有助于保持一致性,从而也提高可读性,如first/last。
为常用操作确立命名规则
(3) 考虑子程序的内聚性、嵌套的层次、变量的数量、决策点的数量、解释子程序所需的注释数量、以及其他一些跟复杂度相关的考虑事项等来决定子程序的长度。通常,大部分子程序都非常短小,但复杂的算法总会导致更长的子程序,在这种情况下,可允许子程序的长度有序地增长到 100 200 行。最好,将子程序的长度控制在 200 行以内。
(4) 如何使用子程序参数。
按照输入—修改—输出的顺序排列参数 先列出仅作为输入用途的参数,然后是既作为输入又作为输出用途的参数,最后才是仅作为输出用途的参数。这种排列方法也暗含了子程序的内部操作所发生的顺序——先是输入数据,然后修改数据,最后输出结果。
考虑自已创建in和out关键字 当然这种方式有优有缺
如果几个子程序都用了类似的一些参数,应该让这些参数的排列顺序保持一致
使用所有的参数 既然往子程序中传递了一个参数,就一定要用到这个参数。
把状态或出错变量放在最后 状态变量和那些用于指示发生错误的变量应放在参数表的最后。
不要把子程序的参数用作工作变量 应该使用局部变量。
在接口中对参数的假定加以说明 应该说明的参数有:参数是仅用于输入的、要被修改的、还是仅用于输出的;表示数量的参数的单位;状态代码和错误值的含义;所能接受的数值的范围;不该出现的特定数值。
把子程序的参数个数限制在大约7个以内
考虑对参数采用某种表示输入、修改、输出的命名规则
为子程序传递用以维持其接口抽象的变量或对象
使用具名参数 可以显式地把形式参数和实际参数对应起来,使得参数的用法更具有自我描述性,并有助于避免因为用错参数而带来的错误。
确保实际参数与形式参数相匹配
(5) 如果一个子程序的主要用途就是返回由其名字所指明的返回值,那么就应该使用函数,否则就应该使用过程。
 

2006522

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值