频 道 直 达 - 新闻 - 读书 - 培训 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

在大型遗留系统基础上运作重构项目(3)

作者: 熊节 出处:Csdn 2008-04-14 09:36    砖    好    评论   进入论坛
阅读提示:本文以ThoughtWorks中国公司与客户合作的咨询项目为背景,为读者介绍如何在一个大型遗留系统的基础上组织和运作重构项目,从而切实有效地改善系统质量。

典型案例

下面列举了一些eMAN系统(前台部分)中较常见的代码质量问题。我们没有列出一些更常见的“坏味道”(例如大类、长方法等),因为Martin Fowler在《重构》一书中已经把它们描述得足够清楚,而且针对它们的重构也相对容易。本文中列出的是一些相对规模较大、较为复杂的情形。

我们相信类似的情形也存在于很多其他系统中,但我们并不打算宣称这个列表足以包治百病。大规模重构是一件极其复杂的细致活,很多时候你需要根据当前情况寻找适合自己的解决方案。

无法在测试环境中创建被测对象

对象在创建过程中自己尝试获得所需的依赖对象,就可能在单元测试环境下因无法创建依赖对象而导致被测对象的创建失败,从而不能把被测对象放进单元测试。例如AuthorizationService类的创建过程如下:

private static AuthorizationService instance = null;

private SecurityRightManager rightManager = null;

private AuthorizationService()

{

rightManager = SecurityBaseModule.

getSecuityModuleRef().

getSecurityRightManager();

}

public static AuthorizationService getInstance()

{

if(null == instance){

instance = new AuthorizationService();

}

return instance;

}

在单元测试环境下SecurityBaseModule.getSecuityModuleRef()返回null,因此尝试创建AuthorizationService会抛出NullPointerException异常。

重构办法:

通过构造函数的参数传入依赖对象,而不自己创建。

使用被测对象的地方负责创建依赖对象。随着重构进行把这一责任不断上推。

把初始化动作与构造函数分开,构造函数只用于获得依赖关系。如果还需要更复杂的初始化动作,在单独的初始化函数中进行。

重构目标:

通过调用构造函数、传入null作为依赖对象引用,能在单元测试中创建被测对象。

无法在测试环境中运行被测方法

如果被测方法在计算过程中自己尝试获得所需的依赖对象,就可能在单元测试环境下因无法满足依赖对象的要求而导致测试失败,从而无法对希望测试的方法进行单元测试。例如SessionManager.isAdminGroupUser方法如下:

public boolean isAdminGroupUser(String userName)

