在Java EE的开发中,我们一直强调分层,什么MVC三层体系,N层架构,好像只有分的层越多,系统就越完美,才能体现出现代软件工程的优点。最近一直在思考,我们为什么要分层?分层的意义何在?怎样去组织各个层次的关系?
分层的好处就在于代码清晰,结构分明,有利于修改、维护和复用,这已经成为大家分层的一个最有说服力的原因。但是也并不是任何系统都要分层设计,简单的系统,可以选择较少的层,反而可以开发效率和系统运行的效率。特别在需求不断更新和未知的web开发中,分层也并不能给我们带来多少实质性的好处,反而增加的复杂度而不能及时响应需求。
但在大型的企业级开发中,我们通常要进行分层设计,而表现层、业务逻辑层、数据操作层是我们最普遍的层次划分,如下图所示。在表现层上,我们已经习惯了MVC的体系,常使用Struts,JSF等框架。而在MVC的体系中C是其中的核心,我们在这里用Action来表示,它处理客户端发送的请求并根据业务的流程进行转发。而实际的业务处理,则交给Service处理。我们常使用Spring、EJB去做这一层的架构。而数据持久层,JPA的标准,Hibernate、Toplink等ORM框架已经被我们越来越多的使用。
在分层体系中,我一直在思考,谁才是核心,哪一层才是系统最关注的部分。当然大家都很明白,业务才是系统核心,一切随业务的变化而改变。但是在实际的开发中,我却看到很多这样的现象,包括发生在自己身上的。我们过多的关注了表现层和DAO层,业务的变更最直观的体现是表现在页面上,表现层的变化是必须得,但是表现层的变化更多的体现在流程的变化。我们也经常喜欢去过度的处理DAO层,业务的变更直接体现到SQL上的变更,一个个业务逻辑被翻译成一条条复杂的SQL语句。而这些导致的结果是什么,Service层成为可有可无的鸡肋,它存在的意义完全成了连接Action和DAO的简单桥梁。以下代码确实反映了这个问题。
public A saveA(A a){
return this.aDAO.saveA(a);
}
public List<A> getAs(String a,String b){
return this.aDAO.getAs(a,b);
}
……
我们在开发的时候,虽然划分了Service层,但是这只是对DAO的简单调用,Service成了绝对的轻量级。有时候页面上需要一个几十行的list,只是由于分成了几块展示,而我们经常按照这几块去一次次的查询数据库,而不去试着让Service调用一次数据库取到所有的记录,然后通过一定得策略去分解这些记录。难道企业的开发只是数据库的操作?Java的运算性能难道只体现在SQL的优化上?这样的分层还不如不分,业务层也没有必要。
还是让我们回归Service的本来面目吧,让我们将action和DAO的部分功能向Service转移吧。Action只负责接受请求,调用具体的Service,进行处理后转发;DAO可以使用更精简的,更通用的方法处理所有数据的持久和查询,只需要封装最基本的增删改查就OK了。让Action和DAO尽可能的轻量级,只关注本身,而非业务。让业务层来处理更多的内容吧。如下是业务处理的方法。
public void saveA(A a){
//保存前某业务逻辑的验证,如数据合法性检查,业务规则验证
this.aDAO.saveA(a);
//保存完想JMS发送消息,通知用户已经处理
}
有人认为分层不好是因为一个地方改变,需要维护好多层,其实这是没有有效的使用分层,DAO和action层存在了过多的业务逻辑的处理,业务的改变当然会造成动一处而牵全身的后果。关注Service层,解放action和dao,保持action和dao的高度稳定性,利用稳定的业务接口和IoC等松散耦合的处理进行层层的交互,让程序人员更多的关注业务本身,而非其他的繁枝末节,这才是我们分层的目的。
但是在开发中的确面临着这样的问题,除了复杂的业务逻辑,Service中必不可少的需要简单的增删改查的简单调用,怎样才能让Service从中解放出来,让我们更多的关注真实的业务操作,这是下次要思考和讨论的问题。
原文:
http://www.po-soft.com/blog/yongtree/122.html
分享到:
相关推荐
信息安全分层逻辑模型信息安全分层逻辑模型信息安全分层逻辑模型信息安全分层逻辑模型信息安全分层逻辑模型信息安全分层逻辑模型信息安全分层逻辑模型信息安全分层逻辑模型信息安全分层逻辑模型信息安全分层逻辑模型...
分层架构与业务逻辑实现方式 为业务开发的相关总结,分享一下!
三层架构通常意义上的三层架构就是将整个业务应用划分为:界面层、业务逻辑层、数据访问层。...微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。
IBLL:业务逻辑层接口。 IDAL:数据访问层接口。 NBearDAL:基于NBear框架的ORM数据访问层实现。 NbearEntityDesign:NBear设计工程。 NunitTest:NUnit的单元测试工程。 SimpleBLL:业务逻辑层的简单实现。 Tools:...
一.基础知识准备: 1.层的原则: (1)每一层以接口方式供上层调用。 (2)上层只能调用下层。 (3)依赖分为松散交互和严格交互两种。... 分层架构的三个基本层次为:表示层、业务逻辑层和数据访
一.基础知识准备: 1.层的原则: (1)每一层以接口方式供上层调用。 (2)上层只能调用下层。 (3)依赖分为松散交互和严格交互两种。... 分层架构的三个基本层次为:表示层、业务逻辑层和数据访
五 PetShop之业务逻辑层设计 业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分。...作为领域驱动设计的先驱Eric Evans,对业务逻辑层作了更细致地划分,细分为应用层与领域层,通过分层
02-架构分层:我们为什么一定要这么做?_For_group_share1
巴黎银行-欧洲-宏观策略-欧洲央行的分层:执行问题-0404-8页.pdf
JSP分层实现业务处理(用户登录)
javaee开发常见的模式有MVC模式,在C层中常常会再次分层,如:servlet(web层)、service(业务逻辑层)、dao(数据访问层),其中service和dao最容易混在一起,如转钱交易场景,service层需要执行“事务”操作,会...
三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架三层构架...
Controller 层:控制器层,用于把用户请求转发到具体的 方法上,通过调用业务逻辑层的方法执行具体业务逻辑; util 包:存放工具类。 4.实现功能 (1)完成成绩管理系统成绩管理模块首页; (2)完成成绩管理系统...
迭代分层是一个为兼容的交叉验证器提供分层的项目,用于对多标签数据进行分层。 目前,scikit-learn为多个交叉验证器提供了分层。 但是,这些交叉验证器无法对多标签数据进行分层。 此迭代分层项目提供了...
在研究分层架构时,常通过概念性的定义或OSI七层应用(架构)来说明或解释分层架构:架构模式Layers有助于将应用程序划分为多组子任务,其中每组子任务都位于特定抽象层。图片取自《POSA,Vol.I,p22》作为一个在项目...
开发业务应用角度对程序的划分,其分层逻辑来源于“高内聚低耦合”的思想,在开发中针对这种有三层架构和五层架构
从下至上分别为:数据访问层、业务逻辑层(又或成为领域层)、表示层 数据访问层:有时候也称为是持久层,其功能主要是负责数据库的访问 业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关 表示层:...
社会分层是指社会和个人根据相关社会所决定的某些重要属性的等级安排。 发展本身就是一个进化过程,但近来这个过程是由政府,非政府组织,专业人员,媒体以及有时是流浪者发起的。 在本文中,我们试图了解以官方立法...
mySQL实现数据库的增删查改操作。 需求: ...数据库设计 提供帐户表以保存帐户数据 ...实体设计 ...业务逻辑设计 ...JDBC应用分层 ...横向分层(业务层与持久层按抽象程度分): 抽象层 实现层 表现层不需要再进行横向分层
Controller(控制器):控制器层负责接收用户请求,调用相应的业务逻辑处理程序,并将结果返回给视图层。在 JSPMVC 中,控制器通常由 Servlet 实现,负责解析请求、调用业务逻辑组件处理请求,并将结果转发给视图。 ...