欣赏优美的代码:实际的例子 |
作者: 来源: 阅读 数 546 人次 , 2006-4-25 9:05:00 |
|
在讨论高质量子程序的细节问题之前,我们首先来考虑两个基本名词。什么叫“子程序”?子程序是具有单一功能的可调用的函数或过程。比如C 中的函数,Pascal 或Ada 中的函数或过程,Basic中的子程序或Fortran 中的子程序。 有时,C 中的宏指令或者Basic中用GOSUB调用的代码块也可认为是子程序。在生成上述函数或过程中,都可以使用创建高质量子程序所使用的技术。什么是“高质量的子程序”?这是一个比较难以回答的问题。反过来最简单回答方式是指出高质量子程序不是什么。下面是一个典型的劣质子程序(用Pascal写成):
Procedure HandleStuff ( Var InputRec:CORP_DATA,CrntQtr:integer, EmpRec:Emp_DATA, Var EstimRevenue:Real, YTDRevenue:Real, ScreenX:integer,ScreenY:integer,Var NewColor:Color_TYPE, Var PrevColor:COLOR_TYPE,Var Status:STATUS_TYPE, ExpenseType:integer); begin for i := 1 to 100 do begin InputRec.revenue[1]:= 0; InputRec.expense[i]:=CorpExpensse[CrntQtr,i] end; UpdateCorpDatabase(EmpRec); EstimRevenue:=YTDRevenue * 4.0 /real(CrntQtr) NewColor:=PrevColor; status:=Success; if ExpenseType=1 then begin for i:= 1 to 12 do Profit[i]:= Revenue[i]-Expense.Type[i] end else If ExpneseType= 2 then begin Peofit[i]:=Revenue[i] - Expense.Type2[i] end else if ExpenseType= 3 then begin Profit[i]:=Revenue[i] - Expense.Type3[i] end end 这个子程序有什么问题?给你一个提示:你应该至少从中发现10个问题。当你列出所发现的问题后,再看一下下面所列出的问题:
· 程序的名字让人困惑。Handlestuff()能告诉我们程序是干什么的吗?
· 程序没有被说明。
· 子程序的布局不好。代码的物理组织形式几乎没有给出其逻辑组织形式的任何信息。布局的使用过于随心所欲,程序每一部分的布局都是不一样的。关于这一点。只要比较一下ExpenseType=2 和ExpenseType=3 两个地方的风格就清楚了。
· 子程序的输入变量值InPutRec 被改变过。如果它作为输入变量,那它的值就不该变化。如果要变化它的值,就不该称之为输入变量InputRec。
· 子程序进行了全局变量的读写操作。它从CorpExpense 中读入变量并写给Profit。它应该与存取子程序通信,而不应直接读写全局变量。
· 这个子程序的功用不是单一的。它初始化了某些变量。对一个数据库进行写操作,又进行了某些计算工作,而它们又看不出任何联系。一个子程序的功用应该是单一,明了的。
· 子程序中没有采取预防非法数据的措施。如果CrntQtr 的值为“0”,那么,表达式YTDRevenue*4.0/real(CrntQtr)就会出现被零除的错误。
· 程序中使用了几个常数:100, 4.0, 12, 2和3。
· 在程序中仅使用了域的CORP_DATA 型参数的两个域。如果仅仅使用两个域,那就该仅仅传入特定的域而不是整个结构化变量。 |
|