用形而上學進行領域建模

banq發表於2024-05-20

原文:蛋白酥皮哲學:討論了形而上學的領域建模,強調了將程式碼實體與領域模型實體對齊的重要性。作者主張模型和程式碼庫之間一一對應,這樣在模型發生變化時可以更輕鬆地維護和更新。

形而上學簡短介紹
從遠古時代開始——我的意思是,非常古老,早在柏拉圖、亞里士多德等人之前,人們就一直在用一個奇特的問題來自娛自樂:

  • 世界是由什麼組成的?
  • 我們周圍的現實是什麼?
  • 還有什麼?
  • 它是什麼樣的?
  • 為什麼?

什麼是物件Object

  • 有蘋果和橘子,我面前就有一個蘋果。
  • 有星期二和七,今天是星期二
  • 我的冰箱裡有七個鱷梨。
  • 有誠實,也有具體的誠實的人。

什麼是屬性Propertie
似乎有具體的物體,比如我面前的蘋果,也有這些物體的存在方式,比如是紅色的、甜的、放在桌子上的。

通常,屬性在句子中處於謂語位置

如果我面前有兩個蘋果,而且都是紅色的,是什麼讓它們都是紅色的呢?許多物體都具有相同的屬性,這個看似簡單的事實一定有什麼原因。那麼,是什麼共同屬性使許多蘋果都是紅色的呢?是物體嗎?是有形的嗎?

關於這一點,至少有兩種主要觀點。

  • 第一種觀點認為,是的,有一種特殊的 "東西 "叫做 "普遍性",所有具體的物體都因共享特定的普遍性而具有各自的屬性。對於 "紅色 "的含義,"普遍紅色 "就像是唯一的真理之源。此外,這個實體還為紅蘋果和紅色消防車之間的相似性提供了依據。
  • 第二種觀點認為,兩個蘋果的兩種紅度是不同的有形實體,稱為 "紅度"(tropes),代表 "紅 "的屬性。是什麼讓這些實體變得相似呢?要麼是共享一個通用的 "紅色",要麼是一個代表這種相似關係的神秘實體

這兩種觀點都有各自的支持者,激烈地爭論了好幾千年。雙方都有充分的論據來支援自己的觀點和反對反對者的觀點。但這場爭論似乎遠未得到解決。我懷疑這個問題是否能夠得到解決。這個問題甚至還有一個名字:共相問題。

自然種類
此外,還有一種似乎是天然的,所有蘋果都屬於的特殊種類:叫做 "蘋果 "的種類。

它為什麼 "自然"?它的無處不在、普遍性,以及,呃,自然性。所有的綠色事物都是一種自然的 "綠色事物 "嗎?有人說是,有人說不是。同樣,雙方都有很好的論據。

抽象物件
最後,還有一些被稱為 "抽象 "的無形物體,比如數字或感覺。它們確實存在,而且似乎與屬性和自然種類都很接近。

例如,語言學認為,謂詞有多種名詞化方式。例如,有一個人很勇敢,於是就有了勇敢。
如果謂詞之於主語就像屬性之於客體,那麼有些屬性就可以變成抽象的客體。

反過來也一樣:一些抽象物件可以 "非名詞化"。

但我們不能對 "星期四 "這樣做,對 "數字 "也沒有直截了當的公認方法。

到目前為止,事情可能看起來相當複雜。但世界的本體論是有限的,我已經概述了它的主要組成部分。對於大多數當代哲學家來說,本體論更加簡約。

用形而上學進行領域建模
1、領域模型實體與程式碼實體之間的對應關係
我希望我的程式碼能反映所需的領域專家的現實模型,這個模型目前只存在於她的頭腦中,並由她口頭表達出來。我希望模型和程式碼庫之間有一一對應的關係(雙射)。也就是說,模型中的每個實體都應與程式碼庫中的實體相對應。

為什麼要這樣做呢?因為如果模型發生了變化,我就能準確地知道在哪裡修復它。如果新增了某個實體,我也知道應該在程式碼中的哪個位置新增它。

這是很自然的事情,而且在工程學等更成熟的領域也是如此。簡化來看,製造幾乎任何東西的流程如下。工程師坐在那裡開始畫圖。畫完後,他把圖紙交給工廠工人,由他們開始製造。如果工程師修改了整張圖紙的某個微小部分,工廠工人就會清楚地知道哪個製造部分需要重做。

如果在軟體工程中也能實現這種狀態,豈不妙哉?

2、形而上學能提供什麼
既然我想讓我的程式碼庫反映一個領域模型,那麼享受構成現實的本體論似乎也是合理的。兩千五百年來,聰明的人們一直在研究現實是由什麼構成的。為什麼不利用他們的成果呢?

