用形而上学进行领域建模

原文:蛋白酥皮哲学:讨论了形而上学的领域建模,强调了将代码实体与领域模型实体对齐的重要性。作者主张模型和代码库之间一一对应,这样在模型发生变化时可以更轻松地维护和更新。

形而上学简短介绍
从远古时代开始——我的意思是,非常古老,早在柏拉图、亚里士多德等人之前,人们就一直在用一个奇特的问题来自娱自乐:

  • 世界是由什么组成的?
  • 我们周围的现实是什么?
  • 还有什么?
  • 它是什么样的?
  • 为什么?

什么是对象Object

  • 有苹果和橘子,我面前就有一个苹果。
  • 有星期二和七,今天是星期二
  • 我的冰箱里有七个鳄梨。
  • 有诚实,也有具体的诚实的人。

什么是属性Propertie
似乎有具体的物体,比如我面前的苹果,也有这些物体的存在方式,比如是红色的、甜的、放在桌子上的。

通常,属性在句子中处于谓语位置

如果我面前有两个苹果,而且都是红色的,是什么让它们都是红色的呢?许多物体都具有相同的属性,这个看似简单的事实一定有什么原因。那么,是什么共同属性使许多苹果都是红色的呢?是物体吗?是有形的吗?

关于这一点,至少有两种主要观点。

  • 第一种观点认为,是的,有一种特殊的 "东西 "叫做 "普遍性",所有具体的物体都因共享特定的普遍性而具有各自的属性。对于 "红色 "的含义,"普遍红色 "就像是唯一的真理之源。此外,这个实体还为红苹果和红色消防车之间的相似性提供了依据。
  • 第二种观点认为,两个苹果的两种红度是不同的有形实体,称为 "红度"(tropes),代表 "红 "的属性。是什么让这些实体变得相似呢?要么是共享一个通用的 "红色",要么是一个代表这种相似关系的神秘实体

这两种观点都有各自的支持者,激烈地争论了好几千年。双方都有充分的论据来支持自己的观点和反对反对者的观点。但这场争论似乎远未得到解决。我怀疑这个问题是否能够得到解决。这个问题甚至还有一个名字:共相问题。

自然种类
此外,还有一种似乎是天然的,所有苹果都属于的特殊种类:叫做 "苹果 "的种类。

它为什么 "自然"?它的无处不在、普遍性,以及,呃,自然性。所有的绿色事物都是一种自然的 "绿色事物 "吗?有人说是,有人说不是。同样,双方都有很好的论据。

抽象对象
最后,还有一些被称为 "抽象 "的无形物体,比如数字或感觉。它们确实存在,而且似乎与属性和自然种类都很接近。

例如,语言学认为,谓词有多种名词化方式。例如,有一个人很勇敢,于是就有了勇敢。
如果谓词之于主语就像属性之于客体,那么有些属性就可以变成抽象的客体。

反过来也一样:一些抽象对象可以 "非名词化"。

但我们不能对 "星期四 "这样做,对 "数字 "也没有直截了当的公认方法。

到目前为止,事情可能看起来相当复杂。但世界的本体论是有限的,我已经概述了它的主要组成部分。对于大多数当代哲学家来说,本体论更加简约。

用形而上学进行领域建模
1、领域模型实体与代码实体之间的对应关系
我希望我的代码能反映所需的领域专家的现实模型,这个模型目前只存在于她的头脑中,并由她口头表达出来。我希望模型和代码库之间有一一对应的关系(双射)。也就是说,模型中的每个实体都应与代码库中的实体相对应。

为什么要这样做呢?因为如果模型发生了变化,我就能准确地知道在哪里修复它。如果添加了某个实体,我也知道应该在代码中的哪个位置添加它。

这是很自然的事情,而且在工程学等更成熟的领域也是如此。简化来看,制造几乎任何东西的流程如下。工程师坐在那里开始画图。画完后,他把图纸交给工厂工人,由他们开始制造。如果工程师修改了整张图纸的某个微小部分,工厂工人就会清楚地知道哪个制造部分需要重做。

如果在软件工程中也能实现这种状态,岂不妙哉?

2、形而上学能提供什么
既然我想让我的代码库反映一个领域模型,那么享受构成现实的本体论似乎也是合理的。两千五百年来,聪明的人们一直在研究现实是由什么构成的。为什么不利用他们的成果呢?

