Skip to main content

简单的MVC就够了吗?浅谈service Layer的引入



MVC是web开发中常见的程序结构。
简单的mvc结构如下:
view层:显示层。
control层:业务层,集合了各种action。
model层:模型层,一般和数据打交道。简单的sample:一个表对应一个model类。
其中control层调用model层的方法,实现对数据的访问。

采用这样的结构在一定程度上,可以做到代码清晰,较容易扩展,代码的管理复杂度较低。
但是如果是业务很多,逻辑又很复杂的网站,如果再加上开发人员的水平参差不齐,那必然会导致下面的情况:
1 action中的代码越来越长,逻辑越来越复杂,不同action之间看起来有很多可以重用的代码, 但是真要进行重构的话,又非常困难。
2 model层中包含的方法越来越多,有些方法也过于复杂。甚至在不少方法中还包含了业务逻辑。
3 代码的修改,还是牵一发而动全身。
4 代码难以进行自动化测试。

本来以为引入了mvc,程序的管理复杂度问题就高枕无忧了,但现在又面临了相同的问题了。

以我最近的所学看,在mvc中再引入service层,可以在很大程度上避免或者缓解上述问题。
原有的mvc结构改成如下:
1 view层:显示层。
2 control层:业务层,集合了各种action。
3 service层。
4 DAO层。
原来的model层不见了,增加了service层和DAO层。DAO,即Data Access Object,数据访问接口,数据访问:顾名思义就是与数据库打交道

在这个结构中,control不直接和DAO联系,
需要操作数据的时候,通过service层访问DAO层来实现。
service层做的事情,不仅仅是调用DAO操作数据,还会包含了一定的业务逻辑。整个程序的设计,也变成了针对服务进行设计。

这样做的好处是:
1 control层中的action得以精简,因为action中的一些逻辑,被重构成一个个的服务。而不同的action也可以重用服务了
2 只负责和数据打交道的DAO层,相比之前的model层,也得以精简(DAO层尽量只做最原子的数据操作,不同数据操作之间的联系,这边不考虑,那是service层的事情)。
3 service层可以实现很大程度上的代码复用,程序的功能封装更清晰了。
4 由于service层更加清晰的定义了应用程序的边界,那么对于各个service函数(对应某个服务/应用),要做到自动化测试就方便多了。WEB程序如何做到能方便的进行单元测试,这是一直困扰我的难题,这样的设计似乎真的可行了~
5 开发人员的工作分配,理论上真的可以按层次划分了。只是理论上~

同时,这样的设计模式也是存在一定的缺点的:
层次太多,刚接触的开发人员理解起来比简单的mvc结构费时;
service层的设计需要一定的功力,因为action中和model层的逻辑在很大程度上转移到这里了。

但整体上看,service Layer的引入,更加清晰的定义了应用程序的边界,提供了一系列可以重用的操作集合。这对于网站的可扩展性和可维护性是非常有帮助的。

from http://www.blogjava.net/wealupa/archive/2010/10/07/333904.html

Comments

Popular posts from this blog

How to install JSVC on Linux WidenHome Log | WidenHome Log

How to install JSVC on Linux WidenHome Log | WidenHome Log In our team, we have a lot of Java standalone applications which should be run as daemon on Unix/Linux system, and we found JSVC is the best choice for us to wrap Java programs to daemons. This article records the steps on how to install JSVC executable on Linux, which is our stage/prod environment. Download JSVC source package First of all, we need to download JSVC source package from this URL: http://commons.apache.org/daemon/download_daemon.cgi , for example, I downloaded commons-daemon-1.0.5-src.tar.gz file. Or, download it via wget: wget -c http://apache.etoak.com/commons/daemon/source/commons-daemon-1.0.5-src.tar.gz Build JSVC executable Unzip the source package and build JSVC executable. chmod 755 commons-daemon-1.0.5-src.tar.gz tar zxvf commons-daemon-1.0.5-src.tar.gz cd commons-daemon-1.0.5-src/src/native/unix Before building the JSVC executable, please make sure you have set JAVA_HOME variable correctly. And make sur...

Java中的Serializable浅谈

from  http://www.cnblogs.com/vicenteforever/articles/1471775.html 对象的串行化(Serialization) 一、串行化的概念和目的 1.什么是串行化             对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力。叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化(Serialization) 。串行化的主要任务是写出对象实例变量的数值。如果交量是另一对象的引用,则引用的对象也要串行化。这个过程是递归的,串行化可能要涉及一个复杂树结构的单行化,包括原有对象、对象的对象、对象的对象的对象等等。对象所有权的层次结构称为图表(graph)。 2.串行化的目的             Java对象的单行化的目标是为Java的运行环境提供一组特性,如下所示: 1)       尽量保持对象串行化的简单扼要 ,但要提供一种途径使其可根据开发者的要求进行扩展或定制。 2)       串行化机制应严格遵守Java的对象模型 。对象的串行化状态中应该存有所有的关于种类的安全特性的信息。 3)       对象的串行化机制应支持Java的对象持续性。 4)       对象的串行化机制应有足够的 可扩展能力以支持对象的远程方法调用(RMI)。 5)       对象串行化应允许对象定义自身 的格式即其自身的数据流表示形式,可外部化接口来完成这项功能。 什么情况下需要序列化 a)当...

Log4j Configuration

First, include  Log4j   jar file in your project (e.g. log4j-1.2.8.jar) From  http://www.javabeat.net/tips/82-baisc-steps-to-configure-log4j-using-xml-and.html Configure Log4j This example demonstrated how to configure  Log4j  setup using the Proerties file and  XML file . These are the two most widely used techniques for configuring the  Log4j  for your application. But, in the recent days configuring with  properties files  are considered to be old technique and recommended using  XML . This example program uses simple satndalone java program for running the example. But, in most of the  project  scenarios it will be used in the web application. However the configuration file will be the same. log4j.properties # Set root logger level to DEBUG and its only appender to Appender1. log4j.rootLogger=INFO, Appender1,Appender2 # Appender1 is set to be a ConsoleAppender. log4j.appender.Appender1=org.apache...