• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

追求代码质量: 谨防紧密耦合!

发布: 2008-6-13 15:42 | 作者: 不详 | 来源: 测试时代编辑整理 | 查看: 104次 | 进入软件测试论坛讨论

领测软件测试网

清单 2 中的代码出现了问题,尤其是它通过一个硬编码的 SQL 语句直接与一个硬编码的数据库进行通信。Yeeesh! 您能够想像开发人员测试这种 GUI 和相关数据库的挑战吗(顺便说一下,测试本应该简单得像测试一个 Web 页面一样)? 倘若对数据库的任何改动都 影响到 GUI,那么要考虑修改系统的话会使情况变得更糟。

DAO 模式
Data Access Object (DAO) 是一种设计模式,它旨在使用接口和相关实现把低级的数据访问操作从高级事务逻辑中分离出来。从本质上说,某个具体的 DAO 类通过特定的数据源实现访问数据的逻辑。DAO 模式使得只使用一个接口为多个数据库,或者甚至各种不同的数据源(如文件系统)定义多个具体实现成为了可能。

转变为松散耦合!

现在在脑海中考虑一下使用依赖性倒置原则设计的相同的系统。如图 2 所示,通过向应用程序添加两个组件来解除应用程序中的耦合是可能的:这两个组件分别是一个接口和一个实现:


图 2. 一个松散耦合的系统

在图 2 所示的应用程序中,GUI 依赖于一个抽象 —— 一个数据访问对象或 DAO。DAO 的执行直接依赖于数据库,但是 GUI 本身并没有陷入其中。以 DAO 的形式添加一个抽象可以从 GUI 实现将数据库实现解耦。一个接口会替代数据库与 GUI 代码相耦合。清单 3 显示了该接口。


清单 3. WidgetDAO 是一个能帮助解耦架构的抽象

             
public interface WidgetDAO {
  public String getOrderStatus(String widget);
  //....
}

GUI 的 ActionListener 代码引用接口类型 WidgetDAO(定义在清单 3 中)而不是接口的实际实现。在清单 4 中,GUI 的 getOrderStatus() 方法在本质上指定的是 WidgetDAO 接口:


清单 4. GUI 依赖于抽象,而不是数据库

private String getOrderStatus(String value) {
  return dao.getOrderStatus(value);
}

对 GUI 完全隐藏了这个接口的实际实现,因为它是通过一个工厂来请求实现类型的,如清单 5 所示:


清单 5. 对 GUI 隐藏了 WidgetDAO 实现

                
private WidgetDAO dao;
//...
private void initializeDAO() {
  this.dao = WidgetDAOFactory.manufacture();
}
进展顺利

注意,清单 5 中的 GUI 中的代码只引用接口类型 —— GUI 中的任何地方都没有使用(或导入)接口的实现。这种对实现细节的抽象是灵活性的关键:它使您能够更换实现类型,而完全不会影响到 GUI。

还要注意,清单 5 中的 WidgetDAOFactory 是如何使 GUI 避开 WidgetDAO 类型的创建细节的。这些是工厂的任务,如清单 6 所示:

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/

53/5<12345>

关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网