c程序代码重构(摘)

本文为吾之拜阅Martin Fowler著,侯捷/熊节译<<重构:改善现有代码的设计>>所摘,其书以java语言为基础写就,吾仅取其与c程序代码重构相关部分,至于思想云云...,亦只列出吾有体会之处.

Duplicated code 重复的代码
long method    过长函数:函数容易理解的真正关键在于一个好名字
应该更积极进取地分解函数
技巧:寻找注释,通常是指出代码用途和实现手法间的语义距离的信号
               条件式
               各循环常常也是提炼的信号

当感觉需要撰写注释,请先尝试重构,试着让所有注释都变得多余
如不知道该做什么,这才是注释的良好运用时机。除了用来记述将来的打算之外,注释还可以用来标记并无十足把握的区域。可以在注释里写下自己(为什么做某某事)。这类信息可以帮助将来的修改者,尤其是对于健忘者


确保所有测试都完全自动化,让它们检查自己的测试结果

一整组测试就是一个强大的臭虫侦测器,能够大大缩减查找所需要的确良时间
实际上,撰写测试代码的最有用时机是在开始编程之前,当你需要添置特性的时候,先写相应测试代码。编写测试代码其实就是在问自己:添加这个功能需要做些什么。编写测试代码还能使人把注意力集中于接口而非实现上头。预先写好的测试代码也为工作给了一个明确的结束标志。一旦测试代码正常运行,工作就可以结束了

简化条件表达式:
1,decompose conditional分解条件式
从if,then,else三个段落中分别提炼出独立函数
eg:if (date.bafore(SUMMER_START) || (date.after(SUMMER-END))
      charge = quantity * winterrate + winterServiceCharge;
    else
         charge = quantity * summerRate;
带来更清晰的逻辑结构,更好地表达自己的意图


2,consolidate conditional expression 合并表达式
检测条件不同,最终行为一致

3,consolidate duplicate conditional fragments 合并重复的条件片段
在条件表达式的每个分支上下班有相同的代码
if()
{
total = price *3;
send();
}
else
{
total = price * 4;
send();
}

4,以卫语句取代嵌套条件式
double getPayAmount()
{
double result;
if(isDead) result = deadAmount();
else
   {
    if(isSeparated) result = separatedAmount();
     else {
if(isRetired) result = retiredAmount();
else result = normalPayAmount();
}
   }
   return result;
}

double getPayAmount()
{
if(isDead) return deadAmount();
if(isSeparated) return separatedAmount();
if(isRetired)   return retiredAmount();
return normalPayAmount();
}


断言assert:只有当某个条件成立时才能继续执行下去
可作为交流与调试的辅助,在交流上可帮助程序阅读者理解代码所做的假设;
在调试的角度上,可在距离bug最近的地方抓住它们。


名称是程序写作者与阅读者交流的关键工具


一个很有价值的习惯:明确地将修改对象状态的函数和查询对象状态的函数分开设计

给函数命名的一个好办法:首先考虑应给这个函数写上一句合适的注释,然后想办法将注释变成名称

问题在于:程序中发现错误的地方,并不一定知道如何处理错误,当一段副程序发现错误时,它需要让调用者知道这个错误,而调用者也可能将这个错误继续沿着调用链call chain传递上去。许多程序都使用特殊输出来表示错误,unix或c-based系统的传统方式就是以返回值表示副程序的成功或失败,可以采用异常来代替


将普通程序和错误处理分开:
我们需要坚信:
代码的可理解性应该是我们虔诚追求的目标。
我们每天都在使自己的程序世界更安全。

团队共识:有一个大型重构正在进行,每个人都应该相应安排自己的行动。

两个家伙的车子在山顶附近抛锚了,于是他俩下车,一人走到车的一头,开始推车。经过毫无成果

的半小时之后,车头那家伙开口说到:我从来不知道把车推下山这么难!!另一个家伙答案道:嘿

,你说推下山是什么意思?难道我们不是想把车推上山吗?


将领域和表述/显示分离:separate domain from presentation

MVC:model-view-controller模式   GUI&DOMAIN OBJECT(领域对象)

通过重新组织软件结构,重构使得设计思路更详尽明确,重构被用于开发框架`抽取。复用组织,

使软件架构更清晰,使新功能的增加更容易

不肯重构的原因:
1,不知道如何重构
2,长远看来,说不定当项目收获这些利益时,已不在职位上了
3,代码重构是一项额外工作,老板付钱给你,主要是让员工编写新功能
4,重构可能破坏现有程序

一方面,许多传统的变更管理机制都可以解决这个问题;
另一方面,如果软件设计良好,又经过重构,子系统之间就会有效分离,于是很多重构手法都只会影响代码的一小部分

对员工进行培训,尽量获取短期利益,减少额外开销,安全引入新技术。



重构的一种方法:
定义并快速实现一个重构工具的原型,用以检查某项重构是否可以安全地施加于程序身上。避免大量可能因为人为错误而引入的bugs
重构工具最主要的用途就是让程序可以不必重新测试,便能对代码进行重构,即使有了自动化测试工具,测试仍然是很费时间的,如能完全避免测试,将可极大加快重构过程

但重构工具对c语言似乎还只是一个梦想,我们还是要在系统设计时做尽可能地改善,而不是依赖重构,当我们在系统设计时考虑到尽可能地减少重构,减少维护和改良的花销,中间也是博弈过程,需要在各种利益之间取得平衡........

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值