在〈物件 (Object) 的媽媽是 類別 (Class)?〉一文中,Kenming 兄提到「物件是有機的生命體,但類別卻不是,事實上,世界上根本就沒有『類別』這種有機體;而若是類別不是有機的生命體,那麼,物件就絕對不可能是由其誕生的!」。然而,對於 Kenming 兄的這個觀點似乎很難有定論,誠如 William 君所回應的「 說實在的,這不管是在生命科學層次、哲學層次還是在電腦實踐層次,都未必有標準答案。」。為什麼 Kenming 兄會認為類別不是有機體呢?我想這一段話可以看出個端倪:
我相信在實做面的技術,為了穩定與效能等考量,會把 Class 當成 Object 來用,那麼,Class 在該應用平台是否也是 “Instance” ?
Kenming 兄大概是認為類別並不具有任何的實體,沒有生命期,至少在象徵軟性議題的問題領域結構設計與需求方面的範疇是如此,所以類別在軟體設計上並不屬於有機體。
不過,我倒認為這樣的論點雖然可以簡化設計思維,但對於進階設計者而言,卻會發現設計中,用這樣的觀點來看事情,對設計卻會造成一些困擾,因為真實世界的問題常常不如我們想像地那麼簡單,當我們發現問題領域需要同中求異或異中求同的過程中,就會出現類別這個有機體。
也就是說,在領域模型中,類別可能變成物件,並不一定是為了穩定與效能的考量才這樣做,例如我們會把某種物件賦予它一個特定的物件分類,這樣我們就可以用這個物件分類封裝擁有者物件實體的特定行為,而這樣做可以得到多型的好處-使領域模型更能適應需求的變化,例如我們可以針對不同物件分類而有不一樣的實作細節(即 Strategy Pattern),甚至可以動態改變物件的行為(即 State Pattern),而運用多型在領域模型的分析與設計過程中是十分常見的例子,但其與系統面的考量卻是沒有關係的。
從另一方面來看,真實世界的物件常常可以把它們視做是一種分類,例如某一種產品或服務,對於交易而言,它們是用來說明交易項目內容是屬於那一種商品或提供什麼服務,有實體的是交易項目本身而非產品或服務。而對於產品或服務而言,商品或服務才是一種實體,然而對於商品或服務的規格而言,也變成規格是一種分類而不代表實體。所以,我們發現實體與分類是一種對待的相對關係而非絕對的,要取決於問題領域的語意中心為何,而在現實生活中,分類與實體的分野常常卻是不明確的。
所以「孤陰不生、獨陽不長」,物件(陰-具體)與類別(陽-概念)是不可能單獨存在的,必須陰陽調和。正如《易經》繫辭中所言:「方以類聚,物以群分,吉凶生矣。在天成象,在地成形,變化見矣。」,清代王希夷在《漢宋易學解》中解釋:「方者事情之所嚮,物者品彙之不齊,方各有類,物各有群」。在軟體設計的領域中,如果類別設計代表的概念上的演化方向,是一種一般化的思維;物件則代表概念上的具體成形,是一種應用領域的實現。有了類別的在天成象,物件的在地成形是其類別的具體呈現,其實類別之於物件就像生命個體之於遺傳基因一樣,所以我們並不能說類別不是有機體。
物件導向的設計典範與程序導向之不同是在於前者將後者資料實體與行為以抽象化的概念封裝成為一個完整概念,使物件實體之間可以依據此概念的可操作的行為來操作特定物件實體的類別方法。程序導向的基本假設是程序與資料是分離的、不相關的,程序只是單純地對資料做處理而已,其系統觀點是屬於機械論。而物件導向的設計思維則是把物件的資料實體與其行為操作看作一個整體,物件屬性與方法是相互關連的,物件必須按照行為合約對外界作出回應,其系統觀點是屬於社會有機體論。所以當問題規模變大或變複雜時,用物件導向的設計手法的目的是讓抽象概念與具體實現充份融合,讓我們的設計模型具有更豐富的語意而與真實世界的認知更為接近。
所以當我們用過於簡化的思維,以為類別是死的,物件是活的,這種想法走到極端時,最後很容易發展出營養不良的領域模型,因為其設計的本質基本上還是不脫於程序處理資料的問題處理模式,這樣在面對更複雜的問題當然會適應不良。而「量無窮,時無止,分無常,終始無故」,物件與類別的分際常常是變化不居的,尤其是在面對複雜問題時,這種現象更是明顯。