面向对象设计模式在数据批量处理过程中的研究与应用
2018-03-04戎小群
戎小群
摘要:在软件开发过程中,随着软件开发的进展,代码的冗余已经成为不可忽视的现象,这严重地影响软件开发的进度,同时也会造成系统维护的困难,因此代码是否精简直接影响应用系统的可维护性。该文通过具体的案例来说明,如何在恰当地应用面向对象设计模式的基础上,解决代码冗余的方法,以提高应用系统的可维护性。
关键词:面向对象设计原则;模板方法模式;DAO模式;代码冗余
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)36-0227-03
1 背景
软件开发过程中,常常会伴随着代码冗余,它降低了软件应用系统的可维护性,从而影响软件应用系统开发效率。按照目前软件迭代开发的理论,软件开发需要首先完成初始可运行的版本,然后逐渐迭代,最终达到面向对象的设计目标,其中也包含了减少代码冗余。因此,在迭代过程中,需要仔细分析可能出现代码冗余的模块,通过设计技术手段,消除代码冗余,最终提高软件开发效率,确保软件系统的可维护性。
该文就是讨论如何应用合适的面向对象设计模式,在实现数据批量处理过程中,消除代码冗余的方法。
2 面向对象的设计
2.1 面向对象设计目标
可扩展性(Extensibility):可以将新功能添加到系统中。
灵活性(Flexibility):在添加新功能代码的过程中,尽可能地减少修改量。
可插入性(Pluggability):能将一个组件替换具有同样接口的另一个组件。
2.2 面向对象的设计原则
在常用的面向对象设计原则中,开-闭原则(The Open-Close Principle,OCP)是面向对象的可复用设计的基石,此外还有单一职责原则(The Single Responsiblity Principle,SRP)、Liskov替换原则(The Liskov Substitution Principle,LSP)、依赖倒置原则(The Dependency Inversion Pricinple,DIP)和接口隔离原则等。这些设计原则是实现“开-闭原则”的手段和工具。
2.3 面向对象设计的具体思路
1) 在客户端尽量采用面向抽象或接口编程;
2) 高内聚,低耦合;
3) 采用恰当的面向对象设计模式,以提高软件开发的效率,达到减少代码冗余的目的。
2.4 面向对象的设计模式
设计模式(Design pattern)是一套能被反复使用的代码设计经验的总结。它使代码编写真正实现了工程化,是软件工程的基石脉络。
1) 数据访问对象(DAO)模式:主要用于软件架构的数据层,其主要功能为完成数据的编辑(添加、删除和修改)与查询。
DAO模式通常需要VO(值对象),通常一个DAO对应一个VO对象。
2) 模板方法模式:在父类中定义一个通用的操作,将其中一些具体功能延迟到子类中,从而在不改变原操作定义的条件下实现功能的扩展。
模版方法模式通常由一个抽象类和若干个具体子类组成,抽象类中的方法分为三种:
2.5 数据批量处理时的代码冗余现象
信息管理应用系统在信息处理时,均会频繁地访问数据库,访问数据库的目的主要由如下几种形式:
1) 往数据库添加数据;
2) 修改数据库中的数据;
3) 删除数据库中的数据;
4) 查询数据库中的数据。
在应用软件系统中,常用数据层来完成与数据库的交互,常常采用DAO(数据访问)模式。由于数据库的连接是一个“贵重”资源,因此,为了提高效率,常常要求一次连接能够完成批量数据的处理。那么如何才能高效地完成数据批量的处理(即,增删改查)?
2.6 模板方法模式在批量数据处理中的应用
2.6.1 案例
假设数据库testdb中包含两个roles和users两个表对象。这两个表对象的结构如下:
在对数据库中的表进行访问时,通常建立表与VO(值对象)类一一对应关系,如,以上两表各自建立一个JaveBean(Role和User)类,类中的属性分别对应表中的字段。同时分别创建两个访问两个表数据的DAO(RoleDAO和UserDAO)类。一旦数据库表的数量增加,相应的DAO也需要增加,代码的冗余将会产生;另外,即使对数据库中的一个表进行批量数据处理时(增删改查),也会出现代码的冗余。
2.6.2 设计思路
首先,解决批量数据处理时的编辑(即,增删改)操作所引起的代码冗余。
在对数据库表进行编辑(增删改)操作时,所有与表对应的VO(值对象)类都附加一个操作码,以代表是何种编辑(增加、删除、修改)。由此,从VO类中抽象出一个所有VO类的共同父类AbstractData,此类为抽象类。如图2所示。
<E:\电脑第36期\电脑第36期打包文件\8.7xs201836\Image\image55.png>
圖2 VO类图
通过应用模板方法模式,创建DAO类的父类AbstractDAO,该类为抽象类。如图3所示。
AbstractDAO中的方法说明:
1) 模板方法:
protected final int addRecords(Connection conn, ArrayList<AbstractData>datas)
protected final int deleteRecords(Connection conn, ArrayList
protected final int updateRecords(Connection conn, ArrayList<AbstractData>datas)
2) 抽象方法:
如下的三个方法分别完成返回添加、删除和修改的SQL语句的功能。
protected abstract String getAddSQL()
protected abstract String getDeleteSQL()
protected abstract String getUpdateSQL()
如下的三个方法分别完成对象转化为记录的功能。
protected abstract void handleAdd(PreparedStatementpstm, ArrayList<AbstractData>)
protected abstract void handleDelete(PreparedStatementpstm, ArrayList<AbstractData>)
protected abstract void handleUpdate(PreparedStatementpstm, ArrayList<AbstractData>)
以上六个抽象方法,均由DAO子类实现。
模板方法的代码示例如下:
protected final int addRecords(Connection conn, ArrayList<AbstractData>datas){
int count = 0;
String sql = getAddSQL();
try{
PreparedStatementpstm = conn.prepareStatement(sql);
handleAdd(pstm, datas);
int[] amt = pstm.executeBatch();
for(int i = 0; i < amt.length; i++){
count += amt[i];
}}catch(SQLException e){
}finally{
if(pstm != null){
pstm.close();
}}return count;
}public String editRecords(ArrayList<AbstractData>datas){
ArrayList<AbstractData>addList = new ArrayList<AbstractData>();
…
Connection conn = ConnectionFactroy.getConnection();
int add = addRecords(conn, addList);
…}
DAO類的继承关系如图4所示。
DAO类与VO类之间的关系如图5所示。
3 结束语
在进行软件开发的过程中,需要灵活恰当地应用设计模式,并将几种设计模式进行组合,在应用设计模式时,需要掌握设计模式的应用场合以及能解决什么开发问题。在应用设计模式时,要注意以下几个方面的问题:
1) 不能在需求不明确时,确定设计模式;
2) 不能为了设计模式而使用设计模式;
3) 不能“生搬硬套”设计模式;
4) 在迭代开发的过程中,完善与明确设计模式。
参考文献:
[1] 23种设计模式(6):模版方法模式[EB/OL].http://www.importnew.com/15546.html.
[2] Alan Shalloway, James R Trott.设计模式解析[M]. 徐言声, 译.2版. 北京:人民邮电出版社, 2007(10).
[3] 巴拉赫,兰宝. UML面向对象建模与设计[M].车皓阳,杨眉, 译. 2版.北京:人民邮电出版社, 2006(1).
[通联编辑:谢媛媛]