类型实例同义词
2007年1月11日
"《战争与和平》是一本很棒的书。
"让我看看...可惜这本书的封面破损了"
两个句子,每个句子都使用了“书”这个词。我们每天都会浏览这样的组合,却不会注意到“书”这个词在每个句子中的含义完全不同。
在第一个句子中,“书”指的是文学作品,它已经陪伴我们超过一百年了。在第二个句子中,“书”现在指的是一个物理对象,它可能存在的时间要短得多。我可以很容易地用火烧毁后者,但前者不会被我的火焰触碰,而且毫无疑问会比我活得更久。我可以把前者放到我的硬盘上,它有很多兄弟姐妹,总重量还不到后者的重量。
这种特殊的歧义在自然语言中非常常见。想想“汽车”、“橡树”和“程序员”这样的词。试图理清这些问题很容易让你陷入哲学语义学的黑暗角落。现在,我只解释一下我对这个问题的看法。
“书”这个词可以指代多个概念。上面的两个句子说明了“书”所指代的两个概念:文学作品和实体副本。由于我的大部分读者都是程序员,我将使用一个编程类比来说明,即有两个不同的类,它们都被称为“书”。我们可以通过将它们称为 LiteraryWork 和 PhysicalCopy 类来区分它们。当我在第一个句子中说“战争与和平”是一本书时,我的意思是“战争与和平”是 LiteraryWork 类的实例。第二个句子指的是 PhysicalCopy 实例的属性。
这两个概念并非独立的。与“正确”和“正确”(左和错的反义词)这样的同义词不同,这两个概念之间存在着密切的关系 [1]。一本 [PhysicalCopy] 书上承载着 [LiteraryWork] 书的渲染。因此,我可能会说我的《战争与和平》的封面破损了。同样,我的斯巴鲁力狮 [实体汽车实例] 与斯巴鲁力狮 [汽车型号实例] 之间存在着关系。事实上,我们可能会说我的汽车的类型是斯巴鲁力狮 [汽车型号]。这种关系非常普遍,对于从事任何类型对象或数据建模的人来说都很熟悉。你经常会看到类似的结构,涉及诸如产品和产品类型之类的东西。我不会使用“书”和“书类型”这两个词,但它从根本上来说是相同的关系。
在几乎任何领域进行建模或编程时,你都会到达一个点,你必须在该领域中使用一些常见的术语,并意识到它表示两个不同的概念,这两个概念在你的代码中意味着不同的类(或表)和不同的名称。当你在领域语言中遇到同义词时,通常是因为这些术语在不同的上下文中使用方式不同——埃里克·埃文斯称之为“边界上下文”。正如吉姆·奥德尔喜欢指出的那样:“玛丽有一只小羊羔”对兽医和餐馆老板来说意义完全不同。类型-实例同义词的问题在于,它即使在非常紧密的边界上下文中也会出现。
我在这里的目的不是进一步讨论对这类情况进行建模,这是一个独立的话题,而是反思这种常见的同义词引起的歧义。关于这种歧义真正有趣的事情是它造成的麻烦有多 _少_。人类似乎毫不费力地就能在多个概念之间切换,而且很少在这个过程中被绊倒。更糟糕的是,如果你主动尝试在日常对话中使用不同的术语,几乎不可能坚持下去。我当然尝试过,无论是在对话中还是在写作中,很快就意识到这是一场徒劳的努力。我不仅没有纪律,而且让我听起来像是一个患有某种奇怪精神疾病的人。(类型-实例情况并非唯一具有这种属性的情况,正如“穿过我们上周粉刷的门”这句话所暗示的那样。)
在我的面向对象设计专业领域中,有一个特别引人入胜的案例。我们经常谈论“向对象添加方法”。然而,当然,我们不是向对象添加方法,而是向类添加方法。在你职业生涯的某个时刻,你曾经是那个在会议上指出这一点的迂腐之人。从那以后,你也在无数的对话中毫不费力地忽略了这一点。
因此,我得出结论,我们绝对必须意识到这种同义词。我们需要在我们的软件中分别用不同的名称来表示这些概念。但是,我们不应该期望在我们的对话中区分它们,除非我们处于一个真正有可能造成混淆的上下文中,因为大多数时候我们的大脑会自动解决这种歧义。
那么,这在 通用语言 的背景下意味着什么呢?首先,我们必须进行建模,并意识到我们有不同的概念(意识到同义词)。然后,我们为不同的概念想出一些名称,这些名称将在我们的通用语言中使用,从而在软件表示中使用。在想出这些名称时,我喜欢避免使用裸同义词:因此,我不会在图书馆上下文中使用“书”,而是更喜欢使用“文学作品”和“实体副本”之类的名称。这些消除歧义的术语需要对领域专家来说易于理解,就像通用语言中的任何其他内容一样。因此,领域专家需要意识到同义词,并帮助想出新的术语。然后,每当我们需要获得的精度时,我们就会使用新的术语。但是,我们应该谨慎地尝试完全消除同义词。它实际上成为每个新术语的同义词。因此,如果领域人员说“一本书有作者”,我们可能会说“你是说文学作品,对吧?”请记住,对每个人来说,不使用同义词会让人感觉不自然,因此要轻描淡写地应用精度。幸运的是,意识是这里 90% 的战斗。
这种同义词的另一个结果是,你应该始终注意它——尤其是在开始在一个新领域工作的时候。它通常出现在对该领域绝对至关重要的术语中——就像书籍和图书馆一样。我喜欢使用非正式的类图来对通用语言进行建模,我发现它在根除这类同义词方面做得很好。
注释
1: 吉姆·怀特给我发邮件,告诉我,在语言学中,术语“多义词”有时用来表示一个词具有不同的但相关的含义。
2013年3月19日重新发布