高质量的子程序
一个高质量的子程序应该有以下特征:
- 好的名字,可以体现该程序的功能
- 要有相关的文档说明
- 要有好的布局
- 不要改变输入变量的值
- 尽量不要读写全局变量
- 要高内聚,即实现单一功能
- 要注意防范一些错误,比如除以0
- 尽量不要使用magic number,无法让人理解这些数据为什么是这些具体数值
- 程序参数数量不要太多
创建子程序的正当理由
- 降低复杂度:通过创建子程序需进行信息隐藏,这样在编写其他部分时,就不需要考虑这些信息了
- 引入中间、易懂的抽象:主要是查看时更容易理解一段代码的功能,从而更好地理解代码,具体做法是:提取出一段代码,将其抽取成一个函数,给一个合适的名字来更好地帮助理解
- 避免代码重复:😉所以应该将那些多次使用的代码片段抽取成子程序
- 支持子类化:创建子程序之后,在派生类中覆盖该子程序更加方便,代码可读性也会相应的增加
- 隐藏顺序:比如应该先读取栈顶元素,然后改变stackTop变量的值,这时候应该将这两个语句封装到程序中,可以避免因为调用顺序引起的错误
- 便于改善性能:通过使用子程序,将代码集中在一处可以更方便地检查出那些代码的运行效率低下,从而只在一个地方进行优化
即使是很简单的操作,也应该封装成子程序,可以简化多次调用的情况
在子程序层上设计
这部分主要讲解如何将一整块代码划分成小的子程序。因为好的程序都是高内聚,低耦合的,这是两个一致的目标,内聚性提高,往往会降低耦合性,下面介绍如何提高一个程序内部的耦合性。
目标是:一个子程序只把一件事做好,不再做其他任何事情。
一个好的子程序,在内聚性上最好是下面的情况:
- 功能的内聚性:即让一个子程序仅仅执行一项操作。因为评价一个函数是否在功能上具有良好的内聚性往往要根据函数名字来判断(例如sin(),cos())所以这就要求函数命名要贴合函数实际功能。
- 顺序上的内聚性:即在子程序内部含有需要按照特定顺序执行的操作,这些步骤需要共享数据,只有在全部执行完之后才完成了一项完整的功能。这种程序,可以尝试将其拆分,变成功能上内聚性的程序。
- 通信上的内聚性:指一个子程序中的不同操作使用了相同的数据,但是不存在其他任何联系。这也不是好的子程序,也应该尝试进行拆分。
上面这些内聚性还是比较好的内聚性,但是其中功能的内聚性是最好的。当发现子程序具有不良的内聚性时,应该花时间来重新编写,重构代码,使其具有良好的内聚性。
好的子程序名字
一个好的程序名字应该使用准确、清晰、剪短的动词来尽可能清楚的描述程序所做的事情。
并且,对于一些常用的set,get方法,应该确定一种统一的命名规则,例如,返回id的程序,可以命名为getID(),这样对于一些较大的项目,有助于帮助我们记忆代码的功能。
子程序可以写多长
程序越长,其中的逻辑可能会比较复杂, 这样会加大代码中错误的概率,所以,代码尽可能的短小吧!这样,程序的内聚性往往也比较好。
如何使用子程序参数
如果不是功能强制,尽可能不要在子程序内部将参数用作用工作变量。而是可以采取在子程序内部复制一份参数的方法。
将参数的个数控制在7个以内。