我正在尝试学习领域驱动的设计,我大约80%的时间阅读了Eric关于这个主题的书(以及关于Pluralsight课程的书)。我一直试图在重新设计一个旧的LabVIEW/TestStand项目时应用我所学到的东西,但我担心是否可以让我认为在其中执行I/O逻辑的实体,如CAN/Modbus通信。我现在所采取的方法与我以前所做的差不多,而且到目前为止对我来说效果很好,所以我对此相当有信心。但是,我想看看从DDD的角度来看开发过程是否还有改进的余地。
除此之外,我希望得到对我所采取的一般方法的验证。由于这个原因,这篇文章将是有点冗长-抱歉提前。
这个项目的核心是对某一品牌的机电一体化(车辆传动系统的一部分)进行自动化测试。我与我的一位同事合作启动了这个项目,他在面向对象软件开发方面的经验较少,但在汽车硬件测试方面有大量的专业知识。在这个意义上,他扮演了领域专家的角色。使用白板,我对测试设备进行了建模,并写下了他使用的一些术语的定义(这些术语已成为无处不在的语言的一部分):

当我开始开发该项目时,我将其形式化为UML类图。下图是最新的修订版,与第一个版本略有不同,原因是对域的理解在不断发展:

在我现在所处的阶段,我已经创建了大部分的整体应用程序体系结构,并实现了大部分逻辑。我已经完成了大部分代码,为我的硬件专家同事留下占位符来填充实际的硬件逻辑。我们使用git来回交换,我的工作站非常适合编写大部分代码,而我的工作站则非常适合在实际硬件设备(电源、电机驱动器等)上测试代码。到目前一切尚好。

通常,我设计这些应用程序的方法是创建一个LabVIEW“实用程序”库,该库对测试设备及其上的所有资源进行建模,并创建使用该库的TestStand序列文件,执行“打开电源”、“将电机设置为1000 RPM”、“测量压力和检查极限”等一系列步骤。
从DDD的角度来看,LabVIEW库似乎构成域层,而TestStand序列文件则构成应用层,使用和组织表示域的库中的类来执行对我们的业务有价值的实际测试序列。此外,VB测试平台似乎是由诸如电源、流量计阵列等实体组成的聚合根。
问题的
这里我有点不确定: Eric解释说,实体类当然应该包含适合它们所代表的任何行为(否则会导致贫血的域模型)。尽管如此,他书中的所有实体类(比如Customer或Account)都有相对“简单”的行为--例如,Customer类不需要执行I/O。
尽管我用串行通信实现ZPL Power Supply,用数据采集逻辑实现DAQ Flow Meter Array,但我仍然认为电源和流量计数组是实体(当它们是域的清楚部分和无处不在的语言时),这是否合适?
另外:我是否适当地应用了DDD原则,或者是否有改进的余地?DDD是否适合这样的项目?
发布于 2018-04-30 11:39:10
我认为DDD的设计并没有考虑到这种类型的项目。
在我看来,DDD主要是将业务语言与代码的底层现实联系起来。
例如,一位销售人员说:“我在Q1中销售了100个小部件”一个开发人员说:“数据库中有100个订单,状态已完成并键入"widget_v3”,并在2001-01-01和2001-04-01之间与employeeId 12链接。“
这导致了混乱,DDD想让开发人员用业务语言进行思考和设计。
在您的例子中,在我看来,业务语言已经与潜在的技术现实相匹配了。您正在测试的东西都有技术定义,每个人都使用这些术语来讨论它们。在这种情况下,DDD只是OOP,将详细的代码放入方法中是很好的(尽管将其作为服务注入比较好)。
发布于 2018-04-30 17:16:35
尽管我用串行通信实现ZPL电源,用数据采集逻辑实现DAQ流量仪表阵列,但我仍然认为电源和流量计阵列是实体(当它们是域的清楚部分和无处不在的语言时),这是否合适?
可能不会。
在建模中需要理解的一个重要概念是“记录书”。是资本-T真理在模型中,或其他地方(现实世界)。
我比较喜欢的例子是购物车。当Amazon的模型从我的购物车中删除一件物品时,它就消失了。但是如果我从我手机上的购物助理那里删除了麦片盒,这个盒子就不会神奇地跳回到货架上。
电源和流量计阵列的声音对我来说,就像你的模型之外的东西,是你的模型接收到的信息的来源。同样,您可能会向泵电机驱动器和其他执行机构发送消息,而不是将它们包括在模型中。
如果您正在编写一个电源的模拟,那么这些东西可能是您模型中的实体。
在领域驱动的设计中,实体是否允许处理复杂的操作,如I/O?
一般情况下不会。您更有可能看到建模的实体通过特定于域的API (“域服务”)执行复杂操作。这里的一个典型例子是“发送电子邮件”--我们通常不会将一堆电子邮件逻辑包含到域实体中,而是将提供访问电子邮件功能的接口(通常由基础结构层实现)传递给它们。
https://softwareengineering.stackexchange.com/questions/370177
复制相似问题