快速业务通道

追求代码质量 - 用代码度量进行重构 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
替,如图 1 的 UML 图所示:

图 1. 提取方法模式实践

提取方法模式提供了两个关键好处:

原来的方法现在更短了,因此也更容易理解。

移走并放在自己方法中的逻辑体现在更容易测试。

追求代码质量 - 用代码度量进行重构(2)

时间:2010-12-11 IBM Andrew Glover

降低圈复杂度

在使用的时候,对于被高度圈复杂度值感染的方法来说,提取方法是一剂良 药。您可能会记得,圈复杂度通过度量方法的路径数量;所以,可以认为如果提 取 出其中一些路径,重构方法的整体复杂性会降低。

例如,假设在运行了像 PMD 这样的代码分析工具之后,结果报告显示其中一 个类包含的一个方法有较高的圈复杂度值,如图 2 所示:

图 2. 圈复杂度值高达 23!

在仔细查看了这个方法之后,发现这个方法过长的原因是使用了太多的条件 逻辑。正如我以前在这个系列中指出的,这会增加方法中产生缺陷的风险。谢天 谢地,updateContent() 方法还有个测试用例。即使已经认为这个方法有风险, 测试也会减轻一些 风险。

另一方面,测试已经精心地编写成可以测试 updateContent() 方法中的 23 个路径。实际上,好的规则应当是:应当编写至少 23 个测试。而且,要想编写 一个测试用例,恰好能隔离出方法中的第 18 个条件,那将是极大的挑战!

小就是美

是否真的要测试长方法中的第 18 个条件,是个判断问题。但是,如果逻辑 中包含真实的业务值,就会想到测试它,这个时候就可以看到提取方法模式的作 用了。要把风险降到最小很简单,只需把条件逻辑分解成更小的片段,然后创建 容易测试的新方法。

例如,updateContent() 方法中下面的这小段条件逻辑创建一个状态 String 。如清单 1 所示,逻辑的隔离看起来足够简单:

清单 1. 条件逻辑成熟到可以进行提取

//...other code  above String retstatus = null; if ( lastChangedStatus != null &&  lastChangedStatus.size() > 0 ){   if ( status.getId() == ((IStatus)lastChangedStatus.get (0)).getId() ){   retstatus = "Change in Current status";   }else{   retstatus = "Account Previously Changed in: " +    ((IStatus)lastChangedStatus.get(0)).getStatusIdentification ();   } }else{   retstatus = "No Changes Since Creation"; } //...more code below

追求代码质量 - 用代码度量进行重构(3)

时间:2010-12-11 IBM Andrew Glover

通过把这一小段条件逻辑提取到简洁的新方法中(如清单 2 所示),就做到 了两件事:一,把 updateContent() 方法的整体复杂性降低了 5;二,逻辑的 隔离很完整,可以容易地对它进行测试。

清单 2. 提取方法产生 getStatus

private String getStatus (IStatus status, List lastChangedStatus) {   String retstatus = null;   if ( lastChangedStatus != null &&  lastChangedStatus.size() > 0 ){    if ( status.getId() == ((IStatus)lastChangedStatus.get (0)).getId() ){     retstatus = "Change in Current status";    }else{     retstatus = "Account Previously Changed in: " +     ((IStatus)lastChangedStatus.get(0)).getStatusIdentification ();    }   }else{    retstatus = "No Changes Since Creation";   }   return retstatus; }

现在可以把 updateContent() 方法体中的一部分替换成对新创建的 getStatus() 方法的调用,如清单 3 所示:

清单 3. 调用 getStatus

//...other code above String iStatus 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号