到目前為止,我們已經有了具體和抽象的物件、它們所屬的自然型別以及它們所擁有的屬性。

自然種類在某些方面比較突出:

  • 首先,"種類 "比 "物件 "少得多,這似乎是有道理的。
  • 其次,物體來來去去,而自然種類卻保持不變。它們是永恆不變的知識。這就是它們極其穩定的原因。這也是它們普遍存在的原因。反過來,掌握和操作它們只需要很小的認知負荷。

這就是為什麼你應該集中精力去發現自然種類的主要原因。


抽象為自然型別
擁有幾個自然型別和大量屬於自然型別的物件往往是一個領域模型考慮周全的基準。

在我個人的軟體開發經驗中,我經常會發現一些實體,我早先認為它們是單一的具體物件,不屬於任何種類,但後來發現它們就是種類。這些實體很有可能已經是領域專家頭腦中的 "種類";我們越早發現它們,對我們越有利。

完善模型的關鍵在於提出 "是什麼 "的問題。你要抽象出細節,關注本質屬性:這到底是什麼?也就是說,它屬於哪一類?不同的事物屬於同一類。紅蘋果、紅色消防車和血液都屬於紅色事物。這在你的領域有意義嗎?

  • 如果是,很好,你找到了一個自然的種類。
  • 如果不是,那就繼續探索吧。

酸酸的青蘋果和甜甜的紅蘋果,它們是什麼?它們就是蘋果!

對於領域專家來說,"蘋果 "這個概念看起來合理嗎?如果不是,那麼這個思維實體就不能反映領域專家的思維方式;在這個階段,繼續編碼也不是一個可行的選擇。

檢查其生命力的一種快速而廉價的方法是,確保一個概念不是一個適合某些特定實現的生造詞,它存在於一種語言中(banq注:存在於語言上下文中)。

畢竟,語言是現實的反映;它反映的大多是現實存在的東西(值得注意的反例是龍),至少是無處不在的心理概念。如果你使用了一個從未有人聽說過的詞,那麼你很可能存在領域模型實體-程式碼實體不匹配的問題,在某種意義上類似於物件-關係阻抗不匹配。

從這一思路中產生的有用的抽象概念是一個領域固有的自然種類。

物件
有用的抽象很少是孤立發現的。更多的時候,它們是透過歸納推理發現的:

  • 你遇到一個物件物體,注意到它的屬性;
  • 然後你偶然發現另一個物件物體,發現它有一些共同的屬性;
  • 接著你看到第三個物體,發現它與前兩個物體有共同的屬性。

好吧,可能這三個都是同類,但以後可能會發現不是這樣。漸漸地,一些概念的基本屬性就被充實出來了。

這樣,基本物件集和它們所體現的概念就同時出現了。

總的來說,這就像一個無休止的迴圈:

  • 提出假設,
  • 遇到新的證據,
  • 必要時修改最初的假設;
  • 然後重複,不斷重複。
  •  

這種想法具有普遍性:
  • 這就是 TDD 的工作方式;
  • 這就是精益創業公司開發產品的方式;
  • 這就是增長駭客營銷的主要內容。
  • 這就是被稱為科學方法的過程,也是三百年來科學的運作方式。

屬性
物件物體有物體的樣子,物體也有物體的樣子。它們是什麼樣的?它們在哪裡?何時?它們處於什麼狀態?它們在做什麼?他們感覺如何?它們有多少個?它們與其他物體有什麼關係?可能的屬性有很多,但不可能有在空中翱翔的屬性。它們在很大程度上依賴於物體。

一組基本屬性構成了一種自然屬性。如果你有一些具有確定屬性的物體,但卻很難找到一致的自然種類,那就繼續尋找吧。獎勵可以使領域模型和程式碼庫更加清晰,使你的心靈得到滿足。實際上,這裡並沒有什麼秘訣,與其說這是一門手藝,不如說是一門藝術。

我的程式碼是什麼樣的
我對自然型別使用介面或抽象類,對任何型別的物件使用實現或擴充套件介面或抽象類的類。如果我需要建立在某些方面不同的非常相似的物件,那麼使用一個類來建立可能是合理的。我可以用不同例項的屬性對其進行引數化。

如果我有一個 Apple 類,我可能就有一個 Jonagold 類。我可能想讓它們擁有不同的顏色,所以我會在 Jonagold 的建構函式中傳遞 Color。

總結
我發現形而上學可以完美地滿足企業軟體開發發現和實施的需求。我已經讀了一些東西很長一段時間了,最​​近我開始寫關於它的部落格。與此同時,我逐漸開始開源我用這種方法建立的一些庫。

 

相關文章