软件的分层
目前典型的应用软件的结构:三层结构
表述层:提供与用户交互的界面。GUI(图形用户界面)和web页面是表述层的两个典型的例子。
业务逻辑层:实现各种业务逻辑。
数据库层:负责存放和管理应用的持久性业务数据。
区分物理层和逻辑层
软件的分层包含两种含义:一种是物理分层,即每一层都运行在单独的机器上,这意味着创建分布式的软件系统;一种是逻辑分层,指的是在单个软件模块中完成特定的功能。
业务逻辑层和数据库层运行在同一台机器上,这台机器即是应用服务器,又是数据库服务器,因此整个系统物理上分为两层,而逻辑上分为三层结构。
软件层的特征
软件层必须符合以下特征:
1、 每个层由一组相关的类或组件(如EJB)构成,共同完成特定的功能。
2、 层与层之间存在自上而下的依赖关系,即上层组件会访问下层组建的API,而下层组件不应该依赖上层组件。例如:表述层依赖于业务逻辑层,而业务逻辑层依赖于数据库层。(基本特征)
3、 每个层对上层公开API,但具体的实现细节对外透明。当某一层的实现发生变化,只要它的API不变,不会影响其它层的实现。(向上公开接口,封装实现细节)
软件分层的优点
恰当的为软件分层,将会提高软件的以下性能。
1、 伸缩性(指应用程序是否支持更多的用户)
2、 可维护性(指的是当发生需求变化,只需修改软件的某一部分,不会影响其它部分的代码。层数越多,可维护性也会不断提高)
3、 可扩展性(指的是在现有系统中增加新功能的难易程度)层数越少,增加新功能就越容易破坏现有的程序结构。层数越多,就可以在每个层中提供扩展点,不会打破应用的整体框架。
4、 可重用性(指的是程序代码没有冗余,同一个程序能满足各种需求)
5、 可管理性(管理系统的难易程度)
软件分层的缺点
软件分层越多,对软件设计人员的要求就越高。在设计阶段,必须花时间构思合理的体系结构。此外,软件层越多,调试会越困难。如果应用规模比较小,业务逻辑很简单,软件层数少反而会简化开发流程并提高开发效率。
Java应用的持久化层
业务逻辑层不仅负责业务逻辑,而且直接访问数据库,提供对业务数据的增、删、改、查操作。为了把数据访问细节和业务逻辑分开,可以把数据访问作为单独的持久化层。
“数据访问”是专业术语,指的是在应用程序代码中生成恰当的SQL语句,然后通过JDBC API访问数据库,对数据进行增、删、改、查。
持久化层封装了数据访问细节,为业务逻辑层提供了面向对象的API。完善的持久化层应该达到以下目标:
1、 代码可重用性高,能够完成所有的数据库访问操作。
2、 如果需要的话,能够支持多种数据库平台。
3、 具有相对独立性,当持久化层的实现发生变化,不会影响上层的实现。
目前在持久化层领域,已经出现了许多优秀的ORM软件,有的是商业性的,有的是开发源代码的。Hibernate就是一种开发源代码的ORM软件。ORM软件具有中间件的特征。中间件是在应用程序和系统之间的连接管道。Hibernate可看成是连接Java应用和关系数据库的管道。中间件和普通应用程序代码的区别在于,前者具有很高的可重用性,对于各种应用领域都适用;后者和特定的业务功能相关,不同业务领域的应用程序代码显然不一样。中间件的另一特点是透明性,作为Hibernate的使用者,无需关心它是如何实现的,只需要知道如何访问它的接口就行了。
透明与封装具有同样的含义,软件的透明性是通过封装实现细节来实现的。
///
分层是软件设计中非常重要的思想,特别是面对较大的软件系统。分而治之是计算机中经常采用的一种方法。比如TCP/IP七层协议栈就是典型的分层应用。任何一个合格的软件开发者都必须掌握的分层思想。下面是软件分层的几个基本概念:
一、分层
1、经典的三层理论将应用分为三个层次
(1)表现层(Presentation Layer):显示信息,处理用户的请求
(2)领域/逻辑层(Domain Logic Layer):逻辑,实际的业务活动,系统中真正的核心
(3)数据访问层(Data Access Layer):与数据库、消息系统等的通信
实际应用中,有四层的五层(如:J2EE)的。在 Windows .NET 中表示层可以通用数据感知组件访问数据库,使用很方便。但是这种技术破坏了层和层之间的依赖关系,对于大型软件的开发一般是不允许的,小型软件使用也未尝不可。
2、基本原则:领域层和数据源层绝对不要依赖于表现层。
二、表现层
用户界面,Web页面或Windows窗体。
三、领域层
领域逻辑的组织,三个模式:
(1)事务脚本:结构化
(2)领域模型:面向对象
(3)表模块:与记录集相关。.NET中含有基于记录集的工具(DataTable/DataSet),则使用表模块较为方便。
四、数据访问层
为数据库表建立入口,使用入口的两种基本方法:
(1)行数据入口:每一行一个实例,面向对象的方式。
(2)表数据入口:记录集,如.NET中的DataTable,DataSet
在分解复杂的软件系统时,软件设计者用的最多的技术之一就是分层。
例如网络互联中,HTTP层架构在TCP之上,TCP架构在IP之上,IP又架构在以太网之上。
例如我们常用的很多软件,还有网站,都明显的这三层结构:表现层,业务逻辑层,数据存取层。
在这种组织方式下,上层使用了下层定义的服务,而下层对上层一无所知。另外,每一层对自己的上层隐藏其下层的细节。
好处:
在无需过多了解其他层次的基础上,可以将某一层作为一个有机整体来理解。例如,无需知道以太网的工作细节,你照样可以在TCP上构建HTTP服务。
可以替换某层的具体实现,是要替换前后提供的服务相同即可。例如,HTTP服务无论是在以太网、PPP上、还是其他任何网络上都无需改变,而且与提供传输电缆的网络运营商无关。
可以将层次间的依赖性减到最低。假设网络运营商改变了物理传输系统(电话线改为光纤),但只要IP层不变,HTTP服务就可以不变。
分层有利于标准化工作。TCP和IP就是关于他们各自层次如何工作的标准。
一旦构建好了某一层次,就可以用它为很多上层服务提供支持。如,TCP/IP同时被FTP、telnet、SSH和HTTP使用。否则,所有这些高层协议都必须编写它们各自的底层协议。
缺陷也有:
层次并不能封装所有东西。有时它会为我们带来级联修改。如,一个网站要增加一个在页面上显示的数据项,就必须要在数据库中增加相应的字段,还要修改业务逻辑层,最后修改表现层。
过多的层次会影响性能。在每一层,一般都会从一种表现形式转换到另一种。不过底层功能的封装通常带来比代价更大的效率提升。
分层架构中最困难的问题是决定建立哪些层次以及每一层的职责是什么。拿网站应用举例。
表现层的主要职责:向用户显示信息,并把从用户那里获取的信息解释成业务逻辑层上的各种动作。
业务逻辑层的主要职责:必须做所有和业务相关的工作,包括根据输入数据或已有数据进行计算,对从表现层输入的数据进行验证,以及根据从表现层接收的命令来确定该调度哪些数据存取层的逻辑。有时候,业务逻辑层对表现层完全隐藏了数据存取层。
数据存取层的主要职责:主要关注与其他系统的交互。大多数情况,其他系统是指数据库,那么数据存取层的主要职责就是存取持久数据。
简单介绍到这,主要参考《企业应用架构模式》。PHP网站中分层的实践,有机会细说。好知网里 @kent 老师的实践教程、经验分享。