Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.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
Design patterns 事务脚本是反模式的?_Design Patterns_Data Access Layer_Data Access - Fatal编程技术网

Design patterns 事务脚本是反模式的?

Design patterns 事务脚本是反模式的?,design-patterns,data-access-layer,data-access,Design Patterns,Data Access Layer,Data Access,关于NoSQL数据库的事务脚本也有一个类似的主题,但这一个是关于一般模式的。从我对事务脚本的了解来看,它根本不是面向对象的。它基本上是过程代码,尽管它可以在代码的每一行中使用对象 更好的解决方案是使用域模型,再加上活动记录或带有工作单元/标识映射/延迟加载/查询对象等的数据映射器。事务脚本可能很容易使用,但它实际上是过程编程,因此在面向对象的世界中应该被视为反模式 你觉得怎么样?您同意事务脚本是反模式的吗?或者你真的有办法设计一个面向对象的事务脚本,而不是伪装成过程?但我怀疑这是可能的 事务脚本

关于NoSQL数据库的事务脚本也有一个类似的主题,但这一个是关于一般模式的。从我对事务脚本的了解来看,它根本不是面向对象的。它基本上是过程代码,尽管它可以在代码的每一行中使用对象

更好的解决方案是使用域模型,再加上活动记录或带有工作单元/标识映射/延迟加载/查询对象等的数据映射器。事务脚本可能很容易使用,但它实际上是过程编程,因此在面向对象的世界中应该被视为反模式


你觉得怎么样?您同意事务脚本是反模式的吗?或者你真的有办法设计一个面向对象的事务脚本,而不是伪装成过程?但我怀疑这是可能的

事务脚本肯定不是反模式

从我对事务脚本的了解来看,它根本不是面向对象的

你是对的,事实并非如此。然而,这一事实并不意味着它是一种反模式。尽管它是一种过程性的方法,实际上,它在一系列业务逻辑体系结构模式中仍然有其正确的位置——您只需要知道在哪种情况下使用它是最佳实践,而在哪种情况下它不是。简单地说:如果您的问题域非常简单,那么在您的业务逻辑中使用更复杂的模式是不值得的

或-如所述:

何时使用它

事务脚本的优点在于它的简单性。这种方式组织逻辑对于只有少量逻辑的应用程序来说是很自然的,并且它在性能或理解方面的开销非常小


您可能会想到的反模式称为。当你打算并且认为你正在构建一个领域模型时,就是这种情况——因为你的问题领域已经足够复杂了——但实际上你最终陷入了一个事务脚本——因为糟糕的代码组织/糟糕的OO技能。

这不是一种反模式。事实上,大多数企业应用程序(我所见过的)都使用事务脚本,而不是富域模型模式

您提到的活动记录模式只有在域实体到持久存储聚合(RDBMS表)的一对一映射相当简单时才有用

数据映射器类似于ORM(Hibernate和friends)。如果您的业务逻辑驻留在域实体中,那么这些实体必须自身发生变化。在我看来,这将改变状态(在使用ORM时是固有的)的逻辑与状态本身结合起来。从外部查看域模型并将业务逻辑放入服务(事务脚本)中更简单。此外,如果您的业务逻辑量很大,那么当相关代码分散在域实体中时,很难找到相关代码(就像将事务脚本混合在一起)


但您不必使用完全过程化的方法,因为您可以(也应该)将您的服务分解为自包含的高度内聚的“过程容器”。

TS不是OO或非OO。您可以在域模型方法、服务方法或高级应用程序方法中使用它。这只意味着你可以阅读该计划的商业意图,而不必经历一百万次回调和“黑魔法”

这就是微软推出async/await的原因。它将外观模糊的send-a-callback(委托)和exit(以单独的方法(必需的)样式处理回调)转换为可读的事务脚本

GOTO是坏的,因为它们破坏了事务脚本的可读流,使其成为坏的

a) 出错的事务脚本是反模式。例如,一个巨大的方法,没有或很少的方法调用,等等。同一个方法中不同级别的操作(将它们重构为方法)。业务流程的离散步骤集中在一个方法中(将它们分成方法或单独的类。许多业务对象?使用DDD服务模式)

b) 不正确使用TS是一种反模式。例如,大量的应用程序间消息传递、事件触发等,使您无法通读和查看业务流程(技术应用程序的功能要求)。低级细节(技术)与功能性工作相结合。业务活动的过度分离,应该在一个页面上可见

TS的使用应该是分形的,每次放大都会深入到TS风格逻辑的更多细节。高级:您可以看到方法调用和DDD服务的使用。中级可以是一种混合。下面主要是域对象方法/属性调用,以及最精细的逻辑细节

因为TS可能被滥用或阻止其使用而将其扔到总线下,这只会让事情变得一团糟——不能分组和分离,不知道SRP(单一责任)/内聚性的开发人员也会搞砸其他样式。答案是就业务流程对他们进行培训,并给出分组和分离的示例——这应该由业务/功能需求(垂直部分)而不是技术(水平部分)来完成

  • 将只处理一个域对象或其类型的其他实例的逻辑放在DO中。不要引用域对象(person.orders)中的其他对象类型,也不要将任何内容注入域对象(其他DO或存储库等)。就这么简单,它违反了SRP。[方法中的低级事务脚本]
  • 当您需要person.orders之类的东西,或者感觉需要注入一些东西时,请创建DDD服务(未序列化,每次使用后没有持久属性)。例如,注入一个人和其他人集合(存储库或IQueryable等)。在那里工作。[此处为中级事务脚本]
  • 将对域对象和DDD SVC的操作合并到DDD服务的“应用程序方法”类别中
  • 从程序的最高级别构造并调用这些
  • 选管会