软件质量之路:建立核心框架

发表于:2011-1-27 10:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:林星    来源:51Testing软件测试网采编

  什么是框架

  在软件开发中出现过各种各样的框架,开源软件的兴起,使得各种各样的框架纷纷出现,例如,Apache组织下就拥有诸多的框架类产品,包括国内很熟悉的struts。那么,什么是框架呢?

  在设计模式中,Gamma等人为框架给出了一个定义:“框架就是一组协同工作的类,它们为特定类型的软件构筑了一个可重用的设计。”[Gamma 94,p.26]

  框架是针对特定的问题领域的,例如,struts是一个针对Web开发的框架。

  框架包括了一组的抽象概念。这些抽象概念来源于问题领域。例如,struts是基于MVC模式进行设计的,所以它必须为model、view、control建立抽象概念。

  框架使得这些抽象概念相互协作,并提供了一种扩展的形式,以实现重用。这是框架的具体工作。框架在抽象概念上进行工作,定义抽象概念之间的协作方式。框架和普通软件或是类库的区别就在于,用户通过扩展框架来重用该框架。这些扩展点的设计称为框架设计的核心。例如,在struts1.0中,采用的是类继承的扩展方式(对Action进行扩展)。

  框架实例

  spring(http://www.springframework.org)是一个开源的框架,这个框架定位于一个整体的基于J2EE的应用型框架。他的定位哲学是不重新发明轮子。例如,他提供了数据库访问机制,但是他的数据访问机制是基于JDBC、Hibernate和JDO的。重用和再包装的思路充满了整个spring框架。国内的软件产业大都定位在系统集成,这种思路非常适合于国内的软件组织。使用这个例子的目的也在于此。

  框架应该尽可能使用现有的技术。而不要重复投资。

  JDBC是一个非常基础的数据存取API。它封装了对关系型数据库的访问,但是应该承认,JDBC仍然属于层次较低的API,所以在使用的时候,我们不得不编写大量的代码,来完成一件简单的工作:

PreparedStatement st = db.prepareStatement("SELECT USER.NAME FROM USER");
ResultSet rs = st.executeQuery();
while(rs.next()) {
System.out.println(rs.getString(1));
}
rs.close();
st.close();

  看到有多麻烦了吧,但是请注意,以上的代码存在严重的缺陷,因为没有任何处理异常的代码,加入异常代码意味着我们还需要增加一些代码,这种重复的劳动使得程序员的工作像是傻瓜一样。记得我们在代码自动化中的自动化原则吗?对于重复性的劳动,我们应该使其自动化。

  如何进行呢?注意,我们发现,除了SQL语句的不同以及记录集的处理不同以外,大部分的查询代码都没有太大的差别,所以我们的目标就是抽取共同的部分,而把特定的部分留给开发人员自己。

  那么,一个框架该做些什么呢?回忆框架的定义,框架就是定义一组的抽象体,及其抽象体之间的协作,并提供扩展。在JDBC中,抽象体有Datasource、Connection 、PreparedStatement、ResultSet、Statement、SQLException。所以,建立框架的第一步就是分析这些抽象体的行为,哪些是共同的,哪些是专有的。使用spring框架,最终的JDBC客户端代码是这样的:

JdbcTemplate template = new JdbcTemplate(dataSource);
final List names = new LinkedList();
template.query("SELECT USER.NAME FROM USER",
new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
names.add(rs.getString(1));
}
});

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号