分享
 
 
 

代码维护:改进代码的一些方法

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

代码维护:改进代码的一些方法

0 引言

应用的整个生命周期的维护通常都被低估了。然而,维护毫无疑问是花费最多、也是最难执行的阶段。因此,初始开发阶段的代码质量直接影响维护的成本。下面一些数字说明了这一点:

· 一个项目的平均寿命是4到5年,开发阶段大约是一年。

· 在此阶段,40% 到50%的代码都需要修改,或者是纠错,或者是更新。

· 维护阶段修改一行代码的成本是初始开发阶段的2到3倍。

这些数字表明:

· 代码必须清晰而且有正确的文本注释,这样在4、5年后仍能理解,甚至当代码的开发人员都不在时。

· 代码必须可更新而且有恰当的结构以面对将来的变化。

· 项目中的错误必须尽可能早地检查出来,以限制将来产生影响的成本。

我们将会看见如何遵循一些简单的规则,开发人员通过限制成本和风险来促进维护工作。为了提供一个具体的实例,我们将改进以下的代码,采用的是Powerbuilder中的powerscript语言的代码,这些代码是从数据窗口的itemchanged 事件中提取的。

long a

if dwo.name = "amount" THEN

IF dw_1.getitemnumber (row, "type") = 5 OR dw_1.getitemnumber (row, "type") = 6 THEN

dec b

for a = 1 to dw_1.rowcount ()

if dw_1.getitemnumber (a, "type") = 5 or dw_1.getitemnumber (a, "type") = 6 &

and a <> row THEN

b += dw_1.getitemnumber (a, "amount")

END if

next

if dec (data) + b > 450000 THEN

messagebox ("Error","the total amount of this sales order is too big")

return 1

END IF

END IF

END IF

if dwo.name = "type" then

// 如果数据窗口对象列为"type",则...

END IF

if dwo.name = "amount" then

// 如果数据窗口对象列为"amount",则...

END IF

1 增加代码的易理解性

你研究过多少次别人的代码(甚至你自己写的代码),抱怨过它多么难于理解?尽管很容易判断代码是否易读,但更难说明其原因。这里有一些规则,如果遵循的话,将会保证最小的易读性。

1.1 正确命名代码元素

需要命名正确的主要因素是对象,函数和变量。命名正确意味着名称必须代表项目的主要属性。换句话来说,名称必须清楚地描述对象能做什么,如何使用。

举例来说,如果变量命名为a,它并不代表它用来做什么,数据类型是什么。为了达到这个目的,必须要搜寻变量的定义,分析代码以学会如何使用。让我们重新考虑这个变量,命名为ll_rowcount,这样,甚至没有上下文的联系,我们也可以得知它是处理一个局部变量,长整型long,用来储存记录数目。如果遵守Sybase公司的命名规则,用常规语言来分配名称,就能够大大增强代码的易读性。

1.2 定义和复杂表达式必须加以注解

为了加强代码的可理解性,必须给代码增加注解。有些开发人员完全不添加注解,而有些则每行加以注解。照我看来,我们必须在这两种极限情况下选择一个平衡状态。实际上,注解是有成本的,很难保持注解与修改后的代码保持一致(因为编译时注解并没有被检查)。这就是我为什么认为注解只应该加在能够提高代码可理解性的地方:

· 变量定义,如果它们的名称不能充分描述它们的用途;

· 不能想当然的表达式(如数学公式、复杂条件等等)。

1.3 复杂条件必须易于理解

如果条件很复杂,在阅读的时候就很难把握意思。于是就有必要尽可能地使它易于阅读,所以就要尽量避免使用函数调用、用固定类型的变量来替换不明确的值。

示例:

将代码

long a

if dw_1.getitemnumber (row, "type") = 5 or dw_1.getitemnumber (row, "type") = 6 AND a <> row

...

end if

改为:

li_producttype = dw_1.getitemnumber (row, "type")

IF li_producttype = BOOK OR li_producttype = VIDEO AND ll_currentrow <> row THEN

END IF

1.4 局部变量必须在代码的开头就加以定义

