JiveJdon Community Forums
在线263人 Home | 论坛 | 培训咨询 | 精华 | 查搜 | 注册 | 登陆 |
首页 » 论坛 » 设计模式、框架和架构
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表
???en_US.forumThreadNext.name??? 下一主题
这个主题共有 9 回复 / 1 页 [ ]  发表新帖子  回复该主题贴
miaoxikui

发表文章: 12
注册时间: 2007年03月09日 18:47
给他发消息
UML sequence图中类的责任设计的疑问 发表: 2007年08月17日 09:39 回复
在当前可以说UML已经很使用了,但是最近在做投票系统模型设计的时候,有点疑问。按照DDD设计模型是:Vote(voteId , voteTitle,totalNum)和
VoteItem(voteItemId,voteItemName,voteNum,voteId)
使用Struts+Hibernate做:疑问:
就是在设计VoteItem类(vo类)的时候,我觉得该类应该有投票数量增加的责任,所以应该把该方法作为该类的成员(我觉得)。
public void increaseVotenum()
{
int num = getVotenum().intValue() + 1;
setVotenum( Integer.valueOf( num ) );
}
问题出来了,模型类中出现了业务逻辑,而我的service包中的ServiceFactory类来得到service的单一实例。serviceImpl包中是服务的实现类。然后在服务实现类中写具体的业务逻辑,这应该才是正常的。所以increaseVotenum()方法应该写在服务实现类中。

另外我还有一个附带的疑问是:
在我的服务实现类中仍然使用了DAO设计模式,为了达到真正的解耦还定义了DAO接口和DAO的实现类(在这里我且不详细说DAO实现类的功能)DAO实现类的总体功能就是对数据库进行CRUD的基本操作和一些其他的我认为与数据库相关的功能(分页的方法),我有觉得这些方法也应该算在业务逻辑中吧!就是说我想把DAO中的内容转移到service(业务逻辑中来实现)中引入DAO是多余的吗 ?
我想问的是在JAVA WEB软件架构中DAO 与service同时存在是合理的吗》?
banq

发表文章: 9114
注册时间: 2002年08月03日 17:08
给他发消息
回复:UML sequence图中类的责任设计的疑问 发表: 2007年08月20日 10:32 回复
>然后在服务实现类中写具体的业务逻辑
依据Evans DDD,是不应该在服务中写业务逻辑,而应该在领域层,领域层不一定是模型类,就你这个案例:首先increaseVotenum方法应该在VoteItem还是在相应的服务类中的问题,我觉得放在VoteItem中好,这样模型也比较丰富,如果increaseVotenum方法很重要,也可以将increaseVotenum方法放入一个VoteItem代理类中。


>想把DAO中的内容转移到service(业务逻辑中来实现)
Evans DDD中将DAO归为对象的工厂或者仓库,也就是说:数据库只是对象的仓库,其他就什么都不是。

因此:DAO不应该有业务逻辑,只是复杂对象的持久化,就象我们经常使用save功能一样ctrl-s。如果你将业务逻辑使用复杂SQL实现,就使DAO包含逻辑,你所要做的就是简化SQL,使业务从SQL中分离出来,一般人没有这样功力,因此,必须老老实实从对象分析设计重新开始。

建议你们学习或培训一下Evans DDD,可以解决你很多这样的疑惑。
miaoxikui

发表文章: 12
注册时间: 2007年03月09日 18:47
给他发消息
re:UML sequence图中类的责任设计的疑问 发表: 2007年08月22日 08:52 回复
引用 “领域驱动设计强调有一个专门的领域层,领域层不只是模型,还包括与模型相关的用来完成业务逻辑的其他元素,如服务等”。


领域层=模型驱动设计中单纯的模型+维护这些模型的完整性操作+模型之间的关联维护+提供模型访问的方法
---》依据Evans DDD,是不应该在服务中写业务逻辑,而应该在领域层,领域层不一定是模型类
我的理解:“不应该在服务中写业务逻辑,而是应该在领域层”是因为领域层“还包括与模型相关的用来完成业务逻辑的其他元素,如服务等”那么在DDD中是不是就不会存在业务逻辑层了呢?就我了解的软件开发模型为 表示层(UI) 业务逻辑层 持久层
数据层(模型)在DDD中业务逻辑层将不会存在!相应地DDD代替了业务逻辑层 持久层和数据层(模型)。我理解的对吗?
banq

发表文章: 9114
注册时间: 2002年08月03日 17:08
给他发消息
回复:re:UML sequence图中类的责任设计的疑问 发表: 2007年08月22日 09:14 回复
一般分层是表现层 业务逻辑层 和持久层。不会存在数据层,之所以有数据层概念是因为围绕数据库设计编程观点导致。

领域层实际就是业务逻辑层的细化,业务逻辑层细化为应用层和领域层两个。

服务也是分层的,分为应用层服务和领域层服务。

总之,业务逻辑尽量使用模型和相关类来表达。
miaoxikui

发表文章: 12
注册时间: 2007年03月09日 18:47
给他发消息
re:UML sequence图中类的责任设计的疑问 发表: 2007年08月22日 10:38 回复
谢谢banq大师的指导
最近想学习DDD ,我应该学习DDD的思想了。banq能否推荐几本经典的书籍呀
miaoxikui

发表文章: 12
注册时间: 2007年03月09日 18:47
给他发消息
re:UML sequence图中类的责任设计的疑问 发表: 2007年08月22日 10:38 回复
谢谢banq大师的指导
最近想学习DDD ,我应该学习DDD的思想了。banq能否推荐几本经典的书籍呀
xmuzyu

发表文章: 80
注册时间: 2007年03月26日 12:16
给他发消息
re:UML sequence图中类的责任设计的疑问 发表: 2008年06月28日 16:50 回复
我觉得领域层的服务可以用来实现业务逻辑,应用层的服务通过协调领域层的实体,服务来完成业务操作。不知道对不对?还请各位赐教。
xmuzyu

发表文章: 80
注册时间: 2007年03月26日 12:16
给他发消息
re:UML sequence图中类的责任设计的疑问 发表: 2008年06月28日 16:50 回复
我觉得领域层的服务可以用来实现业务逻辑,应用层的服务通过协调领域层的实体,服务来完成业务操作。不知道对不对?还请各位赐教。
bmrxntfj

发表文章: 15
注册时间: 2008年01月04日 08:55
给他发消息
re:UML sequence图中类的责任设计的疑问 发表: 2008年06月28日 23:49 回复
服务层不能剥夺实体和值对象本身的行为。
就lz的例子,投票数量增加的责任应该有VoteItem来承担。
killer

发表文章: 106
注册时间: 2007年07月17日 15:40
给他发消息
re:UML sequence图中类的责任设计的疑问 发表: 2008年06月30日 20:14 回复
坚持结构决定功能,静态决定动态的原则,VoteItem的结构(voteItemId,voteItemName,voteNum,voteId)已经决定了public void increaseVotenum()
{
int num = getVotenum().intValue() + 1;
setVotenum( Integer.valueOf( num ) );
}

VoteItem的功能,非常容易判断,也非常地自然!不用记那么多概念和条条框框的
这个主题有 9 回复 / 1 页 [ ]
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表    返回页首  返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Spring Struts
查询本论坛内 回复超过的热门帖子
快速发表回复
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com

anti spam