春风博客

春天里,百花香...

导航

<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

统计

公告

MAIL: junglesong@gmail.com
MSN: junglesong_5@hotmail.com

Locations of visitors to this page

常用链接

留言簿(11)

随笔分类(224)

随笔档案(126)

个人软件下载

我的其它博客

我的邻居们

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

应用程序的层次浅谈

一般来说, 在创建一个应用程序之前,首先要决定这个应用程序的体系结构。应用程序体系结构(Application Architecture)由应用程序开发者设计,它指定了在各种各样的终端系统上,应用程序是如何组织在一起的。为了降低设计难度,大部分程序都以层(称为layer或level)的方式组织在一起,每一层都建立在它的下层基础上,使用下层提供的服务,下层对上层隐藏了许多服务实现的细节。这种方法几乎应用于整个计算机科学领域,也可以称为信息隐藏,数据类型抽象,数据封装,面向对象编程等。

 

分层即是对类进行一些规划,以流程中的类的用途和所处环节划分,把程序中将要用到的各个类分别归纳到各个包(目录)中。分层是对系统进行细分的第一步,它旨在将系统按具体功能和用途分解为相对独立的各个部分.如果说细分是将把难以解决的大问题分解成了各个容易解决的小问题的话,分层则是把解决同类小问题的类归纳到一起,这样程序的结构更加清晰,程序的可读性和可维护性越好,也更容易得到重用。

从大的尺度来讲,一个程序可粗略的分成三个层次:

界面层(UI layer),这是用户能直接感受到的,包含显示和控制两部分;

业务层(Business layer),其中包含了业务逻辑和业务处理;

持久层(Persistence layer),它用来将数据存储和将数据从持久层提取出来。

界面层(UI layer)中,包含两个层次:视图层View和控制层Controller.

视图层View是用户查看数据,输入和向用户输出结果的一层,这一层是用户唯一能够感受软件功能的窗口,它或者由Swing组件搭建(桌面系统或C/S系统中),或者由JSP搭建(B/S系统),它负责让用户输入数据和将控制层返回的数据显示给客户。其中返回的数据一般是领域对象的变体或者直接就是领域对象或其集合。在Web程序中jsp基本就属于这一层的。

控制层Controller是用来将界面和业务层联系在一起的,在系统的各层次中,应该和View层打交道一般只有Controller层, Controller层是View层和系统其它层次进行交互的中介者, View层越过中介者直接调用其它层次的行为应该尽量避免。

一般来说,为了减少耦合,提高程序的可维护性,我们一般采用MVC架构模式将业务层,视图层和控制层分开。

 

业务层(Business layer)中包含领域层 Domain,服务层 Service和实用工具层Util。

业务层是整个系统的关键部分,它主要由领域模型和业务逻辑组成,领域模型定义系统内相互作用的各个实体,业务逻辑则定义了领域模型所能执行的不同操作, 领域层的各个类代表了领域模型,而服务层的各个类代表了业务逻辑. 领域层和服务层是起点,其它各层都从这里起步.

领域层 Domain:领域对象是对现实世界业务处理对象的抽象和归纳,领域层中的类基本上都是实体(Entity)类,如员工管理系统中的Employee,学籍管理系统中的Student,借贷管理系统中的Contract等,系统的业务处理中用到那些实体对象,领域层中一般就应该有和这个实体对象相对应的实体类。这些类在刚开始设计时可能只有一些属性和对应的getter/setter方法,以后会不断的加入新的内容(主要是方法),如果有必要的话,可以为这些领域对象设计一些上层的抽象类或者接口,借助于泛型,反射,控制反转等高级技能能在一定程度上简化程序的编写过程。此外,领域层是程序的核心内容,因为其他层次都在很大程度上依赖Domain层的设计,如果这一层设计不够完善会使以后的工作步履蹒跚.

服务层Service:这一层就是为领域对象提供服务用的,领域对象一般不直接和表现层,持久层直接打交道而是通过服务层进行代理.服务层是UI层到持久层的中间通道,它处于上通界面下通持久层的中间环节,这个特性是使的这一层决定了软件功能的多少。
一般来说,UI层向服务层传入的是用户输入的一些参数,服务层进行验证,重组后向下层DAO传输;而服务层从Dao层收到的是领域对象或其集合,而它向UI层返回的是领域对象或者其集合的变体或者直接是领域对象或者其集合本身。Service诸类的实例在桌面程序和CS程序中一般作为Model的一个私有成员,而在Web程序中常常要用到时再创建出来。除领域层外,其余各层是在围绕它而设计.

