Domain driven design 这对一个班级来说是不是太多的责任?

Domain driven design 这对一个班级来说是不是太多的责任?,domain-driven-design,cqrs,Domain Driven Design,Cqrs,我得到一个命令:MovePlayerCommand 此命令的验证程序之一执行3项操作: 计算玩家移动的成本(可用于验证,也可用于显示) 验证此成本 收听“PlayerMoved”活动,以便我们可以应用成本(例如-10个行动点) 这对一个班级来说是不是太多的责任?如果是这样的话,你会如何区分这一点 编辑:我知道删除成本和检查成本是两件事,但我不能将它们与成本计算分开,我不希望每个操作有3个类如果没有更多信息,就不可能明确回答 也就是说,你所描述的听起来不像一个验证器;它听起来像是某种“计算器”

我得到一个命令:MovePlayerCommand

此命令的验证程序之一执行3项操作:

  • 计算玩家移动的成本(可用于验证,也可用于显示)

  • 验证此成本

  • 收听“PlayerMoved”活动,以便我们可以应用成本(例如-10个行动点)

这对一个班级来说是不是太多的责任?如果是这样的话,你会如何区分这一点


编辑:我知道删除成本和检查成本是两件事,但我不能将它们与成本计算分开,我不希望每个操作有3个类

如果没有更多信息,就不可能明确回答

也就是说,你所描述的听起来不像一个验证器;它听起来像是某种“计算器”

计算方法很可能属于一个类(calculator类),然后validator类将引用计算器

我倾向于在一个非常精简的处理程序类中处理域事件,然后将其提交给聚合根或服务(这是一种常见但不通用的做法)。因此,根目录或服务也可能有对计算器(可能还有验证器)的引用


这个问题可能过于宽泛,在DDD论坛上回答可能更好。即使这样,你也可能需要提供更多的背景资料。

这里有一个很大的误解,因为有些人在发表评论时似乎把DDD和CQR混为一谈。OP讨论的是命令,并用CQR标记了这个问题,因此我将假设OP确实使用DDD和CQR

域验证逻辑应该在命令处理程序中,您可以这样做,实际上应该在命令命中处理程序存根之前进行数据检查,但不进行任何域逻辑验证。也就是说,除了在命令处理程序中之外,没有其他地方可以根据域逻辑验证命令,因为这是加载聚合的地方


您显示的验证是域验证,因此它们实际上应该由您的聚合执行,所以是的,我认为您应该稍微打破这一责任,并将不同类型的验证分为数据和域。

这个问题更适合吗?我想游戏开发更多的是关于实时或游戏设计,不是DDD或SRP你说的验证器是什么意思?命令验证程序应该负责验证命令的内容是否正确。例如,确保命令的所有强制属性都有值。验证器不应该执行域逻辑…验证器当然执行域逻辑!验证器在这里表示“可以执行此操作吗?”