DCI,角色应该向数据对象添加属性吗?
Posted
技术标签:
【中文标题】DCI,角色应该向数据对象添加属性吗?【英文标题】:DCI, should a role add properties to data objects? 【发布时间】:2012-07-12 20:34:24 【问题描述】:在关注The Right Way to Code DCI in Ruby 之后,我一直在玩 DCI。我发现我一直希望我的角色为我的数据对象添加属性。
例如,如果我有一个用户对象。
class User
def initialize(name)
@name = name
end
end
user = User.new('JonMR')
用户可以扮演客户的角色。
module Customer
def add_to_cart(item)
self.cart << item
end
end
customer = user.extend Customer
customer.add_to_cart 'an item'
为了完成这项工作,我需要添加一个购物车方法。购物车真的属于用户对象吗?感觉角色应该根据需要将购物车添加到数据对象中。
【问题讨论】:
【参考方案1】:一般来说,DCI 数据对象应该只包含数据加上非常基本的域逻辑,比如基本的验证逻辑。 DCI 角色应该是纯粹的行为。将购物车添加到角色中的用户感觉就像违反了那一秒。也许您缺少数据对象类型或角色?记住角色可以使用上下文中的其他角色,所以也许你的角色应该只期望扮演购物车角色的对象成为当前上下文的一部分。
【讨论】:
我没有想到上下文采取购物车。我会试一试,看看结果如何。 @JonMR 你有没有更进一步?我也在类似的地方,很好奇你最后做了什么。 @JSroop 不幸的是,我并没有走得更远。对于我最终的 DCI 用例,我只是放弃了角色的概念。在这种情况下, add_to_cart 刚刚移入它自己的类。希望这是有道理的。 :) @JonMR 确实如此;我想。当您在两个对象之间进行复杂或高度自定义的交互时,DCI 似乎真的很出色。当它只是一个需要做某事的类时,它开始觉得建模开销和关注点或普通的旧实例方法似乎要容易得多。一切都有它的位置。感谢您回来。以上是关于DCI,角色应该向数据对象添加属性吗?的主要内容,如果未能解决你的问题,请参考以下文章