实用工具层Util:这一层相对简单,它包含了各种工具类,类中包含的主要是静态函数和静态成员变量,这些类对共通的函数,变量进行了归纳,它旨在消除重复代码,降低主体代码的复杂程度.一般此层中类的复用程度很高.值得通过项目积累.

 

持久层(Persistence layer)是直接与持久介质打交道的层次,持久介质可以是常见的关系型数据库,文件甚至Web Service,它一般包含两个部分。

数据存储对象层(DAO层),sql语句一般写在这层中, 然后由它调用;DAO层是最低的一层,与持久介质直接打交道,它包含具体文件的位置,数据库连接等;

另一个部分就是持久介质,通常是关系型数据库
Dao层中各个类一般作为Service的私有成员,供Service调用。

 

下图是各层间的位置关系图:

 

如何从需求中分析出诸个层次中的类呢,我们在大尺度上可以按照下面的步骤进行:

Domain the first:首先从业务流和业务规则中归纳总结出领域对象.
Service the second:为领域对象设计服务类。
Persistence the third:持久层的负责领域对象持久化到持久介质以及逆过程,它的设计在领域层和服务层之后,比较典型的持久层设计有数据库表的设计和ER图(实体关系图)的绘制.
View the last:最后设计表现层,表现层受领域层和服务层制约, 容易变化且易于修改,通常放在最后实现.

 

具体步骤如下

1.理解,分析,钻研需求,彻底了解你的客户想要什么,需要你做些什么.
2.将大系统分解成一个个子系统,细分出各个层次,搞清楚各层的任务。
3.分析业务逻辑,归纳出业务流.
4.从业务流和业务规则中总结出领域对象.
5.为领域层实现服务层.
6.以Domain层和Service层为核心设计表现层和持久层,直到形成完整的程序.
7.加入实用层消除重复代码,梳理结构和简化流程,.
8.限制跨层的调用.

posted on 2008-08-08 12:57 sitinspring 阅读(1712) 评论(3)  编辑  收藏 所属分类: Object Orient Programming

评论

# re: 应用程序的层次浅谈 2008-08-08 22:40 dennis

持久层,我更愿意称为数据源层,因为数据完全可能来自其他系统、消息系统等,当然一般都是数据库。你对领域对象的定义,貌似还是贫血的POJO对象,而领域对象的概念更应该是指融合数据访问以及业务逻辑的真正语义上的对象。服务层仅仅是UI层到领域对象的薄薄一层API封装,以用例做组织。  回复  更多评论   

# re: 应用程序的层次浅谈 2008-08-09 10:20 漂泊者

@dennis

关于持久层的提法挺恰当的。

我觉得按照单一职责原则,领域用于抽象现实对象就够了,功能和持久应该让服务层和数据访问对象层完成。如果都包含的话,不就又成了Ejb的Entity Bean了吗?  回复  更多评论   

# re: 应用程序的层次浅谈 2008-09-23 09:57 Jack.Wang

具体步骤如下

1.理解,分析,钻研需求,彻底了解你的客户想要什么,需要你做些什么.
2.将大系统分解成一个个子系统,细分出各个层次,搞清楚各层的任务。
3.分析业务逻辑,归纳出业务流.
4.从业务流和业务规则中总结出领域对象.
5.为领域层实现服务层.
6.以Domain层和Service层为核心设计表现层和持久层,直到形成完整的程序.
7.加入实用层消除重复代码,梳理结构和简化流程,.
8.限制跨层的调用.

说的很好!分层原理和功能垂直分割是系统体系结构分析的基础!

View the last:最后设计表现层,表现层受领域层和服务层制约, 容易变化且易于修改,通常放在最后实现.

如果实际这么做的话可能存在问题,等你把所有的下层都实现了,在你实现表现层的时候确不满足客户需求,咋办!一般很多公司习惯上以原型演化的方式分析和设计需求。这时候界面原型和领域模型会出来,这样很好和客户以及开发人员达成共识。
虽然很久没开发 b/s 的系统了,但看到这篇文章还是赞一下。期待更多的文章!
  回复  更多评论   

sitinspring(http://www.blogjava.net)原创,转载请注明出处.