DDD/Presenter 模式 VS 用例优化查询

     2023-02-23     243

关键词:

【中文标题】DDD/Presenter 模式 VS 用例优化查询【英文标题】:DDD / Presenter pattern VS Use case optimal query 【发布时间】:2014-01-14 08:01:42 【问题描述】:

在这篇关于领域驱动设计的精彩 book 中,有一章专门介绍用户界面及其与领域对象的关系。

让我感到困惑的一点是用例优化查询和演示者之间的比较。

处理最佳查询的摘录(第 517 页)是:

而不是读取各种不同的多个整体聚合实例 类型,然后以编程方式将它们组合到单个容器中 (DTO 或 DPO),您可以改用所谓的最佳用例 查询。 这是您使用查找器查询设计存储库的地方 将自定义对象组合为一个或多个超集的方法 聚合实例。 查询动态地将结果放入 值对象 (6) 专为解决使用需求而设计 案例。 您设计一个值对象,而不是 DTO,因为查询是 特定于域,而不是特定于应用程序(与 DTO 一样)。习俗 然后视图直接使用用例最优值对象 渲染器。

因此,优化查询的好处是直接提供特定于视图的值对象,充当真实视图模型。

稍后一页,介绍者模式被描述:

表示模型充当适配器。它掩盖了细节 通过提供设计的属性和行为的领域模型 就视图的需求而言。 而不是要求 域模型专门支持必要的视图属性,它 表示模型的职责是导出 从域的状态查看特定的指标和属性 型号。

听起来这两种方式都实现了特定于用例的视图模型的构建。

目前我的调用链(使用 Play 框架)如下所示:

对于查询:控制器(作为Rest接口发送Json)->查询(通过优化查询返回特定值对象)

对于命令:控制器(充当发送Json的Rest接口)->应用服务(命令)->域服务/存储库/聚合(应用服务返回void)

我的问题是:如果我已经练习了用例优化查询,那么实现演示者模式有什么好处?如果一个演示者总是可以使用最佳查询来直接满足客户的需求,为什么还要打扰演示者呢?

我只是想到了演示者模式的一个好处:处理命令,而不是查询,从而提供命令一些与演示者确定的视图模型相对应的域对象。然后控制器将与域对象分离。 确实,Presenter 描述的另一个摘录是:

此外,用户执行的编辑由 演示模型。 这不是放置重载的情况 演示模型的责任,因为它是为了适应 在两个方向上,模型到视图和视图到模型。

但是,我更喜欢将纯原语发送到应用程序服务(命令),而不是直接处理域对象,所以这个好处不适用于我。 有什么解释吗?

【问题讨论】:

【参考方案1】:

只是猜测:)

preseneter 模式可以尽可能多地重用您的存储库的聚合查找器方法。例如,我们有两个视图,在这种情况下我们需要两个适配器(每个视图一个适配器),但我们只需要一个存储库查找方法:

class CommentBriefViewAdapter 
    private Comment comment;

    public String getTitle() 
         return partOf(comment.getTitle()); 
         //return first 10 characters of the title, hide the rest
     
    .....//other fields to display


class CommentDetailViewAdapter 
    private Comment comment;

    public String getTitle() 
         return comment.getTitle();//return full title
     
    .....//other fields to display


//In controller:
model.addAttribute(new CommentBriefViewAdapter(commentRepo.findBy(commentId)));
// same repo method
model.addAttribute(new CommentDetailViewAdapter(commentRepo.findBy(commentId)));

但最佳查询是面向视图的(每个视图一个查询)。我认为这两个解决方案是为 none-cqrs 风格的 ddd 架构设计的。在 cqrs 风格的架构中不再需要它们,因为查询不是基于存储库而是基于特定的瘦数据层。

【讨论】:

我同意,这将是原因之一 :)

用例结构优化心得

在大型项目的测试中通常都伴随着大量的测试用例。如何优化用例以提高编写的效率,如何组织用例以提高执行的效率经常困扰着我们;因此总结了一些在编写用例时的心得。1.用例框架的优化一份好的用例设计需要有一个好的... 查看详情

vs2017在release下编译错误c1001

在使用VS2017编译C程序时,Debug模式下编译链接执行都没有问题,但是一转到Release模式下就出现下列编译链接错误(IDE:VS2017/VC++/MFC程序,目标平台x86+Win32位):根据错误帮助的提示,是由于IDE的编译器使用的优化选项和表达式... 查看详情

VS: _BitScanReverse64 内在的意外优化行为

...布时间】:2017-05-1202:49:44【问题描述】:以下代码在调试模式下工作正常,因为定义了_BitScanReverse64如果未设置Bit,则返回0。CitingMSDN:(返回值为)“如果设置了Index,则为非零,如果未 查看详情

zmq vs redis 用于发布-订阅模式

