Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何处理域类中的依赖行为?_Algorithm_Oop_Design Patterns_Domain Driven Design - Fatal编程技术网

Algorithm 如何处理域类中的依赖行为?

Algorithm 如何处理域类中的依赖行为?,algorithm,oop,design-patterns,domain-driven-design,Algorithm,Oop,Design Patterns,Domain Driven Design,假设我有一个域类,它有函数,这些函数将按顺序调用。每个函数都执行其任务,但如果序列中的前一步尚未完成,则会抛出一个错误。另一种方法是,每个函数完成运行所需的步骤,然后执行自己的逻辑。我觉得这种方式不是一种好的实践,因为我添加了多个职责,调用方不知道调用方法时会发生什么操作 我的问题是,如何处理DDD中的依赖场景。调用方是否有责任按照正确的顺序调用方法?还是我们让这些方法先处理依赖操作,然后再处理它自己的逻辑 调用方是否有责任按照正确的顺序调用方法 如果这些方法有商业意义,那也没关系。例如,客户可

假设我有一个域类,它有函数,这些函数将按顺序调用。每个函数都执行其任务,但如果序列中的前一步尚未完成,则会抛出一个错误。另一种方法是,每个函数完成运行所需的步骤,然后执行自己的逻辑。我觉得这种方式不是一种好的实践,因为我添加了多个职责,调用方不知道调用方法时会发生什么操作

我的问题是,如何处理DDD中的依赖场景。调用方是否有责任按照正确的顺序调用方法?还是我们让这些方法先处理依赖操作,然后再处理它自己的逻辑

调用方是否有责任按照正确的顺序调用方法

如果这些方法有商业意义,那也没关系。例如,客户可以预订航班,然后预订酒店房间。这两个都是客户机理解的,按照这个顺序调用它们是客户机的逻辑。另一方面,将保留插入数据库,然后提交(或其他)是技术性的。客户根本不需要处理这个问题。或者“初始化”一个对象,然后调用其他方法,然后调用“关闭”

需要一系列技术调用是一种时间耦合形式,这被认为是一种不好的做法,与DDD没有直接关系

解决办法是更好地模拟问题。调用方可能希望通过此调用序列实现更高级别的用例。因此,与其发布所需的单个“步骤”,不如作为一个整体支持更高的用例

一般来说,您的设计目标应该始终是获得任何有效调用序列,使其真正有意义(在语言允许的范围内)

更新:上述“文件”域的可能模型:

公共接口本地文件{ 远程文件上传(); } 公共接口远程文件{ 远程文件转换(…); 本地文件下载(); } 调用方是否有责任按照正确的顺序调用方法

如果这些方法有商业意义,那也没关系。例如,客户可以预订航班,然后预订酒店房间。这两个都是客户机理解的,按照这个顺序调用它们是客户机的逻辑。另一方面,将保留插入数据库,然后提交(或其他)是技术性的。客户根本不需要处理这个问题。或者“初始化”一个对象,然后调用其他方法,然后调用“关闭”

需要一系列技术调用是一种时间耦合形式,这被认为是一种不好的做法,与DDD没有直接关系

解决办法是更好地模拟问题。调用方可能希望通过此调用序列实现更高级别的用例。因此,与其发布所需的单个“步骤”,不如作为一个整体支持更高的用例

一般来说,您的设计目标应该始终是获得任何有效调用序列,使其真正有意义(在语言允许的范围内)

更新:上述“文件”域的可能模型:

公共接口本地文件{ 远程文件上传(); } 公共接口远程文件{ 远程文件转换(…); 本地文件下载(); }
在我看来,您所描述的是域模型操作的编排。这是应用层的工作,一层接一层的域模型。您应该有一个按正确顺序调用域模型方法的应用程序服务,它还应该考虑某个步骤是否未完成任何任务,在这种情况下,告诉下一个步骤执行它

在我看来,您所描述的是域模型操作的编排。这是应用层的工作,一层接一层的域模型。您应该有一个按正确顺序调用域模型方法的应用程序服务,它还应该考虑某个步骤是否未完成任何任务,在这种情况下,告诉下一个步骤执行它

TLDR;滚动到底部寻找答案,但是背景故事会提供一些好的上下文

如果域中的调用方必须知道调用事物的顺序,那么您就错过了在域中封装业务逻辑的机会,这是一个错误的症状

@RobertBräutigam提出了一个非常好的观点:

需要一系列技术调用是一种时间耦合形式,这被认为是一种不好的做法,与DDD没有直接关系

这是真的,但是当你使用你的域模型时情况更糟,因为非域关注点和域关注点混合在一起。意图在非业务逻辑的海洋中迷失。如果可以的话,可以寻找封装排序的更高阶。借用Robert的例子,与其先预订航班再预订酒店房间,然后强迫客户这样做,不如让客户享受一次假期合计,将两者都考虑在内并加以验证

我知道你的情况听起来不对,我怀疑你是对的。有一个明显的依赖性,不可能一下子发生,所以我们不能成为故事的结尾。当您与必须在“最终”状态之前发生的中间事务有明确的依赖关系时,我们有。。。编排(想想传奇、分布式事务、域事件等等)

您对文件操作的描述跨越了事务。域的操作(状态更改)在分布式事务中的每个点都是事务性的,但总体上不是事务性的。所以当@choquero70说

您正在描述的是域模型操作的编排。这是应用层的工作,一层接一层的域