一个导师,我尊重表明,一个简单的bean是在浪费时间 - 该值对象“必须”包含一些业务逻辑是有用的。
另一位贸易商称这样的代码是难以维护,所有的业务逻辑必须被外部化。
我意识到这个问题,是主观的。 问反正 - 想知道更多从观点的答案。
一个导师,我尊重表明,一个简单的bean是在浪费时间 - 该值对象“必须”包含一些业务逻辑是有用的。
另一位贸易商称这样的代码是难以维护,所有的业务逻辑必须被外部化。
我意识到这个问题,是主观的。 问反正 - 想知道更多从观点的答案。
你应该更好地称他们为传输对象或数据传输对象(DTO) 。
早些时候,同一个J2EE模式被称为“值对象”,但他们改变了名字,因为它是与此相混淆
http://dddcommunity.org/discussion/messageboardarchive/ValueObjects.html
要回答你的问题,我只会把最小的逻辑,我的DTO的,所需显示的原因逻辑。
更妙的是,如果我们谈论的是一个基于数据库的Web应用程序,我会超越J2EE的核心模式和使用休眠或Java持久性API来创建一个支持关系的懒加载领域模型和视图使用。
看到在视图中打开的会话 。
通过这种方式,你不必一组的DTO的程序,并且拥有所有可用的业务逻辑在你的意见/控制器等使用
把数据和业务逻辑在一起的想法是促进封装,以尽可能少的内部状态可能暴露给其他对象。 这样一来,客户可以依托一个接口上,而不是实现。 请参阅“告诉,不要问”的原则和得墨忒耳定律 。 封装使得它更容易理解的状态的数据可以是,更容易阅读的代码,更容易分离的类和通常更容易进行单元测试。
外部化业务逻辑(通常为“服务”或“经理”类),使得问题,如“使用此数据在哪里?” 和“它可以在什么状态?” 很多更难以回答。 这也是思考的过程来说,在上述对象包裹起来。 这会导致贫血的域模型 。
外在的行为并不总是坏事。 例如,一个服务层可以协调域对象,但没有接管他们的国家操纵的责任。 或者,当你在做的大多是读取/写入到很好的映射到输入表单的数据块,也许你并不需要一个域模型 - 或者它需要痛苦的对象/关系映射开销 - 在所有。
传输对象常常用于通过提供最小状态信息的呼叫层需求,不得暴露任何业务逻辑去耦彼此(或者从外部系统)架构层。
为视图准备信息时,这可能是有用的,例如:只要给视图它所需要的信息,而不是其他,这样才能够集中精力如何显示的信息上,而不是什么信息显示。 例如,TO可能是数据的多个来源聚合。
一个优点是,你的意见,你的域对象是分离的。 在JSP中使用你的域对象可以让您的站点更难重构和促进乱用getter和setter方法(因此破坏了封装)的。
然而,也有具有大量传输对象,并经常有很多重复的,太相关的开销。 有些项目我一直在结束了TO的,基本上反映其他域对象(我认为反模式)。
这取决于。
哎呀,我刚脱口而出一个老生常谈?
基本的问题,要求设计一个目标是:将使用/被其他物体时消耗的管理对象的数据的逻辑是不同或相同 ?
如果使用需要不同的逻辑的不同区域,外化了。 如果是相同的,无论该对象前往,与类混放。
我个人的偏好是把所有的业务逻辑域模型本身,那就是在“真”的域对象。 因此,在创建数据传输对象时,他们大多只是一个(不可变的)状态域对象的代表性,因此不包含业务逻辑。 它们可以包含用于克隆,虽然比较方法,但对业务逻辑代码的肉停留在域中的对象。
什么Korros说。
值对象:= A简单的小物件,如金钱或日期范围,它的平等不是基于身份。
DTO:=携带,以减少方法调用的次数的进程之间的数据的对象。
这些是由Martin Fowler提出的defintions,我想普及他们。
我同意帕纳约蒂斯:鉴于模式的开放式会话比使用DTO的要好得多。 把否则,我发现应用程序是非常简单得多,如果你在你的域对象的流量(或其某些复合)从您的视图层一路下跌。
这就是说,它很难拉断,因为你需要使你的HttpSession重合工作持久层的单元。 然后,你将需要确保所有数据库的修改(即创建,更新和删除)是故意的。 换句话说,你不希望它是视图层的域对象,一个字段被修改,并且修改地没有在应用程序代码有意保存更改持续的情况下。 这是对付重要的另一个问题是,以确保您的事务语义是令人满意的。 通常的读取和修改一个域对象会发生在一个事务上下文,它不是很难让你的ORM层需要一个新的事务。 什么是具有挑战性的是嵌套事务,要包括的第一个打开内的第二事务上下文。
如果你不介意调查非Java API如何处理这些问题,这是值得看的Rails的活动记录,这使得红宝石服务器页面直接与领域模型工作,并遍历它的关联。