{

try {

boolean result = RpcInvoker.isAdminGroupUser(userName);

return result;

} catch(Exception ex) {

DebugTracer.trace(ex);

return false;

}

在单元测试环境下RpcInvoker的调用尝试必定会抛出异常,于是对isAdminGroupUser方法的调用必定会返回false。如果让RpcInvoker通过网络进行真实的RPC调用,不仅工作量大,使测试不可靠,而且这样的测试实际上主要是在测RpcInvoker的工作是否正确,变成了集成测试而不是SessionManager的单元测试。

重构办法:

通过构造函数的参数传入依赖对象并保存在成员变量中,需要使用依赖对象时通过成员变量调用。被测方法不直接创建依赖对象。

使用被测对象的地方负责创建依赖对象。随着重构进行把这一责任不断上推。

单元测试中用mock框架(推荐JMock)创建依赖对象。在每个测试案例(即测试方法)中独立设置对mock对象的期望,发现明显的重复时再抽取公共代码。

重构目标:

通过调用构造函数、传入mock对象,能在单元测试中创建被测对象。

对mock对象设置适当的期望,能调用被测方法,并覆盖到正常和异常路径。

不恰当的对象获取方式

不必要的Singleton模式。如果一个对象本身没有内部状态,只是根据外界状态进行计算,这样的对象不需要是Singleton的。例如CommonTool类和SessionService类:这两个类只是把请求转发给其他对象处理,它们不需要使用Singleton模式。

通过其他对象获取。从其它对象中取出自己需要的依赖对象,“由谁提供某个对象”的决策相当随机,有时通过一条长链来获得自己真正需要的依赖对象。例如要得到RightPaneXMLParser对象,就需要通过下列方式:

SecurityModule.

getSecuityModuleRef().

getSecurityConfig().

getTableXMLParser()

重构办法:

如前所述,对象所需的依赖对象全部以构造函数参数的形式获得,将“创建对象”的责任不断上推,直至系统顶端的某个位置聚集了系统中绝大部分的对象创建逻辑。

在系统顶端分离出一个全局工厂对象,该对象负责创建系统中所有的对象,并组装对象之间的依赖关系。其他地方原则上不作对象创建。

在少数不直接被这个系统顶端调用的地方(例如对外暴露给第三方的接口),从全局工厂请求自己需要的对象。

引入轻量级IoC容器(建议在PicoContainer和Spring Core之间选择),替代这个全局工厂对象。

重构目标:

系统中主要业务对象的创建都在全局工厂进行。

业务对象是否Singleton能够以配置的方式管理。


共4页: 上一页 [1] [2] 3 [4] 下一页
【内容导航】
 第 1 页:现状  第 2 页:安全网
 第 3 页:典型案例  第 4 页:对象依赖关系复杂
专题
北漂技术人90天求职纪实
勇闯IT培训黑色围城
NAC安全访问控制
技术人求职简历完备手册
WCF开发基础
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看74139次)
·UML类图详解 (查看66075次)
·UML统一建模语言 (查看35977次)
·C#技术开发指南 (查看35258次)
·C++是垃圾语言?! (查看34547次)
·Java编程开发手册 (1196个砖)
·Java基础教程 (430个砖)
·C#技术开发指南 (309个砖)
·.NET开发手册 (241个砖)
·PB开发教程 (223个砖)
·Java编程开发手册 (654个好)
·Java基础教程 (574个好)
·.NET开发手册 (274个好)
·PB开发教程 (212个好)
·Delphi开发技术手册 (194个好)
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
微软出价446亿美元收购雅虎
微软出价446亿美..
2008年4月全国计算机等级考试最新试题及答案
2008年4月全国计..
2007年互联网大会
2007年互联网大会
· 2007年互联网大会
· 华为员工自杀频频拷问..
· 技术人求职简历完备手册
· 勇闯IT培训黑色围城
· 北漂技术人90天求职纪实
· 龙芯要做中国的“奔腾”
· 国际文档格式标准开战
· 贝恩资本携手华为22亿..
· 隐私保护技术探讨
· Windows Server 2008专..
· NAC安全访问控制
· PHP开发应用手册
· ASP.NET 2.0基础开发指..
· WCF开发基础
· 路由器设置与口令恢复
· VC++基础开发专题
清除流氓软件——51CTO特别专题
清除流氓软件——..
ARP攻击防范与解决方案
ARP攻击防范与解..
iSCSI应用与发展
iSCSI应用与发展
· iSCSI应用与发展
· SQL Server 2008/2005..
· SOA 面向服务架构
· SQL Server 2008/2005..
· iSCSI应用与发展
· RAID——磁盘阵列基础
· 中间件应用技术专题
· SQL Server入门到精通
· 病毒查杀专题
· 国际文档格式标准开战
· Linux防火墙
· 路由器设置与口令恢复
· 打造安全服务器
· SOA 面向服务架构
· PHP开发应用手册
· ADSL应用面面俱到
ARP攻击防范与解决方案
ARP攻击防范与解..
SQL Server 2008/2005全解
SQL Server 2008/..
iSCSI应用与发展
iSCSI应用与发展
· iSCSI应用与发展
· 中间件应用技术专题
· SQL Server入门到精通
· SQL Server 2008/2005..
· SOA 面向服务架构
· iSCSI应用与发展
· RAID——磁盘阵列基础
· 身份认证技术
· 病毒查杀专题
· 清除流氓软件——51CTO..
· 路由器设置与口令恢复
· SOA 面向服务架构
· 了解统一威胁管理(UTM)..
· ADSL应用面面俱到
· ADSL应用面面俱到
· 反垃圾邮件技术应用