请教开发中的分层问题,急!!!

07-06-11 Monday611

现开发的项目,

持久层:hibernate

业务层:spring

表现层:没有使用什么struts框架,使用了本公司的一个框架,并且JSP中使用的C标签。

现在拿页面数据的保存和显示,来说一下我所要请教的问题。

一、背景环境:

(一)保存

1> 利用公司的框架,会自动把页面数据绑定到formbean(formbean中的数据对应于多个表中的数据)

2> 利用公司的框架,会执行相应的业务类,把formbean中的值分到所对应的各个PO中,并把这些PO存放到list列表中。

3> 然后调用业务服务类,把list列表中的各个PO,调用DAO的相应方法持久化。

(二)显示

1> 利用公司框架,执行相应的业务类调用DAO中相应的方法,进行数据查询。假如是通过userid查询获得用户信息,方法返回为User对象(即PO),并把此对象存在request的attribute中(以便通过页面的C标签获得)。

2> 通过C标签获得User对象的各个属性值显示在JSP页面上。

二、请教问题

公司前一个小项目的工作形式,如上面所说的保存和显示。

现感觉有点问题,请指点:

A> 数据显示:在页面显示时通过C标签直接获得PO对象,并显示其各个属性值是否合适?是否应在业务类中把查询得到的PO对象进行封装,把PO对象的数据对应封装到Formbean中,然后把此Formbean对象存在request的attribute中,最后通过C标签显示在页面上。

B> 数据保存:我现在采用的这种方式是否有问题?

现在想,无论是保存还是显示,是否都不应直接操作对应于数据库的PO?如果不应该,我是否应在业务层加入BO,查看了一些资料,感觉BO和PO没有什么区别,那我要怎么做呢?

为了使项目针对需求的改动(如表中加入一字段、页面显示格式变化等),能有更大的适应性,也就是最少的代码改动,并且只在一层做改动即可。

由于项目经验不足,所以不知如何做,请banq指点。

十分感谢!!

         

1
banq
2007-06-12 09:50

你这个框架可以说比数据库驱动框架要前进一步,应该说处于数据库和对象模型之间的中间道路,你的PO实际是数据库的影子,只不过以对象形式存在,必须先有数据库设计才会有PO,这实际还是数据库驱动设计思路,比较符合那些传统过程思维的人使用。对象PO还是服从于数据库,数据库设计是父母,PO对象是儿子,是这样先后关系。现在真正的OO系统应该是PO是父母,数据库才是儿子,应该倒过来。

那么问题来了,数据库做父母时,我们知道如何先创造数据库,这可以凭我们所谓的直觉和经验(还有一些号称理论的数据库建模);现在改为必须先设计对象,如何从需求中将对象找出来,这方面就需要对象建模,如本站介绍的四色图 Evans DDD

纲举目张,当你将PO作为主要纲抓起来以后,它在各层实现以及关系就自然解决,这方面实际案例可以看看基于jdonFramework的Jivejdon3

[该贴被banq于2007年06月12日 09:53修改过]

Monday611
2007-06-12 10:56

首先谢谢banq的回复,最近也一直在看你的关于领域驱动设计的文章。

现在,还是有一些不太明的的地方,请赐教:

1> 假如我现在是以对象建模的方式工作,那么我在前台是否可以获得查询所得到的Model对象?这种方式是否合适?

2> 你所提供的案例Jivejdon3 中Model会实现或是继承com.jdon.controller.model包中的接中和类,而com.jdon.controller.model下的内容是保密的,所以我不能完全理解这个思想。你能发一个小的案例给我吗,利用此思想从设计建模的图到最后的代码,不知我的要求是否过分,十分感谢。

请发到我的邮箱:huangzihua1219@163.com ,对于你的指点我不胜感激。

leadyu
2007-06-12 12:43

建议增加BO层,BO和PO是具有本质区别的,前者是面向对象分析的结果产物,后者是基于数据库分析结果的产物,虽然他们的表现形式可能类似。

如果你的系统达到一定复杂程度,你就会发现BO和PO开始不一样了,BO更接近抽象层次,PO只是具体存储实现的载体,比如一个BO(抽象业务概念)可能有多种存储的设计方式,不同的方式可能导致PO设计不同,如果只是单表,那么BO和PO样子确实很类似,但是最好预留这层,否则后面系统的模型复杂时,到后面PO就和真正的抽象概念越来越远,一个相同的抽象概念,可能客户不同,需求不同造成Po设计不同,造成系统复用性减低。

当然,系统还不是特别复杂的情况下,可以考虑把PO层和BO层结合,放到一个层次,复杂的BO通过组合多个PO实现,但是概念上一定要清楚,他们有本质区别。

Monday611
2007-06-12 14:01

to leadyu :

谢谢你的答复,还有一些不太明白的地方,请指点。

1> 我们系统中的PO是利用MyEclipse针对数据库中的表自动生成的。

你所说的“比如一个BO(抽象业务概念)可能有多种存储的设计方式,不同的方式可能导致PO设计不同”具体是什么意思,PO难道不是和库表对应的吗?能举个更具体的例子吗?

2> “复杂的BO通过组合多个PO实现”,你能举个复杂BO的例子的源码吗?

非常感谢。

4Go 1 2 3 4 下一页