PowerBuilder的编译器并不要求变量定义的位置,于是,就可以在代码的开头定义所有的变量。这在我们寻找定义时,大大简化了搜索过程。

2 代码的规划和文档的规划一样重要

这个规则能够很好地实施,因为PowerBuilder代码编辑器通过提供自动缩进和颜色指示大大简化了这项任务。不过仍然建议你重新阅读你的代码,试着改进其规划:

· 配合自动缩进原则

· 正确定义变量

· 在程序的每个部分之间留下一个空行

· 如果一行指令太长而不能在一行中阅读,则开始新的一行

如果我们应用这些原则到示例代码中,将会得到以下代码:

long : ll_currentrow, ll_rowcount

int li_producttype

dec ldc_total

constant int BOOK = 5, VIDEO = 6

constant dec MAXAMOUNT = 450000 // 指出books和video的最大数目

CHOOSE CASE dwo.name

CASE "amount"

// 检查books和video的总数没有超过最大数目

//======================================================================

li_producttype = dw_1.getitemnumber (row, "type")

IF li_producttype = BOOK OR li_producttype = VIDEO THEN

// 不考虑当前行数据计算销售订单的数目

//=================================================================

ll_rowcount = dw_1.rowcount ()

FOR ll_currentrow = 1 TO ll_rowcount

ll_producttype = dw_1.getitemnumber (ll_currentrow , "type")

IF li_producttype = BOOK OR li_producttype = VIDEO AND &

ll_currentrow <> row THEN

ldc_total += dw_1.getitemnumber (ll_currentrow, "amount")

END IF

NEXT

IF (DEC (data) + ldc_total) > MAXAMOUNT THEN

messagebox ("Error", "the total amount for books and video is too big")

return 1

END IF

END IF

// 如果数据窗口对象列为"amount",则...

CASE "type"

// 如果数据窗口对象列为"type",则...

END CHOOSE

3 代码文档化

文档使我们不需要钻研代码,就可以轻松地理解应用的结构。除了编辑的成本之外,文档所面对的问题是在变化的过程中维护文档。事实上,在代码和文档之间没有直接的联系。没有自动验证功能,它能够检查文档是否被正确地更新,但是没有。

为了实现自动验证功能,使文档尽可能的有效,我认为它应该尽可能地靠近有疑问的代码。在代码中使用表头是一种行之有效的办法。

好的文档必须能够回答以下的问题:

· 代码的目的是什么?

· 应用了什么商业规则?

· 它们是怎样应用的?

· 为什么选择特定的技术方案?

· 如果有的话,代码应用时有什么限制?

· 谁于何地,为什么原因编写了这段代码?

在添加了表头以后,代码如下所示:

/*=================================================================================

描述: 验证数据

验证规则:

* R000051 : 检查books和video的总数没有超过最大数目

* ....

注释:

该数据窗口只能由销售员用户来进行更新,其它用户无权修改数据

===================================================================================

修改记录:

V1.00 2000-01-01 WINBOY创建

V1.02 2000-05-11 WINBOY 添加商业法则R000051.

=================================================================================*/

long ll_currentrow, ll_rowcount

int li_producttype

dec ldc_total

constant int BOOK = 5, VIDEO = 6

constant dec MAXAMOUNT = 450000 // 指出books和video的最大数目

CHOOSE CASE dwo.name

CASE "amount"

//检查books和video的总数没有超过最大数目

//======================================================================

li_producttype = dw_1.getitemnumber (row, "type")

IF li_producttype = BOOK OR li_producttype = VIDEO THEN

// 不考虑当前行数据计算销售订单的数目

//=================================================================

ll_rowcount = dw_1.rowcount ()

FOR ll_currentrow = 1 TO ll_rowcount

ll_producttype = dw_1.getitemnumber (ll_currentrow , "type")

IF li_producttype = BOOK OR li_producttype = VIDEO AND &

ll_currentrow <> row THEN

ldc_total += dw_1.getitemnumber (ll_currentrow, "amount")

END IF

NEXT

如果您对此有不同的看法,或者有什么好的意见和建议,可以发Email给我: winboy20@sina.com。谢谢各位。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有