類型實例同音異義
2007 年 1 月 11 日
「《戰爭與和平》是一本很棒的書。」
「讓我看看... 可惜這本書的封面破破爛爛的」
這兩句話都使用了「書」這個字。我們每天都會看到這樣的組合,卻不會注意到「書」這個字在每句話中的意思完全不同。
在第一句話中,「書」指的是一部文學作品,這部作品已經存在了一百多年。在第二句話中,「書」指的是一個實體物件,可能存在的時間短很多。我可以輕易地將後者燒毀,但前者不會被火焰燒毀,而且肯定會比我活得久。我可以將前者與許多兄弟姊妹一起放在硬碟中,它們的總重量比後者還輕。
這種特殊的歧義在自然語言中非常常見。想想「車子」、「橡樹」和「程式設計師」這些字。試圖釐清這一點很容易讓你陷入哲學語義學的黑暗角落。就目前而言,我只會解釋我是如何看待這一點的。
「書」這個字是一個可以指涉多個概念的術語。上面的兩句話說明了「書」指涉的兩個概念:文學作品和實體副本。由於我的讀者大多是程式設計師,所以我會使用一個程式設計類比,來說明有兩個不同的類別都稱為「書」。我們可以透過稱呼它們為 LiteraryWork 和 PhysicalCopy 類別來消除歧義。當我在第一句話中說「《戰爭與和平》是一本書」時,我指的是「《戰爭與和平》是 LiteraryWork 類別的一個實例」。第二句話指的是 PhysicalCopy 類別的一個實例的屬性。
這兩個概念並非獨立的。與同音異義詞(例如 right 和 right,分別是 left 和 wrong 的反義詞)不同,這兩個概念之間有著密切的關係 [1]。一本書 [PhysicalCopy] 載有 [LiteraryWork] 書的呈現。因此我可能會說我的戰爭與和平封面破損。同樣地,我的 Subaru Legacy [實體車輛] 與 Subaru Legacy [汽車型號] 有關。事實上,我們可能會說我的車型是 Subaru Legacy [汽車型號]。這種關係非常常見,而且對於從事任何類型的物件或資料建模的人來說都很熟悉。您經常會看到涉及產品和產品類型等事物的類似結構。我不會使用「書」和「書型」這些術語,但這基本上是相同的關係。
在幾乎任何領域花時間進行建模或程式設計,您都會到達一個點,您必須採用該領域中的一些常見術語,並意識到它表示兩個不同的概念,它們在您的程式碼中以不同的名稱表示不同的類別(或表格)。當您在您的領域語言中遇到同音異義詞時,通常是因為這些術語在不同的脈絡中使用方式不同 - Eric Evans 稱之為有界脈絡。正如 Jim Odell 喜歡指出的:「瑪麗有一隻小羊羔」對獸醫來說和對餐館老闆來說有著截然不同的含義。類型實例同音異義詞的問題在於,它甚至會在非常嚴密的界定脈絡中發生。
我這裡的目的不是進一步討論如何建模這些類型的狀況,這本身就是一個很大的主題,而是要反思這種常見的同音異義詞所造成的歧義。關於這種歧義真正有趣的是它造成的麻煩有多少。人類似乎完全沒有問題在多個概念之間切換,而且過程中很少會被絆倒。更糟糕的是,如果您積極嘗試在日常對話中使用不同的術語,幾乎不可能堅持下去。我當然試過,無論是在對話中還是寫作中,很快意識到這是徒勞無功的。不僅我沒有紀律,而且它讓我聽起來像一個患有某種不明精神疾病的人。(類型實例案例並非唯一具有此特性的案例,正如「走進我們上週粉刷的那扇門」這句話所暗示的。)
在我自己專精的物件導向設計中,有一個特別迷人的例子。我們經常談論「新增方法到物件」這類事情。然而,當然,我們不會將方法新增到物件,而是將它們新增到類別。在您職業生涯中的某個時刻,您會成為在會議中指出這一點的吹毛求疵者。從那以後,您也在無數次對話中毫不費力地忽略了這一點。
所以我得出結論,我們絕對必須意識到這個同音異義詞。我們需要在我們的軟體中以不同的名稱分別表示這些概念。但我們不應期望在我們的對話中區分它們,除非我們處於一個真正有混淆危險的脈絡中,因為在大部分時間裡,我們的大腦會自動解決歧義。
那麼這在泛用語言的背景下代表什麼意思?首先,我們必須進行建模並了解我們有不同的概念(了解同音異義詞)。然後,我們為泛用語言中我們將使用的不同概念想出名稱,並因此在軟體表示中使用。在想出這些名稱時,我喜歡避免單純的同音異義詞:因此我不會在圖書館背景下使用「書」,而是偏好使用「文學作品」和「實體副本」等字詞。這些消歧義術語需要讓領域專家理解,就像泛用語言中的其他任何事物一樣。因此,領域專家需要了解同音異義詞,並協助想出新術語。然後,只要我們需要我們獲得的精確度,我們就會使用新術語。然而,我們應該小心不要試圖完全驅逐同音異義詞。它實際上變成每個新術語的同義詞。因此,如果領域人員說「書有作者」,我們可能會說「你的意思是文學作品,對吧?」請記住,對每個人來說,不使用同音異義詞術語都會感覺不自然,因此要輕柔地應用精確度。幸運的是,意識佔了這場戰鬥的 90%。
這個同音異義詞的另一個後果是,你應該隨時讓你的天線掃描它,特別是在新領域工作的初期。它通常出現在對該領域絕對核心的術語中,就像書和圖書館一樣。我喜歡使用非正式類別圖來建模泛用語言,而且我發現它可以很好地根除這些類型的同音異義詞。
備註
1: 吉姆·懷特發電子郵給我,讓我了解在語言學中,術語「多義詞」有時用來表示具有不同但相關含義的字詞。
於 2013 年 3 月 19 日重新發布