大千世界,萬事萬物,對映到我們的大腦中,形成了色彩斑斕、奇幻玄妙的思想世界。當我們想把這種思想用軟體的方式表達出來時,我們面臨著很多中選擇:是面向物件、面向過程、面向函式還是面向方面(Aspect oriented Programming)?
由於當前的程式語言都是英文的,外國程式設計師程式設計不就是在說母語麼?我們國家軟體技術發展得晚,還沒有按照中文詞彙和語法的程式設計方法和工具,也只能跟著說英語。但中文和英文在詞彙和語法方面存在不小的差異,所以程式設計師理解起來也會存在一些問題,久而久之,就把這種程式設計思路和方法弄得有些玄乎其神了。
面向過程存在的問題
企業資訊處理程式最早是面向過程的程式,因為軟體是模擬人的思維過程,所以利用面向過程的思路來處理程式順理成章。由於最開始還是打孔紙帶式的計算機,程式量也很小,所以效率還比較高。但隨著軟體變得越來越龐大,面向過程思想逐漸變得難以駕馭,工程化難度很大。面向過程的軟體結構像一個複雜的迷宮,其間到處遍佈goto語句,這些跳轉語句就像遊戲中神秘的傳送門一樣,你永遠不知道下一站在哪裡。
面向過程往往使程式設計師不用系統地思考完整的需求,但在程式中完整地復現了人類思維過程的雜亂無章,其中程式碼被無節制地複製和更改,重複的程式碼量大大增加,原來自己編寫的程式讀懂難度都很大。
面向物件的歷史
面向物件在西方有著非常深刻的哲學基礎,也是西方近代科學產生的重要原因,內容也比較多,我們以後再詳細分析。
針對面向物件產生的問題,1972年美國計算機學家艾倫.凱(Alan Key)發明了面向物件的軟體開發架構。艾倫的本科讀的是生物學,博士導師是被稱為"計算機圖形學之父”的David Cannon Evans和Ivan Sutherland兩位大神,後者的博士導師是大名鼎鼎的夏農。在計算機領域,經常看到這樣學術傳承,一縷一大串,都是圖靈獎都是熟人。從這也看出了咱們國家要想在計算機方面立足,還有很長的路要走。
這是一種由生物細胞領域概念啟發而形成的架構方法,艾倫發現了在細胞領域中存在一些有趣的規律:首先,所有個體細胞都會遵從細胞這個類別元素的共同的行為模式;其次,每一個細胞都是一個獨立的個體,細胞之間透過傳遞化學物質訊號和電訊號能夠進行通訊,根據所收到的資訊調整自身的行為和策略;第三,細胞會進行分化,從原來的一個細胞分化成不同類別的細胞,進而形成各種器官。受到這些細胞特性的啟發,艾倫發明了面向物件的分析和設計方法。
結合這些特點,艾倫發明了Smalltalk ,這種語言被設計為一個完全動態的系統,其中可以動態地建立和修改類。
面向物件的本質
面向物件與其說是一種設計方法,更像是一種理解世界的角度。類別、屬性、聯絡和是三個重要方面。聯絡和組成的概念更為複雜一些,例如SQL和知識圖譜就是致力於研究事物之間的關聯,我們有機會再另外詳細說,今天我們重點來講講類別和屬性。
面向物件的本質是本體論
面向物件的核心是本體論。本體類的核心就是分類,也就是我們詞語所指之“物”。當我們說杯子的時候,我們說的其實不是哪一個具體的杯子。我們說的是脫離了時間和空間之外的那個杯子,這種本體論古希臘人都搞明白了,可惜中國古代沒有這種本體思想。
「博士聊IT」一文看懂程式設計的本質,程式設計師有前途麼?
比如我們說今天很熱,我們翻譯過來肯定是想說Today is hot。但是這裡我們就錯誤地把今天作為主語了,其實今天應該是時間副詞。英語會翻譯成It is hot today這裡的It指的是天氣,也就是熱的主體。
本體(Ontology)、分類(Class)、概念(Conception)、集合(Set)和名詞(Noun)其實是一回事,都指的是你腦海中的那個概念。這是人類理解世界的根本,就從哲學觀點上來看,這是我們認識世界的方式。
我們的生物需要分類,就是門、綱、目、科、屬、種;法律需要分類,輕度傷害、重度傷害量刑不同;社會管理要分類例如不同企業上不同的稅;產品需要分類,不同的產品有不同的引數.......我們思想和語言交流的基礎就是分類。
事實上我們說的每一個名詞都是一個分類,當加上編號或者定冠詞就變成例項了。那我們我和當我們區分例項的話,不特指的時候直接用複數或者要加上不定冠詞“a”表示這分類,特指例項的時候要加上“the”。
分類決定屬性,一個分類的屬性有兩種來源:從父類那兒繼承的和自己特殊的。當然這個分類也會有孩子繼承他的屬性。
分類決定方法,道理是一樣的,不一樣的類可以有不同屬性。重寫是一種繼承中的變異,大規模重寫就沒必要分類了;多型是對方法的封裝,以便模糊呼叫,
在實際中,操作分類、屬性和繼承關係的難度很大。我們很多程式設計師討厭繼承,覺得繼承對程式靈活性沒好處,根本上是我們對業務沒有系統化掌握,導致業務和技術架構總是變化。一個真正領域業務架構專家是不會總去更改系統類別結構的。
對於成熟和不成熟的業務可以分開處理,成熟了就分類,不成熟就都分扁平類,階段性認識清楚了再重構,這樣能更好地完成開發。
類比是認識世界的方法
類別決定了基本特徵的繼承,許多非常抽象的事物透過類比和歸類的方式能夠迅速帶給人非常清晰的印象。例如一部電影在前期策劃時,導演需要和投資方、製片人交流,還需要和演員、道具、服裝、音樂等多個專業部門打交道,大家都想知道自己工作目標是什麼。這時導演的類比能力就顯得非常重要,例如電影《異形》在拍攝前,大家都不知道導演到底想要拍什麼,導演斯皮爾伯格說我要拍一部太空版的《大白鯊》,神秘、恐怖、壓抑、陰暗的氣氛迅速湧現出來,只不過場景是在太空中。於是各個崗位立刻都明白自己的工作該做什麼了。
在好萊塢吳宇森的電影已經形成一種特殊類別,被稱為“Woo movie”,提到這個風格的電影,大家腦海中就會聯想到兄弟情、槍戰、白鴿、風衣等場景和物件。所以類別是人類形成思想概念的重要因素。僅有類別還不夠,還要把這個類別的屬性準確地描述出來,才能更好勾畫出這個個體的特徵。
面向物件的意義不僅僅是我們觀察世界的條理更清晰,更為重要是的,這種方法還把事物的內在機理和外在表現進行了分割,使得程式設計師之間的大範圍協作成為可能。
這就是我們說的“封裝”。
我們會使用手機,可是我們不知道手機和基站是如何通訊的,也不需要知道手機是如何製造的,我們需要知道的是手機如何操作就可以。這樣程式設計師就可以像蓋房子一樣,使各種有明確功能和使用介面程式拼接起來,而不用深入研究其機理,並且能夠保證最終整合起來的程式具有較高的質量水平。
這就是面向物件。面向物件的方法能夠讓世界更有條理。我會在後續從哲學思想、物件關聯和物件組成幾個方面再做單獨的介紹。
這裡是【博士聊IT】,感興趣請加關注。
「博士聊IT」一文看懂程式設計的本質,程式設計師有前途麼?
中國為什麼沒有自己的程式語言?哲學、數學和語言學基礎是關鍵
「博士聊IT」資訊化是買不來的!特斯拉為啥不用SAP
「博士聊IT」資訊化建設效率為啥這麼低?一文看透本質