软件项目实训及课程设计指导——可扩展性和可重用性是面向对象架构设计的主要目标
1、什么是合理的软件应用系统的系统架构设计
软件应用系统的设计人员经常会陷入一种困惑,面向对象系统架构设计结果的评价标准是什么?也就是说,什么是好的软件应用系统的系统设计或者不好的系统设计结果!
作者认为,软件应用系统的架构设计乃至整个软件应用系统的设计不存在“好”和“坏”之分,而只有“合理”和“不合理”之区别。因为软件应用系统设计的结果是要满足多种不同的应用要求,而往往这些应用要求之间可能是相互矛盾的。
因此,软件应用系统的设计人员必须要采用“中庸”的设计解决方案——综合考虑不同的应用要求、并尽可能地满足各个方面的应用要求或者合理地进行取舍。
什么是合理的软件应用系统的系统架构设计?合理的系统架构设计结果应该能够满足如下几个基本的要求,而满足了这些基本的要求,才有可能保证本软件应用系统的体系架构设计结果达到高内聚低耦合的系统设计目标。
1)可扩展性(Extensibility)
2)可重用性(Reusability)
3)灵活性(Flexibility)
4)可插入性(Pluggablity)
其中的可插入性是指能够容易地将软件应用系统中的一个功能模块抽出,同时也能够将另一个有同样接口的功能模块加入到该软件应用系统中以替换原有的功能模块。
而可扩展性是指软件应用系统本身能够根据外界需求的变化不断地调整和完善以适应外界需求的变化——也就是能够循序渐进地进行软件应用系统功能的扩展、并且也能够满足企业对软件应用系统的逐步升级的需要。
下图所示为某个软件应用系统持久层中的各个组件的设计和实现方案的图示,在数据库操作组件和各个数据库连接具体实现组件两者之间添加一个数据库连接接口,并在该接口中包含数据访问操作组件中所需要的各种数据库连接的服务方法的定义,而某个具体的数据库连接组件则实现这个接口。
此时数据库访问操作组件则只需要调用数据库连接组件接口中的服务来实现对数据库的各种连接功能,两者都只依赖于数据库连接组件的接口。如果数据库连接的具体实现要求发生变化,只需要再提供另一个数据库连接实现组件就可以满足这些变化——比如当软件应用系统应用MySQL数据库系统时,则只需要提供一个连接MySQL数据库系统的数据库连接组件实现类,而如果软件应用系统最终应用MSSQLServer数据库系统时,则只需要提供一个连接MSSQLServer数据库系统的数据库连接组件实现类。
如下示图为某个BBS论坛应用系统中的系统持久层系统架构设计中针对不同类型的业务处理数据设计出不同的数据库访问操作DAO组件的UML类图的局部截图,为了保证本BBS论坛系统能够适应不同的物理数据库系统的应用环境的变化,各个不同的数据库访问操作DAO组件都依赖关联数据库连接的接口ConnectDBBean。
2、什么是不合理的软件应用系统的系统架构设计
什么是不合理的软件应用系统的系统架构设计?为什么会出现不合理的系统架构设计?如何避免出现不合理的系统架构设计?希望读者多深入思考这些问题,一个不合理的软件应用系统的系统架构设计结果的主要表现如下:
1)缺乏灵活性——很难在软件应用系统中添加新的功能模块,因为对软件应用系统中的每一处的修改就会影响到软件应用系统中其他多个不同的功能模块,产生“牵一发而动全身”的影响效果,该软件应用系统的体系架构设计是僵化的!
2)脆弱性——对软件应用系统中的某个模块进行修改后,却导致软件应用系统中的另一个关联的模块也要发生被动地变化和修改,产生“多米诺骨牌”式的连锁修改!
3)不可重用性——软件应用系统中的某些功能模块很难在别的软件应用系统中被重新使用,因为不能将它从现有的软件应用系统中独立地提取出来,产生类似“拔出萝卜带出泥”的状况!如下示图为某个Web应用系统中的Web页面实现的代码局部截图--HTML标签和Java处理逻辑代码混杂在一起。
下图所示为某个软件应用系统持久层中的各个组件的不合理的设计和实现方案的图示,从下图中所示的数据库操作组件和数据库连接组件之间的关系来看,两者产生了紧密的藕合关系。一旦数据库连接组件有了任何变化(比如连接的方式或者数据库系统类型等),数据库操作组件都有可能会受其影响而需要被改动——意味着该软件应用系统的系统持久层缺乏灵活性和太脆弱,也就意味着该软件应用系统的系统架构设计存在一定的缺陷!
3、为什么要保证软件应用系统的体系架构设计结果具有良好的可扩展性
企业推广或者应用信息化系统的基本目的是希望能够提高企业的竞争力,但企业随着业务的发展,如新增业务功能的处理、新增服务渠道等或者由于技术本身的不断进步等方面的各种原因,原有的软件应用系统可能不能完全再满足企业目前经营的新的应用要求。
当然,对于软件应用系统的使用者也不希望抛弃原有的软件应用系统,如果重新再开发新的软件应用系统,这将会增加用户方企业的经营成本。而是希望能够在原有的软件应用系统的基础上,进一步完善原有的软件应用系统的功能和进一步地增加新的功能——延续软件应用系统的生命期。
一个合理的软件应用系统的系统架构设计的结果是能够适应用户方的“变化”的要求,并且所添加的扩展功能模块都可在原有的软件应用系统的系统架构的基础上加以扩展实现的——设计人员应该要保证软件应用系统中分层中的每一层中的各个功能组件都能够扩展。
如果软件应用系统的体系架构设计本身是僵化的,也就是不具有良好的可扩展性,软件应用系统在升级的过程中将不可避免地要改变原来的软件应用系统的系统架构。而软件应用系统的体系架构的重新调整和完善,不仅会增加软件应用系统代码维护的工作量,也还会带来技术和成本等方面的风险。
如下示图为某个BBS论坛系统的整体架构设计示例图,该BBS论坛系统采用Struts+Spring+Hibernate架构所组成。这样的架构设计首先是多层非分布式的构架,上图展示了软件应用系统的分层以及每一层中所采用的技术和对应的框架,并且各层将存在于同一个Web容器中。
本BBS论坛系统的总体架构设计所体现出的主要特点:
(1)遵循SunJ2EE中两个主要的设计原则:“多层架构、松藕合”。
由于采用分层的设计方式,各个模块功能相互独立封装,层与层之间关联少,保持松耦合连接,稳定性高,便于扩展和维护。
(2)本软件应用系统项目中的每一层所采用的技术都是可替换的,从而保证了体系架构设计结果具有良好的可扩展性。
例如系统表示层中的Struts框架可以被JSF或者Tapestry替换掉,JDO可替换系统持久层中的Hibernate框架。
1)在系统中的每个层中都不同程度地应用了J2EE中常用的设计模式
2)使用基于POJO的轻量级架构,从而使得软件应用系统易于测试;便于移植;“开发—发布”周期短。
4、为什么要保证软件应用系统的体系架构设计结果具有良好的可重用性
(1)什么是软件应用系统设计中的“可重用性”
软件应用系统设计中的“可重用性”一般是指软件应用系统中代码实现的可重用性。当然,软件设计的可重用性不应该仅仅局限于功能实现的代码方面,也还应该包括软件应用系统的系统架构设计方面。因此,软件应用系统的系统设计中的“可重用性”应该体现在“系统结构(分层和分块)”和“代码实现(源程序代码和可执行的功能组件)”两个方面。
如下示图为某个BBS论坛系统中应用Struts+Spring+Hibernate架构的系统结构设计示例图,在系统的表示层重用Struts框架,而在系统的业务服务处理层中重用Spring框架,在系统的持久层中重用Hibernate框架,从而保证了本应用系统在系统架构级别上能够重用成熟的J2EE应用框架。
如果能够实现软件应用系统的系统架构级别上的重用,则能够大大地简化软件应用系统设计的工作量、减少系统设计中的错误,并减少系统测试和调试的时间。因此,软件应用系统的系统架构设计是整个软件应用系统开发过程中比较关键的一个环节,并且系统架构的选择结果将决定软件应用系统开发实现的成败。
(2)软件应用系统设计中的可重用性表现为多个不同的层次
通用和共性的软件模块一般都是由底层的操作系统或开发平台、开发工具所提供的,如通用API系统库、平台级别的功能组件、程序模板库等;企业应用系统的开发人员主要专注于解决某一领域的特定的应用问题时的可重用性方面。
对这些特定的应用问题,从表面上来看,各个问题都有差别。但只要对它们进行细分处理后,仍然也会发现有许多共性之处——将公共的、相对独立的和稳定不变的逻辑或模块同特定的逻辑相互分开。比如各个商业银行中的账户管理系统,都应该提供“存钱”、“取钱”和“转账”等方面的功能,这些是公共的、相对独立的和稳定不变的逻辑。
(3)在面向对象编程中实现类级别重用的基本方法
在面向对象编程实现中有两种方法可以重用类:其一是创建该类的对象实例,并通过该对象实例直接使用类中的方法;而另一种方法便是继承该类以派生出一个满足需要的子类。
面向对象编程技术中的继承机制不仅可以重用基类的数据结构和功能方法的程序代码,而且还可以在基类的基础上根据具体的需要进行修改和扩充——通过新增、覆盖或者重载等形式。
如下示图为某个BBS论坛系统中的控制层组件部分程序类关系的UML类图的局部截图,在控制层组件中对系统的ActionServlet基类进行继承,并根据应用系统的需求扩充出对应的派生类BBSActionServlet子类。
此外,系统中的不同业务处理的Action类都继承于系统的ActionBase基类,从而实现对系统框架的重用,同时也允许根据应用系统的特定应用需求修改和扩充——通过新增、覆盖或者重载等形式。