什么是域名?


104

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


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

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

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

Answers:


9

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

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

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

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

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

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

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

从业务角度来看,确定您的核心域并集中您的开发资源非常重要。Evans提供了许多视频,尤其是在InfoQ网站上,他在那里详细解释了这些概念。

因此,尽管我们经常谈论软件中的“领域”,但就DDD而言,它并不像看起来那样简单。

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


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

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

1
我想这让我想起了老话:“有两种人:把人分为两种,没有的人。” 但是......对于第二类人也就只有一个怎样的人? - 无限间接错误-系统暂停

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

109

域名是在你试图解决使用软件的问题真实世界场景。每个领域都具有该领域的专业知识,词汇和工具。

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

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

进一步阅读
Martin Fowler的有限上下文


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

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

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

38

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


7
嗯,考虑到网站domain names也被称为域名,我想您应该在这里阐明如何使用域名一词。
YetAnotherRandomUser

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

19

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

埃里克·埃文斯(Eric Evans)在书中使用货运来解释什么是DDD。在他的示例中,domain就是关于shipping的一切。货物如何运输,管理,运输和跟踪等。它带有自己的特定规则,语言和流程。这些将创建域模型,对象,服务等。

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

简而言之:域名就是您开展业务的地方。如果您的业务是运送货物-运送货物将属于您的领域。如果您的业务是在对人员进行身份验证和授权,那么这将是您的领域。


7

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

每个软件程序都与其用户的某些活动或兴趣有关。用户将程序应用到的主题领域是软件的领域

航空公司预订计划的领域涉及真正的人乘坐真正的飞机。

会计程序的领域是金钱和财务。

源代码控制系统的领域是软件开发本身。

领域模型就是领域专家头脑中的知识的“严格组织和选择性抽象”。

巴勒莫在描述洋葱结构时提供了此摘要

在最中央,我们看到了域模型,它表示为组织的真实性建模的状态和行为组合。

福勒反过来提供

包含行为和数据的领域的对象模型。

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


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

2

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

我首先从阐述领域的观点开始。

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

子域

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

领域模型

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

有界的背景

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

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

下一步是什么?

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


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

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

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

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

金钱不是真实的。业务流程不是真实的。我们可以谈论的一切都是概念,而不是真实的。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.