我在软件体系结构(“域模型”,“域驱动设计”等)的上下文中经常看到这个术语。我已经用谷歌搜索了,但是有很多不同的定义。那到底是什么呢?

评论

不幸的是,我认为这是没有明确定义的单词之一,并且经常在不明确的上下文中使用。足够了解之后,您将了解。我的观点是,即使阅读了所有在此处看到的答案,您也不应期望了解它的用法。需要时间。

@aaaaaa恰好... Humpty Dumpty轻蔑地笑了。 ...“当我使用一个单词时,”矮胖子用一种轻蔑的语气说,“它意味着我选择它的意思-既不多也少。”

我认为没有明确的定义是不正确的。如果看普通的韦伯斯特定义,您会看到它是“在其上行使支配地位的区域”,“一个由某些物理特征明显标记的区域”。数学中的类似定义-函数的“域”。您可以根据负责该区域的人员或某些条件将大的东西划分为多个域或区域。有点像一个模块。因此,“域模型”(据我理解)是可以在应用的业务逻辑中使用的模型。 DDD也与各种“区域”有关。

#1 楼

埃里克·埃文斯(Eric Evans)的《领域驱动设计》一书中的“领域”一词具有特定含义。这就是软件的意义所在。

Evans走得更远。在他看来,即使使用相同的软件,也存在子域。这是本书中涉及“战略设计”的部分。

有三个“领域”:核心领域,支持领域和通用领域。有时他会把这些称为子域。

Evans也非常关注软件背后的实际业务,而这本书不仅针对开发人员,还针对需要了解如何开发的架构师和管理人员。软件和业务可以协同工作,这就是他在讨论战略设计和这些子领域时所关注的。

因此,核心领域是软件的一部分,既代表了竞争优势,又代表了竞争优势。以及软件的“存在理由”。这就是软件的一部分,这就是为什么客户购买该软件而不是购买其他软件的原因。通常,Evans将其视为包含最小百分比代码的域。您可以将其视为最重要的20%。这是您无法真正购买的部分,它可能只是整个软件的单个模块或组件。

支持领域仍然很重要,并且对于组织而言可能是唯一的,但是不如核心领域重要。没有它,该软件将失去价值,其核心将依靠它。它可能是您自己编写的软件中的多个模块,它们对核心执行重要但支持的功能。

通用域是最不习惯定制的,在某种意义上是软件的最不重要的部分。您可能是在内部编写的,但直接购买或使用知名的开源软件可能会更有效率。系统的这一部分可能不特定于您的整个域,因此,例如,无论您有运送包裹的运输系统还是管理患者的健康记录系统,通用域都是这​​些系统的一部分,这是普遍且公正的只需要在那里工作就可以了。这可能构成了整个系统的大部分,但不一定如此。

从业务角度出发,重要的是确定您的核心域是什么,并将您的开发资源集中在那里。埃文斯(Evans)有很多视频,尤其是在InfoQ网站上,他在那里更详细地解释了这些概念。

因此,尽管我们经常谈论软件中的“领域”,但对于DDD而言,却并非如此。

我应该注意到DDD的概念不一定存在于更广泛的软件社区中。其他开发人员,作者和产品人员可能有不同的想法和定义,有些更微妙,有些更少。甚至其他写过DDD的作者也可能在Evans的书中掩盖了这些概念,但是我觉得这些概念在编写和计划软件项目时仍然有用。

评论


回复:您的最后一段:也许我们应该就软件开发的核心领域达成一些协议?但是,就像同意什么是OOP,功能或其他术语一样,我认为Humpty Dumpty很久以前就赢了。

–user251748
17-10-25在14:08

@nocomprende不,这些概念特定于特定组织,特定时间的特定单个软件。因此,MSFT Windows的核心域将根据市场状况,客户期望等而有所不同。

– RibaldEddie
17-10-25在15:12

我想这让我想起了一句老话:“有两种人:把人分为两种,没有的人。”但是……对于第二类人,只会只有一种人……–无限间接错误-系统停止

