高质量的子程序

第七章 高质量的子程序

什么是“子程序(routine)”?子程序是为实现一个特定目的而编写的一个可被调用的方法(method)或过程(procedure)。例如C++中的函数(function),Java中的方法(method),或是Microsoft Visual Basic中的函数过程(function procedure)或自过程(sub procedure)。对于某些使用方式,C和C++中的宏(macro)也可认为是子程序。
    对于什么是高质量的子程序,这个问题很难回答,不过我们可以首先看一下下面这个低质量的子程序的例子:
C++示例:低质量的子程序
void HandleStuff(CORP_DATA & inputRec, int crntQtr, EMP_DATA empRec, double & estimRevenue, double ytdRevenue, int screenX, int screenY, COLOR_TYPE & newColor, COLOR_TYPE & preColor, StatusType & status, int expenseType)
{
int i;
for( i = 0; i < 100; i++ ) {
    inputRec.revenue[i] = 0;
    inputRec.expense[i] = corpExpense[crntQtr][i];
    }
UpdateCorpDatabase( empRec );
extimRevenue = ytdRevenue * 4.0 / (double) crntQtr;
newColor = prevColor;
status = SUCCESS;
if( expenseType == 1) {
    for( i = 0; i < 12; i++ )
        profit[i] = revenue[i] - expense.type1[i];
    }
else if ( expenseType == 2 ) {
        profit[i] = revenue[i] - expense.type2[2];
        }
else if ( expenseType == 3 )
        profit[i] = revenue[i] - expense.type3[i];
        }
    这个子程序有哪些不妥呢?个你一个提示:你应该能够从中发现至少10个不同的问题。请你先列出自己发现的问题,然后再来看下面这份清单:
    1. 这个子程序有个很差劲的名字。HandleStuff()一点也灭有告诉你这个子程序究竟是做什么的。
    2. 这个子程序没有文档。
    3. 这个子程序的布局不好。代码的物理结构组织形式几乎咩有给出任何关于其逻辑组织的提示。布局的使用过于随意,程序内的不同部分使用了不同风格的布局风格。请比较一下expenseType == 2 和expenseType == 3 这两处的代码风格。
    4. 这个子程序的输入变量inputRec的值被改变了。如果它是一个输入变量,它的值就不应该被修改。如果变量的值是要被修改的,那就不要把它命名为inputRec。
    5. 这个子程序读写了全局变量——它从corpExpense中读取数值并将其写入profit。它应该更直接地与其他子程序通信,而不是去读写全局变量。
    6. ·这个则程序没有一个单一的目的。它初始化了一些变量,向数据库写入数据,又做了一些计算——从这些事情之间看不出任何联系。子程序应该由单一明确的目的。
    6. 这个子程序没有注意防范错误数据(bad data)。如果crntQtr等于0,那么表达式ytdRevenue * 4.0 / (double)crntQtr将会导致除零错误。
    7. 这个子程序用了若干神秘数值(magic number):100、4.0、12、2、3等.
    8. 这个子程序未使用其中一些参数:screenX和screenY在程序中都没有被引用过。
    9. 这个子程序的一个参数传递方式有误:prevColor被标用引用参数(&),但在这个子程序内却未对其赋值。
    10. 这个子程序的参数太多了。合理地参数个数,其上限大概是7个左右,而这个子程序有11个。这些参数的排布方式也难以理解,估计没人想仔细研究它们、甚至没人想叔叔有几个参数。
    11. 这个子程序的参数顺序混乱未经注释。

7.1 创建子程序的正当理由

1. 降低复杂度 创建子程序的一个最重要的原因,就是为了降低程序的复杂度。可以通过创建子程序来隐藏一些信息,这样你就比比再去考虑这些信息了。当然,在你要编写这个子程序的时候肯定是要考虑它们的。不过一旦程序写好了,你就应该能忘记这些细节,可以直接调用该子程序而不需了解其内部工作细节。创建子程序还有其他一些原因——比如缩小代码规模、改善可维护性、提高正确性等——也都是很不错的。
党内部循环或条件普安但的嵌套层次很深时,就意味着需要从子程序中提取出新的子程序了。把嵌套的部分提取出来形成一个独立的资产呢供需,可以降低外围程序的复杂度。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值