到目前为止,我们已经有了具体和抽象的对象、它们所属的自然类型以及它们所拥有的属性。

自然种类在某些方面比较突出:

  • 首先,"种类 "比 "对象 "少得多,这似乎是有道理的。
  • 其次,物体来来去去,而自然种类却保持不变。它们是永恒不变的知识。这就是它们极其稳定的原因。这也是它们普遍存在的原因。反过来,掌握和操作它们只需要很小的认知负荷。

这就是为什么你应该集中精力去发现自然种类的主要原因。


抽象为自然类型
拥有几个自然类型和大量属于自然类型的对象往往是一个领域模型考虑周全的基准。

在我个人的软件开发经验中,我经常会发现一些实体,我早先认为它们是单一的具体对象,不属于任何种类,但后来发现它们就是种类。这些实体很有可能已经是领域专家头脑中的 "种类";我们越早发现它们,对我们越有利。

完善模型的关键在于提出 "是什么 "的问题。你要抽象出细节,关注本质属性:这到底是什么?也就是说,它属于哪一类?不同的事物属于同一类。红苹果、红色消防车和血液都属于红色事物。这在你的领域有意义吗?

  • 如果是,很好,你找到了一个自然的种类。
  • 如果不是,那就继续探索吧。

酸酸的青苹果和甜甜的红苹果,它们是什么?它们就是苹果!

对于领域专家来说,"苹果 "这个概念看起来合理吗?如果不是,那么这个思维实体就不能反映领域专家的思维方式;在这个阶段,继续编码也不是一个可行的选择。

检查其生命力的一种快速而廉价的方法是,确保一个概念不是一个适合某些特定实现的生造词,它存在于一种语言中(banq注:存在于语言上下文中)。

毕竟,语言是现实的反映;它反映的大多是现实存在的东西(值得注意的反例是龙),至少是无处不在的心理概念。如果你使用了一个从未有人听说过的词,那么你很可能存在领域模型实体-代码实体不匹配的问题,在某种意义上类似于对象-关系阻抗不匹配。

从这一思路中产生的有用的抽象概念是一个领域固有的自然种类。

对象
有用的抽象很少是孤立发现的。更多的时候,它们是通过归纳推理发现的:

  • 你遇到一个对象物体,注意到它的属性;
  • 然后你偶然发现另一个对象物体,发现它有一些共同的属性;
  • 接着你看到第三个物体,发现它与前两个物体有共同的属性。

好吧,可能这三个都是同类,但以后可能会发现不是这样。渐渐地,一些概念的基本属性就被充实出来了。

这样,基本对象集和它们所体现的概念就同时出现了。

总的来说,这就像一个无休止的循环:

  • 提出假设,
  • 遇到新的证据,
  • 必要时修改最初的假设;
  • 然后重复,不断重复。
  •  

这种想法具有普遍性:
  • 这就是 TDD 的工作方式;
  • 这就是精益创业公司开发产品的方式;
  • 这就是增长黑客营销的主要内容。
  • 这就是被称为科学方法的过程,也是三百年来科学的运作方式。

属性
对象物体有物体的样子,物体也有物体的样子。它们是什么样的?它们在哪里?何时?它们处于什么状态?它们在做什么?他们感觉如何?它们有多少个?它们与其他物体有什么关系?可能的属性有很多,但不可能有在空中翱翔的属性。它们在很大程度上依赖于物体。

一组基本属性构成了一种自然属性。如果你有一些具有确定属性的物体,但却很难找到一致的自然种类,那就继续寻找吧。奖励可以使领域模型和代码库更加清晰,使你的心灵得到满足。实际上,这里并没有什么秘诀,与其说这是一门手艺,不如说是一门艺术。

我的代码是什么样的
我对自然类型使用接口或抽象类,对任何类型的对象使用实现或扩展接口或抽象类的类。如果我需要创建在某些方面不同的非常相似的对象,那么使用一个类来创建可能是合理的。我可以用不同实例的属性对其进行参数化。

如果我有一个 Apple 类,我可能就有一个 Jonagold 类。我可能想让它们拥有不同的颜色,所以我会在 Jonagold 的构造函数中传递 Color。

总结
我发现形而上学可以完美地满足企业软件开发发现和实施的需求。我已经读了一些东西很长一段时间了,最​​近我开始写关于它的博客。与此同时,我逐渐开始开源我用这种方法创建的一些库。