–user251748
17-10-25在16:30



@nocomprende对不起,我真的不太理解您的第一个评论-对软件开发核心领域的“同意”部分是个玩笑。

– RibaldEddie
17-10-28在23:39

#2 楼

域是您尝试使用软件解决问题的真实环境。每个领域都具有属于该领域的专业知识,词汇和工具。

领域的特定示例可能类似于“使用高速旋转刀具自动加工复杂零件”。完成此任务的软件和硬件系统称为CNC铣床。

域的另一个示例是公司的会计部门。

Martin Fowler进一步阅读有界上下文

评论


对。当您阅读“领域”时,可以替换为“(限于特定的)专业知识或关注领域”。

– KlaymenDK
17-10-26在8:51

要记住的一件有趣的事是,软件的领域实际上与人类试图实现的目标或他们将理解的目标无关。我确信汽车中的简易计算机可以优化我不知道的燃烧,坦率地说,它不在乎。因此,假设软件是关于人的视角并且想要的,这是一个非常危险的误解。这可能会派上用场,因为软件系统涵盖了更大的领域,并且意识和选择目标的能力不断增强。嘿,等等,阿西莫夫(Asimov)早就没想到吗?

–user251748
17-10-26在13:37

@ user251748-好吧,我认为这与人类及其所涉及的过程有关,而不必一定与人们即时了解的内容有关。

–西波
18/09/13在11:29

#3 楼

这仅表示您正在处理的问题空间。例如,如果您正在构建一个电子商务网站,则您的域将是“电子商务”,并且将涉及与客户/公司的销售实践相关的流程。因此,领域模型将代表某种产品,发票或运输记录。

评论


嗯,考虑到网站具有域名(也称为域名),我认为您应该在这里阐明如何使用“域名”一词。

–YetAnotherRandomUser
17-10-24在22:40

@YetAnotherRandomUser-对我来说,他的意思很清楚。 ;)

–西波
17年11月15日在9:50

#4 楼

领域是知识领域。它可能是一项活动,其中存在由软件解决的问题。 (Wiki,DDD社区)

Eric Evans在他的书中,使用货运来解释DDD是什么。
在他的示例中,领域是关于运输的一切。
它具有自己的特定规则,语言和流程。
它们将创建领域模型,对象,服务等。

创建应用程序时,您将获得某种授权,就像现实世界中的运输一样,并不是每个人都可以访问仓库。
如何授权用户以及如何授予权限可以不在授权范围内。
域,因为该信息可能与货物的运输无关。

简单地说:域是您开展业务的地方。
如果您的企业是在运输货物-装运货物将是您的域名。
如果您的业务是在对人员进行身份验证和授权,那么这将是您的域名。

#5 楼

领域驱动设计:解决软件核心问题的复杂性,Eric Evans:

每个软件程序都与其用户的某些活动或兴趣有关。用户应用程序的主题领域是软件的领域。
航空公司预订程序的领域涉及到真正的人乘坐真正的飞机。
会计程序的领域是金钱和金融。
源代码控制系统的领域就是软件开发本身。

领域模型,然后是领域专家头脑中的知识的“严格组织和选择性抽象”。 。
Palermo在描述洋葱体系结构时提供了此摘要

在最中央,我们看到了域模型,该域模型表示为组织的真实性建模的状态和行为组合。 />
福勒又提供了

结合了行为和数据的领域对象模型。

如果您正在查看较新的定义,您更有可能遇到域模型和数据模型不同的引用。我不认为意义的改变与重点的改变一样多-与将行为写下来的不同方式相比,对行为建模(数据响应来自模型外部信息的方式变化)具有更丰富的复杂性和变化性。

评论


我会根据实际活动将您的定义调整为计算机系统正在执行的操作。例如,“源代码控制系统的域是”-存储和检索源代码文件。对域进行建模,不是为了处理现实世界的事物,而是使编程系统更易于构建和维护。因此,重点在于计算机可以做什么来促进这种工作,而不是人类可以做什么。数字X射线提高了X射线过程的灵敏度和图像处理能力,它们对人类没有任何作用,对无人值守的行李扫描同样有用。

