节选自《精通Hibernate:Java对象持久化技术详解》编著:孙卫琴
由于每个软件都有自身的特点,因此不可能提供一个适合于所有软件的体系结构,但总的说来,软件的层必须符合以下特征:
- 每个层由一组相关的类或组件(如EJB)构成,共同完成特定的功能
- 层与层之间存在自上而下的依赖关系,即上层组件会访问下层组件的APl,而下层组件不应该依赖上层组件。例如:表述层依赖于业务逻辑层,而业务逻辑层依赖于数据库层
- 每个层对上层公开API,但是具体的实现细节对外透明。当某一层的实现发生变化,只要它的API不变,不会影响其他层的实现
软件分层的优点
恰当的为软件分层,将会提高软件的以下性能。
- 伸缩性:伸缩性指应用程序是否能支持更多的用户。例如,在双层GUI应用程序中,通常对每个用户都提供一个数据库连接,如果有10000个用户, 则需要建立10000个数据库连接。而在三层结构中,可采用数据库连接池机制,用少量数据库连接支持多个用户。应用的层越少,可以增加资源(如CPU和内 存)的地方就越少。层数越多,可以将每层分布在不同的机器上,例如,在一组服务器作为Web服务器,一组服务器处理业务逻辑,还有一组服务器作为数据库服 务器。
- 维护性:维护性指的是当发生需求变化,只需要修改软件的某一部分,不会影响其他部分的代码。层数越多,维护性也会不断提高,因为修改软件的某一层的实现,不会影响其他层。
- 扩展性:扩展性指的是在现有系统中增加新功能的难易程度。层数越少,增加新功能就越容易破坏现有的程序架构。层数越多,就可以在每个层中提供扩展点,不会打破应用的整体架构。
- 重用性:重用性指的是程序代码没有冗余,同一个程序能满足多种需求。例如,业务逻辑层可以被多种表述层共享,既支持基于GUI的表述层,也支持基于Web页面的表述层。代码的重用可以减少开发人员重复繁琐的工作,提高开发效率。(注:最后一句话是我加的
- 管理性:管理性指的是管理系统的难易程度。将应用程序分为多层后,可以将工作分解给不同的开发小组,从而便于管理。应用越复杂,规模越 大,需要的层就越多。软件分层后,各个开发小组只需要掌握该层需要的技术,可以高效率的并行开发,这是加快开发速度,保证项目开发进度的最好办法。(注:最后一句话是我加的
软件分层的缺点
当然,软件分层越多,对软件设计人员的要求就越高。在设计阶段,必须花时间构思合理的体系结构。否则,如果在体系结构方面存在缺陷,例如, 层与层之间出现了自下而上的依赖关系,一旦业务逻辑发生变化,不仅需要修改业务逻辑层的代码,还需要修改表述层的代码。此外,软件层数越多,调试会越困 难。例如在三层结构中,由于存在自上而下的依赖关系,如果表述层运行出现了错误,该错误有可能是表述层产生的,还有可能是业务逻辑层产生的,也有可能是由 数据库层产生的,在这种情况下,每个软件层的开发人员必须联合起来,才能找到错误的原因。
如果应用规模比较小,业务逻辑很简单,软件层数少反而会简化开发流程并提高开发效率。