快速业务通道

追求代码质量 - 谨防紧密耦合! - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
ndWidgetButton.addActionListener(new ActionListener()  {   public void actionPerformed(ActionEvent e) {   try {    String value = widgetValue.getText();     if (value == null || value.equals("")) {      dLabel.setText("Please enter a valid widgetID");     } else {      dLabel.setText(getOrderStatus(value));     }   } catch (Exception ex) {    dLabel.setText("Widget doesn''t exist in system");   } } //more code });

追求代码质量 - 谨防紧密耦合!(2)

时间:2010-12-12 IBM Andrew Glover

单击 GUI 的按钮组件后,直接从数据库中检索某个特定命令的状态,如清单 2 所示:

清单 2. GUI 通过 getOrderStatus 方法直接与数据库通信

private String getOrderStatus(String value) {   String retValue = "Widget doesn''t exist in system";   Connection con = null;   Statement stmt = null;   ResultSet rs = null;   try {   con = DriverManager.getConnection ("jdbc:hsqldb:hsql://127.0.0.1", "sa", "");   stmt = con.createStatement();   rs = stmt.executeQuery("select order.status "     + "from order, widget where widget.name = "     + "''" + value + "'' "     + "and widget.id = order.widget_id;");   StringBuffer buff = new StringBuffer();   int x = 0;   while (rs.next()) {   buff.append(++x + ": ");   buff.append(rs.getString(1));   buff.append("\n");   }   if(buff.length() > 0){    retValue = buff.toString();   }else{    retValue = "Widget doesn''t exist in system";   }   } catch (SQLException e1) {    e1.printStackTrace();   } finally {   try {rs.close();} catch (Exception e3) {}   try {stmt.close();} catch (Exception e4) {}   try {con.close();} catch (Exception e5) {}   }   return retValue; }

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

DAO 模式

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

转变为松散耦合!

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

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

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

清单

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号