–user251748
17-10-25在14:04

#6 楼

由于您可能已经知道什么是域,因此我想下一步将尝试定义子域,域模型,更重要的是定义有界上下文。

我先开始不过,以我对领域的看法。



域是我们居住的现实:其实体,行为,所遵循的法律。它以一种或另一种形式存在于我们之前,并将存在于我们之后。它的存在并不取决于我们的意识。营销人员提出了新功能并进行了市场分析,大客户经理与客户沟通,软件开发人员使业务流程自动化。这就是为什么将域称为问题空间的原因。
子域

DDD意味着将域分解为子域,以简化其建模和理解。您经营一家企业的事实实际上暗示至少有一项主要的商业价值。与您一起赚钱的那一个。我们开始做生意的那个。因此,即使您不知道“核心域”之类的词,它也仍然存在。这同样适用于子域:可能您需要簿记,人力资源,技术支持—但它是次要的。

域模型

无需建模完整提取子域。我们感兴趣的每个子域中都有一组特定的规则。某个子域中要获得一定业务结果所必需的规则集称为模型。

有界contexts

最重要的是有界上下文是逻辑边界。

定义了子域和核心域时,就该实现代码了。有界上下文定义了某些子域的适用性的明显边界。在该区域中,某个子域有意义,而其他子域则没有意义。它可以是演讲,演示文稿或具有由工件定义的物理边界的代码项目。

接下来是什么?

如果您对有界上下文概念与子域概念如何关联,如何定义子域和有界上下文,如何表示它们彼此之间的通信以及如何在考虑这些概念的情况下组织团队感兴趣,那么您可能对此感兴趣进一步阅读。

评论


我要说的是软件的领域就是软件的作用。当然,它摆在我们面前并不存在,它完全由我们组成,去做我们想委派的事情,以便它们在不需要我们交互的情况下发生。换句话说,这是关于我们曾经梦dream以求的梦想。而且,我们很快就忘记了软件一旦部署就如何工作。软件是一种更适合计算机解决的游戏,我们直到现在才完成它,因为我们还没有构建计算机,以解决我们不想再被打扰的问题。但是很快

–user251748
17-10-26在13:43

我没有在这部分中说明自己-“在我们之前”,我不好。我完全不是说这个领域存在于人类之前。 “我们”一词更像是软件开发人员,其解决了电子商务中业务流程自动化的问题。商业的概念显然存在于他们之前。因此,开发人员的责任是使您可以将事物委派给计算机,如您所说。

–user286277
17-10-26在14:56

对。我的观点是,人们认为计算机系统是应对现实世界的一种方式。但是计算机带来了很多想法,需求和疑虑,而这些想法,需求和疑虑根本就不是该领域的一部分。就像说外科手术是解决情绪问题的一种方式。好吧,肺叶切除术是可行的,但是情绪问题与大脑无关。而且,我的感觉受激素和神经递质的强烈影响,所以SSRI是生物学,心理学,人际关系的一部分,还是它们本身属于一种类别?计算机是关于计算机的,不是真实的东西。

–user251748
17-10-26在22:16

计算机是关于对真实事物建模的。就像在另一个可以做实事,可以执行真正的业务流程,可以应用真正的业务约束的领域一样,比如说50年前,我已经在一家商店向收银员支付了1美元,现在是整个购买过程可能不需要与人互动。尽管如此,我的真实资金还是从我的真实银行帐户中提取了。因此,任何过程,计算机,人或其他事物涉及什么都没有关系。可能对您来说很有趣:medium.com/@wrong.about/…

–user286277
17-10-27在19:33

金钱不是真实的。业务流程不是真实的。我们可以谈论的一切都是概念,而不是真实的。

–user251748
17-10-28在1:46