Domain driven design 这对一个班级来说是不是太多的责任?
我得到一个命令:MovePlayerCommand 此命令的验证程序之一执行3项操作:Domain driven design 这对一个班级来说是不是太多的责任?,domain-driven-design,cqrs,Domain Driven Design,Cqrs,我得到一个命令:MovePlayerCommand 此命令的验证程序之一执行3项操作: 计算玩家移动的成本(可用于验证,也可用于显示) 验证此成本 收听“PlayerMoved”活动,以便我们可以应用成本(例如-10个行动点) 这对一个班级来说是不是太多的责任?如果是这样的话,你会如何区分这一点 编辑:我知道删除成本和检查成本是两件事,但我不能将它们与成本计算分开,我不希望每个操作有3个类如果没有更多信息,就不可能明确回答 也就是说,你所描述的听起来不像一个验证器;它听起来像是某种“计算器”
- 计算玩家移动的成本(可用于验证,也可用于显示)
- 验证此成本
- 收听“PlayerMoved”活动,以便我们可以应用成本(例如-10个行动点)
编辑:我知道删除成本和检查成本是两件事,但我不能将它们与成本计算分开,我不希望每个操作有3个类如果没有更多信息,就不可能明确回答 也就是说,你所描述的听起来不像一个验证器;它听起来像是某种“计算器” 计算方法很可能属于一个类(calculator类),然后validator类将引用计算器 我倾向于在一个非常精简的处理程序类中处理域事件,然后将其提交给聚合根或服务(这是一种常见但不通用的做法)。因此,根目录或服务也可能有对计算器(可能还有验证器)的引用
这个问题可能过于宽泛,在DDD论坛上回答可能更好。即使这样,你也可能需要提供更多的背景资料。这里有一个很大的误解,因为有些人在发表评论时似乎把DDD和CQR混为一谈。OP讨论的是命令,并用CQR标记了这个问题,因此我将假设OP确实使用DDD和CQR 域验证逻辑应该在命令处理程序中,您可以这样做,实际上应该在命令命中处理程序存根之前进行数据检查,但不进行任何域逻辑验证。也就是说,除了在命令处理程序中之外,没有其他地方可以根据域逻辑验证命令,因为这是加载聚合的地方
您显示的验证是域验证,因此它们实际上应该由您的聚合执行,所以是的,我认为您应该稍微打破这一责任,并将不同类型的验证分为数据和域。这个问题更适合吗?我想游戏开发更多的是关于实时或游戏设计,不是DDD或SRP你说的验证器是什么意思?命令验证程序应该负责验证命令的内容是否正确。例如,确保命令的所有强制属性都有值。验证器不应该执行域逻辑…验证器当然执行域逻辑!验证器在这里表示“可以执行此操作吗?”