類別設計演化論

最近HSDc有一篇文章,主題是《繼承或是一般化?》,作者Ringle Lai認為類別的繼承不應該用生物繼承的角度去看它。他提道:

現代人中的上一個分類其實是「人屬」, 「人屬」有一個重要的特性是會製作工具,而現代人種則除了製作簡單工具的這個重要特性外,另外可以進行縝密的思考,因此,產生了製作太空船這樣的行為。

但是,如果我們利用「繼承」的概念去解釋上面的設計圖,則會作這樣的解讀:現代人種繼承自人屬;這種觀念,似乎和我們一般的看法大異其趣。

因此,用「繼承」的語彙來形容類別間的關係,其實並不適合。

然而,到底生物學中的繼承是什麼呢?維基百科對「Biological inheritance」名詞做這樣的解釋:

Biological inheritance is the process by which an offspring cell or organism acquires or becomes predisposed to characteristics of its parent cell or organism. Through inheritance, variations exhibited by individuals can accumulate and cause a species to evolve.

(生物的繼承是後代細胞或生命體取得或變成先天傾向它的父母細胞或生命體的特性的過程。透過繼承,個體的變化可以累積並且造成物種的逐步演進。)

由上面解釋看起來,並不能證明類別繼承與生物繼承在意義上有顯著不同!換句話說,Ringle Lai在該篇文章所提到的「根據生物學的觀點來說,分類是沒有繼承關係的」論點,令我無法理解他的立論根據為何,因為以定義來看生物分類的繼承關係,繼承的重點在於特性的相似性,人種的特性是由人屬所衍生出來的,用人種繼承人屬以類別設計的角度和生物學上的定義並沒有太大的差異。

我和Ringle Lai對類別繼承看法的不同,我想問題應該是出在這一段話:

事實上,所謂的「繼承」,通常指的是實體物件依據某些特定準則(生殖或是法律)的某種移轉(基因或是法律權利);然而,在軟體設計領域中,繼承卻往往是「反向」的。也就是說,我們在設計時,通常會是先發現「子類別」的物件,接著,才抽象出「父類別」來。

設計類別時,得確是大部分先發現「子類別」,再抽象出「父類別」,但我認為這種現象並不是類別繼承的「反向」作用的結果;而是演化論,是指類別如同基因或生命體般經過變異遺傳自然選擇作用下的演變發展。因為依據子類別抽象出父類別時,子類別已不是原來的樣子了,它已經進行演化的過程了,繼承只是演化的手法之一種而已!為何需要演化?如同複雜系統的演化動機,為了讓系統獲取最大的價值,演化的驅力,其實是來至於環境的刺激(需求改變)。

生物學也是一樣,剛開始發現新生物時,或許我們並不知道它該如何歸類;直到發現它們與其它生物的共通點後,我們才會清楚它屬於什麼物種,這其實和設計抽象化類別的概念是一樣的概念啊!其實類別的設計只是實體(顆粒度)與關係(相依性)的取捨而已,類別會朝向問題領域(Problem domain)尋求最適解的演化。

然而Ringle Lai的用意,大概是要強調類別的由下而上的設計手法,而非結構化設計所習慣的由上而下的設計。由上而下的設計,在結構上若未能呈現出問題領域的關鍵,只是一味地採用繼承手法,卻是設計僵化的開始,因為缺少問題關鍵的設計,封裝必然不足,這樣的設計必須挖東牆補西牆或疊牀架屋才把軟體實作出來,但程式架構卻到處充斥著沒有必要的複雜度(Unnecessary Complex)

關鍵在抽象化!讓類別設計以簡御繁,力有未逮時再進行演化,類別設計基本觀念在於封裝,為了達成封裝的目的,交互運用兩種基本的手法來演化類別:

  1. 一般化的目的在以同樣之道去看待不同的實體-抽象化(封裝)
  2. 特殊化的目的則為相異之術去實現相同的概念-具體化(多型

前者為異中求同,後者為同中求異。

但至於是先抽象後具體,或後概念而先實現,那是不一定的;甚至會來回反覆多次,重構(變異/突變)是免不了的。務實的做法是:需求到那裡,就演化到那裡。

這正是易經所言:「窮則變,變則通,通則久」的道理。窮則變,相當於特殊化的做法;變則通,相當於一般化的做法;通則久,則相當於持續整合同中異、異中同。

演化的關鍵在於View,也就是面對問題對設計所抱持的觀點。然而「因無所住而生其心」,體會軟體設計的菩薩道,我們會抱持著「常見」-有需求產生所以我們會抱持特定觀點,此時態度是務實的,但執著於過去、現在與未來;但也可以抱持著「斷見」-無觀點的存在的,因為任何觀點都是無法執著的,此時態度是務虛的,不執著於過去與未來,但仍執著於當下;兩種觀點看起來似乎互相矛盾,但當我們悟透時,進入了「中觀見」的境界,也就是「不落有無」與 「不落去來」之中道空觀,這時就領會了軟體設計的「諸行無常,諸法無我,涅盤寂靜」三法印,此時並不會執著於虛與實,現在、過去與未來。

最後,回過頭來思考設計問題,以Ringle Lai舉的生物分類的例子來看,屬與種,到底是什麼關係呢?其實沒有關係!(斷見)

但沒有關係的話,怎麼解決問題領域呢?所以,他們之間必須有關係存在。(常見)

  1. 用一般化關係,代表我想要解決的問題是讓種與屬可以等同看待(種繼承屬,即代表可以以種取代屬)。
  2. 用結合關係,代表我想解決的問題是希望讓屬具有一般性的行為或屬性,而將特殊行為封裝成種,讓不同的種有一致性的行為操作。

P.S.以上只是眾多例子之二,Modeling的基礎,是建構在領域知識的認識,而非技術如何實作。

其實關係是因我的需求(因緣)而生,當需求不存在時,這種關係就自然破滅了。(中觀見)

總之,沒有問題就沒有設計,只有設計也無法解決沒有問題的問題。所以設計是因需求而調適的,沒有絕對的設計,而是要根據需求而演化。類別的演化,其實是存乎於設計者的巧思;然而,更重要的是由招熟而漸悟懂勁,由懂勁而階至神明

Please follow and like us:
分類: 分析設計建模, 設計原則, 軟體開發。這篇內容的永久連結

在〈類別設計演化論〉中有 15 則留言

  1. 自動引用通知: 同人的生活派對 » 軟體設計須面對現實

  2. 自動引用通知: 同人的生活派對 » 探討「用 real world 的直觀來認知 model」

  3. 自動引用通知: 同人的生活派對 » 類別到底是不是有機體?

  4. 自動引用通知: 同人的生活派對 » 軟體開發的沒問題症候群

  5. 自動引用通知: 同人的生活派對 » 物件導向繼承與程式碼的重用

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *