软件应用程序总是围绕构成公司业务的知识和活动领域发展。

域驱动设计是一种软件开发方法,通过将实现与不断发展的模型连接起来来解决复杂的问题:它提供了一套工具,旨在设计和实现具有高业务价值的代码。

需要注意的是,DDD 旨在解决复杂的问题,如果复杂性不足以证明其合理性,则可能过于过分。

DDD 提供两种方法,一种是战略方法,另一种是战术方法。

战略方法

战略方法有助于团队从业务竞争力的角度做出最佳设计和集成选择。该公司从软件模型中获益更多,以明确反映组织的能力。这里定义了重要的概念,如边界上下文和无处不在的语言。

边界上下文的定义是语义上下文边界的定义。在此边界的外壳内,软件模型的每个组件都有特定的含义和特定的责任。边界内的组件特定于该上下文,在语义上与此一致。

另一方面,无处不在的语言是在一个在边界上下文中工作的团队中开发的语言,该团队的每个成员都使用这种语言。软件模型必须按照该语言进行一致建模,然后在团队成员之间使用并在代码中实现。

战术方法

DDD 提供的第二种方法是战术方法,它帮助团队设计真正有用的软件,从而准确对业务进行模型设计。组织应受益于各种选项来发布解决方案,包括各种基础设施选项,无论是内部还是云中。这是实施聚合器的地方。

要解释聚合的概念,我们必须首先提及实体和价值对象的概念。

实体是一种软件元素,它对对象进行唯一的模型化。根据定义**,实体**始终具有通过 ID 表达的独特身份,该 ID 将其个性与同类型所有其他实体区分开来。实体通常是可变的,因此其状态会随着时间而改变。

相反,价值对象是一种软件元素,它为一个不变的概念进行模型化。在模型中,我们只是具有一个值,与实体相反,没有单体标识。价值客体之间的等价性实际上是从其价值的简单等价性决定的。

我觉得完美的一个例子是钞票:让我们想象一下,为一张5+纸币建模。一般来说,在需要付款的业务中,5 英镑的钞票等于另一张相同价值的钞票,它们完全可互换。但是,如果我们的域名改为造币厂,则每张纸币都需要一个 ID 才能单独识别它,因为每个域名都不再可与其他纸币互换。

现在回到点:聚合是从一个或多个实体和一个或多个值对象获得的组成。通常,其中一个实体具有聚合根的作用,这是主要元素。然后,这两种类型的各种元素的聚合形成一个必须具有交易一致性边界的聚合。这意味着聚合状态必须始终与所有部分的业务规则保持一致,因此必须同时对构成该聚合物的元素进行所有必要的更改。

最后,要总结域驱动设计的基本概念,我们需要讨论子域。

如果公司处理的所有业务都构成该域则子域是该业务的一部分。子域可用于逻辑上细分完整的域,以便了解问题,从而分解复杂性。在 DDD 中,子域最好作为明确的边界上下文实现。

在公司的子领域,有"域专家",他们非常了解构成业务这一部分的方面,因为他们每天都在那里工作。

然而,并非所有的子域都是一样的:我们可以识别三个类别。

**核心域,**这是最重要的子域,因为它意味着伟大的结果的业务:这是组织必须出类拔萃的子领域,必须为它带来竞争差异。

支持子域,这不如核心重要,但对业务仍然很重要,因为没有它们,核心域不能成功:然而,即使公司没有与在核心领域相同的投资,公司也希望进行自定义开发。

最后,**通用子域,**通用子域,因为这些可能有一个现成的解决方案在市场上,你可以购买,或者你会决定在外包解决方案的发展,在这里公司希望使投资最少的可能