】zmqvsredis用于发布-订阅模式【英文标题】:zmqvsredisforpub-subpattern【发布时间】:2013-09-0616:06:43【问题描述】:redis支持pub-subzmq也支持pub-subviaamessagebroker在它们之间进行选择的架构优缺点是什么?我的目标是超出应该完成的明显... 查看详情

vs在release模式下进行调试

在这种情况下,通过配置也是可以在release下调试的。步骤如下:1.工程项目上右键打开属性界面2.c++--- 常规----调试信息格式选 程序数据库(/Zi)或(/ZI),注意:如果是库的话,只能(Zi)3.c/c++----优化---- 优... 查看详情

vs在release模式下进行调试

在这种情况下,通过配置也是可以在release下调试的。步骤如下:1.工程项目上右键打开属性界面2.c++--- 常规----调试信息格式选 程序数据库(/Zi)或(/ZI),注意:如果是库的话,只能(Zi)3.c/c++----优化---- 优... 查看详情

vs2010中release模式下调试程序

debug模式调试信息全,但是速度很慢,在数据量比较大的时候非常影响调试效率,release模式速度快,但是没有调试信息。所以在编译的时候很多编译器会提供一种折中的编译方式,在release下提供调试信息,可以结合debug和release... 查看详情

android进阶——性能优化之电量优化全攻略及实战小结(代码片段)

文章大纲引言一、在低电耗模式和应用待机模式下进行测试1、在低电耗模式下测试您的应用2、在应用待机模式下测试您的应用3、列入白名单的可接受用例4、确定当前充电状态5、监控充电状态变化6、确定当前电池电量7、监控... 查看详情

android进阶——性能优化之电量优化全攻略及实战小结(代码片段)

文章大纲引言一、在低电耗模式和应用待机模式下进行测试1、在低电耗模式下测试您的应用2、在应用待机模式下测试您的应用3、列入白名单的可接受用例4、确定当前充电状态5、监控充电状态变化6、确定当前电池电量7、监控... 查看详情

单元测试用例:XCTestCase vs Sentestcase

】单元测试用例:XCTestCasevsSentestcase【英文标题】:Unittestcase:XCTestCasevsSentestcase【发布时间】:2014-07-2802:13:59【问题描述】:我正在为我的应用程序编写测试用例。只是想知道在XctestCase和SentestCase之间选择哪一个?我们将不胜感... 查看详情

用例是不是依赖于另一个用例反模式?

】用例是不是依赖于另一个用例反模式?【英文标题】:Isusecasedependingonanotherusecaseantipattern?用例是否依赖于另一个用例反模式?【发布时间】:2019-08-2323:15:26【问题描述】:我有两个用例LoadA和LoadSettings,在LoadA我需要访问从Load... 查看详情

解决vs调试时断点不会命中

...题百度经验:jingyan.baidu.com方法/步骤 11,检查VS的调试模式。VS的调试分为两种,Debug和Release。Debug是专门真对检查程序的bug而设置的一种模式。Release模式对程序的编译进行了优化,一般用 查看详情

设计模式用例图之二

导言标识用例用例主序列与可替换序列场景如何识别用例有意义的目标用户观点而非系统观点用例命名用例的粒度小技巧用例关系执行者与用例之间的关联关系用例包含关系例子另一种包含关系-结构化冗长的用例扩展关系简介... 查看详情

在vs2010中如何画uml用例图

...页进去选择软件与数据,选择UML,创建之后,就可以选择用例图形状来绘制了 参考技术B是什么啦 查看详情

如何使用 TFS 2015 / VS 2017 将通用测试与测试用例相关联?

】如何使用TFS2015/VS2017将通用测试与测试用例相关联?【英文标题】:HowtoassociategenerictestwithtestcaseusingTFS2015/VS2017?【发布时间】:2020-10-2801:50:18【问题描述】:我正在尝试使用VisualStudio将generictest与TFS测试用例相关联,以便我们... 查看详情

接口自动化测试实践(代码片段)

...接口:300个。覆盖模块:12个,其中二级模块47个。开发模式下,调用接口次数:6828次,脚本运行耗时1h18min3s。上线模式下,调用接口次数:1257次,脚本运行耗时15min46s。该系统已稳定运行,本次测试过程中,发现了4个隐藏bug。... 查看详情

Data Classes vs typing.NamedTuple 主要用例

】DataClassesvstyping.NamedTuple主要用例【英文标题】:DataClassesvstyping.NamedTupleprimaryusecases【发布时间】:2019-01-1107:01:13【问题描述】:长话短说PEP-557在Python标准库中引入了数据类,基本上可以起到collections.namedtuple和typing.NamedTuple的... 查看详情

Ionic 3中Virtual VS Infinite scroll有啥区别和用例

】Ionic3中VirtualVSInfinitescroll有啥区别和用例【英文标题】:WhataredifferencesandusecasesforVirtualVSInfinitescrollinIonic3Ionic3中VirtualVSInfinitescroll有什么区别和用例【发布时间】:2018-03-2519:35:33【问题描述】:我浏览了Ionic3文档,并试图了解... 查看详情