值对象应该是多少业务逻辑包含哪些内容?(How much business logic should

2019-07-29 22:42发布

一个导师,我尊重表明,一个简单的bean是在浪费时间 - 该值对象“必须”包含一些业务逻辑是有用的。

另一位贸易商称这样的代码是难以维护,所有的业务逻辑必须被外部化。

我意识到这个问题,是主观的。 问反正 - 想知道更多从观点的答案。

Answer 1:

你应该更好地称他们为传输对象或数据传输对象(DTO) 。

早些时候,同一个J2EE模式被称为“值对象”,但他们改变了名字,因为它是与此相混淆

http://dddcommunity.org/discussion/messageboardarchive/ValueObjects.html

要回答你的问题,我只会把最小的逻辑,我的DTO的,所需显示的原因逻辑。

更妙的是,如果我们谈论的是一个基于数据库的Web应用程序,我会超越J2EE的核心模式和使用休眠或Java持久性API来创建一个支持关系的懒加载领域模型和视图使用。

看到在视图中打开的会话 。

通过这种方式,你不必一组的DTO的程序,并且拥有所有可用的业务逻辑在你的意见/控制器等使用



Answer 2:

把数据和业务逻辑在一起的想法是促进封装,以尽可能少的内部状态可能暴露给其他对象。 这样一来,客户可以依托一个接口上,而不是实现。 请参阅“告诉,不要问”的原则和得墨忒耳定律 。 封装使得它更容易理解的状态的数据可以是,更容易阅读的代码,更容易分离的类和通常更容易进行单元测试。

外部化业务逻辑(通常为“服务”或“经理”类),使得问题,如“使用此数据在哪里?” 和“它可以在什么状态?” 很多更难以回答。 这也是思考的过程来说,在上述对象包裹起来。 这会导致贫血的域模型 。

外在的行为并不总是坏事。 例如,一个服务层可以协调域对象,但没有接管他们的国家操纵的责任。 或者,当你在做的大多是读取/写入到很好的映射到输入表单的数据块,也许你并不需要一个域模型 - 或者它需要痛苦的对象/关系映射开销 - 在所有。

传输对象常常用于通过提供最小状态信息的呼叫层需求,不得暴露任何业务逻辑去耦彼此(或者从外部系统)架构层。

为视图准备信息时,这可能是有用的,例如:只要给视图它所需要的信息,而不是其他,这样才能够集中精力如何显示的信息上,而不是什么信息显示。 例如,TO可能是数据的多个来源聚合。

一个优点是,你的意见,你的域对象是分离的。 在JSP中使用你的域对象可以让您的站点更难重构和促进乱用getter和setter方法(因此破坏了封装)的。

然而,也有具有大量传输对象,并经常有很多重复的,太相关的开销。 有些项目我一直在结束了TO的,基本上反映其他域对象(我认为反模式)。



Answer 3:

这取决于。

哎呀,我刚脱口而出一个老生常谈?

基本的问题,要求设计一个目标是:将使用/被其他物体时消耗的管理对象的数据的逻辑是不同相同

如果使用需要不同的逻辑的不同区域,外化了。 如果是相同的,无论该对象前往,与类混放。



Answer 4:

我个人的偏好是把所有的业务逻辑域模型本身,那就是在“真”的域对象。 因此,在创建数据传输对象时,他们大多只是一个(不可变的)状态域对象的代表性,因此不包含业务逻辑。 它们可以包含用于克隆,虽然比较方法,但对业务逻辑代码的肉停留在域中的对象。



Answer 5:

什么Korros说。

值对象:= A简单的小物件,如金钱或日期范围,它的平等不是基于身份。

DTO:=携带,以减少方法调用的次数的进程之间的数据的对象。

这些是由Martin Fowler提出的defintions,我想普及他们。



Answer 6:

我同意帕纳约蒂斯:鉴于模式的开放式会话比使用DTO的要好得多。 把否则,我发现应用程序是非常简单得多,如果你在你的域对象的流量(或其某些复合)从您的视图层一路下跌。

这就是说,它很难拉断,因为你需要使你的HttpSession重合工作持久层的单元。 然后,你将需要确保所有数据库的修改(即创建,更新和删除)是故意的。 换句话说,你不希望它是视图层的域对象,一个字段被修改,并且修改地没有在应用程序代码有意保存更改持续的情况下。 这是对付重要的另一个问题是,以确保您的事务语义是令人满意的。 通常的读取和修改一个域对象会发生在一个事务上下文,它不是很难让你的ORM层需要一个新的事务。 什么具有挑战性的是嵌套事务,要包括的第一个打开内的第二事务上下文。

如果你不介意调查非Java API如何处理这些问题,这是值得看的Rails的活动记录,这使得红宝石服务器页面直接与领域模型工作,并遍历它的关联。



文章来源: How much business logic should Value objects contain?