當我們在高中開始開始學習像C語言這樣子的程式語言時,物件導向的C++還是個很新鮮的新潮玩意兒,當時能用C編寫程式已經很時髦了,更別提物件導向這種在國內還是很少人熟悉的新式思維了。記得到了大學時期,一時之間風起雲湧,物件導向成了顯學。

或許是拜摩爾定律之賜,硬體機能跨越了某個門檻,或許也因為C++這個語言兼具效能與物件導向精神之長(雖然它不是第一個物件導向程式語言),使得物件導向的設計方式逐漸開始廣為世人所接受。

物件導向的觀念崛起,成為程式開發領域的普世價值
在C++之後,物件導向程式語言如雨後春筍般一一崛起,也一一攻占開發者的市場,時至今日,我們所熟知的開發語言,除了C++之外,舉凡Java、C#、Objective C、Ruby、Python、Visual Basic、……等等,也都是物件導向式的程式語言。雖然開發者市場上,使用非物件導向式程式語言的開發者還是大有人在,但是,物件導向成為重要的主流,那是不言可喻的了。

所以在坊間的書店架上,處處都可以看的到「物件導向」四個字。這是因為,在那個時間點,正是大批已經熟悉程序式程式設計方式的程式設計者,正開始試著接觸這新的設計思潮的時候。大家對於物件導向的設計方法感到好奇,也有諸多的期待。

當然,程式設計書籍若是不冠上「物件導向」四個字,恐怕很難吸引讀者的目光。即使是在內容中物件導向的部份僅佔少數,或甚至無甚關係,例如只是講解特定程式語言的語法,而不涉及物件導向的設計觀念,書名也是要硬把「物件導向」加上去,以便帶來更多的關注。

不僅出版的技術書籍如此,當時許多技術作者所撰寫的文章,以及人們在網路討論區上的討論,物件導向設計的種種議題,都是眾人關心甚至是論戰的焦點。

這麼多年過去了,我在想,不知道其他人會不會和我一樣覺得「物件導向」受到矚目的程度已不若往昔?探究這原因,究竟是為什麼呢?

我想,這絕對不是因為物件導向的設計方法和觀念已經式微,而是這些設計方法及觀念,已經成為了大家所習以為常的主流方法,已經是眾多開發者在日常的開發生活中不可剝離的一部份。就像陽光、空氣、和水一樣,我們很少特別地感受、提到它們,但是它們卻是維持生命所需的重要元素。

程式人接受物件導向的歷程
在十幾年前,即使所使用的是C++的編譯器或整合開發環境,還是有很多人利用C++這個物件導向程式語言,以程序式的方式來撰寫程式。當然,這是C++語言本身在設計時,即希望程式設計者能如此運用的,因為它本來就是個程序式及物件導向式混合的程式語言。

但是,在當時,要寫出純粹、「道地」的物件導向程式,並不是一件那麼容易的事情,因為不少程式設計者在概念上受到傳統程序式設計方法的拘束,無法跳脫,轉成以物件導向式的方式來思考解決問題的設計。所以,即使他們對物件導向的設計方法所能帶來的好處有所期待,也嘗試著運用物件導向程式語言來進行設計,但是因為未能充分表現出物件導向的設計風格,終究是無法從中得到太多利益。隨著程式設計者逐漸了解物件導向的設計特性,也隨著新世代的程式設計者在初接觸程式設計者時,有很高的比例都直接接受物件導向設計觀念的洗禮,當然也拜物件導向語言躍居主流地位的影響,現今的程式設計者早已視運用物件導向設計方法為當然,甚至很多時候是預設的選項。

現在的我們不像二十年前、十幾年前那樣強調「物件導向」,因為早就已經融入我們的開發生活中了。在以前,我們會特別留意自己,或是其他人所寫出來的程式碼,是否具有物件導向的精神,是否有物件導向的「風味」,但現在我們很少這麼做了。

回首這麼多年來我們對於物件導向設計方法的態度,從一開始把它當做是一個新思維在研究、在探索,努力在開發生活中應用它,甚至有點過了頭地強調。

我們逐漸熟悉它的特性,明白它的優點和缺點,理解了在那些層面上我們對它期待過高,也理解了它對開發工作實際上所能帶來的效益。

就像在一開始,人們對物件導向中的「繼承」概念期待過高,也著墨太深。

在那個年代,我所認識的物件導向設計者,他們所寫下的程式碼,攤開來大多洋洋灑灑地盡是繼承體系關係,好像如果不多用點繼承,自己的程式就不那麼「物件導向」了。

事實上,經過這麼多年的體驗,開發者都逐漸明白繼承的概念雖然很有想像空間,它的比喻也很有威力,但是在實用上的限制不少,功用也有所局限,並不像最初人們所期待的那樣高。到了今天,我們或許會在應用程式框架或程式庫中,看到不少繼承的運用,卻很少在應用程式的層級上看到太多的繼承,這就是物件導向的想法從被期待的階段,進展到務實的階段的現象。

另一方面,人們不會過度強調物件導向,但更深層落實物件導向觀念中的各種重要精神。

就像資料的抽象化,人們已經習慣用抽象化的方式來表達資料,尤其是將資料個體分別以「屬性」,以及「操作」的方式,來表述的設計方式,早就深植人心。

人們也深刻體會到資料封裝以及資訊隱藏的重要性,也明白如何透過物件導向程式語言的支持,更輕易做到資料封裝及資訊隱藏。現在,很多人即使不使用物件導向程式語言,無法得到語言對這些特性的支持,也還是會在概念上自行體現資料封裝及資訊隱藏的精神,自然而然可以得到它們所能帶來的好處。

並不是每個開發者都會那麼經常運用到多型,但是應用程式框架或是程式庫的設計,多半都會運用多型的機制,允許應用程式的開發者更輕易的進行功能的擴充,在一個核心的原則上,產生出實務應用的各種變化,而這也正是多型的精神所在。多型的威力已經充分被各應用程式框架或程式庫所應用,也讓廣大的應用程式開發者獲益。

設計模式當中的許多概念與技巧,來自物件導向
更重要的是,從物件導向的基本觀念裡,我們更進一步發現很多特質對程式設計是很重要的,例如,透過抽象化的介面來隔離實作是很重要的,因為,這麼做可以幫助我們遠離變動所造成的衝擊。又好比,我們也更重視程式碼間的相依性關係,會更願意透過梳理程式碼間的相依性,來避免它們之間的連帶交互影響,而得到更好的設計。

很多想法不是在物件導向的想法裡才有,但物件導向想法的流行和成為主流,也同時幫助了這些想法的推廣。從「設計模式」受到廣泛運用,我們可以看到很多好的設計概念和技巧,都是基於物件導向的觀念而來。

物件導向的想法已經在眾多開發者的開發生活中生根,並且更深層地融入,我們把這些想法在實務中應用,不再當做一種新思潮,而是會在實戰中不自覺間自然運用的。對現在的開發者而言,物件導向的概念和技巧的確已成陽光、空氣和水,對生活來說很重要,卻不自覺,因為更融入生活了。

 

作者簡介


Advertisement

更多 iThome相關內容