快速业务通道

演化架构与紧急设计: 组合方法和 SLAP - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
onnection c) throws SQLException {      Statement stmt = c.createStatement();      return stmt.executeQuery(getSqlForEntity());    }

演化架构与紧急设计: 组合方法和 SLAP(3)

时间:2011-07-13 IBM Neal Ford

这很有意思。是否还能把更多的方法从子类提升到通用的父类中?如果看一下 清单 2 中的 populate() 方法本身,可以看出它与 PartDb 类的连接点是 getDatabaseConnection()、createResultSet() 和 addPartToListFromResultSet() 方法。前两个方法已经转移到父类中了。 如果对 addPartToListFromResultSet() 方法进行抽象(并使用适当的更通用的名称),就可以把整个 populate() 方法放到父类中,见清单 4:

清单 4. BoundaryBase 类

abstract public class BoundaryBase {    private static final String DRIVER_CLASS =        "com.mysql.jdbc.Driver";    private static final String DB_URL =        "jdbc:mysql://localhost/orderentry";    protected Connection getDatabaseConnection() throws ClassNotFoundException,        SQLException {      Connection c;      Class.forName(DRIVER_CLASS);      c = DriverManager.getConnection(DB_URL, "webuser", "webpass");      return c;    }    abstract protected String getSqlForEntity();    protected ResultSet createResultSet(Connection c) throws SQLException {      Statement stmt = c.createStatement();      return stmt.executeQuery(getSqlForEntity());    }    abstract protected void addEntityToListFromResultSet(ResultSet rs)        throws SQLException;    public void populate() throws Exception {      Connection c = null;      try {        c = getDatabaseConnection();        ResultSet rs = createResultSet(c);        while (rs.next())          addEntityToListFromResultSet(rs);      } finally {        c.close();      }    } }

把这些方法提升到父类中之后,PartDb 类已经大大简化了,见清单 5:

清单 5. 简化和重构后的 PartDb 类

public class PartDb extends BoundaryBase {    private static final int DEFAULT_INITIAL_LIST_SIZE = 40;    private static final String SQL_SELECT_PARTS =        "select name, brand, retail_price from parts";    private static final Part[] TEMPLATE = new Part[0];    private ArrayList partList;    public PartDb() {      partList = new ArrayList(DEFAULT_INITIAL_LIST_SIZE);    }    public Part[] getParts() {      return (Part[]) partList.toArray(TEMPLATE);    }    protected String getSqlForEntity() {      return SQL_SELECT_PARTS;    }    protected void addEntityToListFromResultSet(ResultSet rs)        throws SQLException {      Part p = new Part();      p.setName(rs.getString("name"));      p.setBrand(rs.getString("brand"));      p.setRetailPrice(rs.getDouble("retail_price"));      partList.add(p);    } }

我通过前面的重构得到了什么?首先,

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