天天看點

《OOD啟思錄》—第1章1.1節革命家、改革家與面向對象範型

本節書摘來自異步社群《ood啟思錄》一書中的第1章1.1節革命家、改革家與面向對象範型,作者【美】arthur j.riel,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

第1章 面向對象程式設計的動因

ood啟思錄

1.1 革命家、改革家與面向對象範型

在學習面向對象範型以及相關知識的過程中,你首先必須知道我們社群中的很多對立觀點。每組對立觀點意味着兩個或者多個陣營,他們對自己的觀點一般都具有宗教般的熱情。最重要的對立觀點之一是革命家與改革家之争。革命家相信,有一群開發者某一天在淩晨3點醒來,并發現以前我們一直都在用錯誤的方式開發軟體。他們相信,他們找到了解決軟體危機的方法,并且把這種方法叫做“面向對象程式設計”。或許讀者已經猜到,我是屬于改革家陣營的。

改革家認為,面向對象程式設計不是軟體開發領域的革命,而是使得開發者遠離底層機器細節的持久進步中順其自然的一步。軟體危機的來源并不是我們在用錯誤的方法開發軟體,而是因為我們的程式設計範型已經不足以應付我們所需解決問題的日益增加的複雜性了。在處于隻有8條指令和1kb記憶體(而且這1kb中90%還被作業系統占據了)的年代,用八進制或者十六進制操作碼來寫程式是天經地義的。我使用這種程式設計方法毫無障礙,因為隻要記8條指令,要寫的代碼也不過30行。而當硬體變得更加強健,我開始遇到需要64kb記憶體的問題,這樣一來記憶操作碼就變得複雜,超出了我的掌控能力。于是,我開始使用彙編語言助記符。助記符範型非常完美,直到有一天我的問題再次超越它能容忍的複雜性上限。于是我改用進階語言來程式設計。進階語言的每條指令都能替換很多條彙編語言助記符,這樣我就能在更高層次上思考。除了減少語言複雜性,我也在尋找思考問題的更好方式。我不是把一串串的指令塞進小的函數再把這些函數拼成程式,而是用一種結構化的方法來把問題分割成小的子問題,每個子問題的複雜性都在可管理的範圍之内。

目前,軟體開發的發展又到達了臨界點。對于今天的硬體所能處理的問題的複雜性,結構化的、自頂向下的設計方法已經不足以應付了。我們需要找到一種軟體開發範型,它要可以應付增加的複雜性。幾年以前,菜單驅動的系統還廣為使用;今天的軟體系統已經必須具有圖形使用者界面,否則在市場上會乏人問津。在未來的幾年,消費者會期望可以與他們對話并顯示動态視訊的多媒體應用程式。作為一種應付更複雜的應用程式的方法,面向對象範型為什麼會引起那麼多關注呢?

最主要的原因之一是,遷移到面向對象範型可以讓開發者以更接近現實世界的模型來開發複雜的應用程式。在日常生活中,什麼是大家公認的特别複雜的東西呢?我們發現,很多以分布的方式彼此互動的機器構成了複雜的系統。并沒有中央控制機制來要求所有成員都彙報工作、聽取指令、完成指令并回來等着配置設定更多的工作。結構化方法是按照中央控制的思路設計的。而分布構架的優點在于,任何問題都隻會影響應用軟體的一個部分。在好的設計中,這個部分和其他部分應該是松耦合的。這樣,如果系統的一個部分出了問題,或者我們想擴充該部分,改變所帶來的影響就被局限在那個部分,而不會影響全局。既然分布的方式讓現實世界接受了這一切複雜性的存在,并且這些複雜的事物都得以順利運作,那麼為什麼我們不能以同樣方式來應對軟體問題的複雜性呢?

對象技術的初學者可能會遇到這樣的建議:“當你成為一個真正的面向對象開發者之前,你需要承受一次範型遷移(paradigm shift)。”雖然這似乎有些聳人聽聞,但“範型遷移”的說法有其内在真理。軟體開發者需要用分布的方式來思考,而不再遵照傳統結構化方法的集中控制方式。因為成功的現實世界實體是以分布的方式互動的。我認為,這一範型遷移不僅有其學習曲線,還有其遺忘曲線。你需要忘記你以前學到的面向動作(action-oriented)型軟體開發所依賴的集中控制的方式。

關于面向對象程式設計,無論你支援革命家的觀點還是改革家的觀點,你學習面向對象範型會遇到的第一件煩惱事就是充斥該領域的時髦詞語。例如,我們在本書中要讨論的一個相當簡單的概念叫做“多态”(polymorphism),一個具有希臘語詞根的單詞隐藏了一個簡單的概念。而且,這個概念還有很多同義詞,比如動态綁定(dynamic binding)、運作時類型識别(runtime-type discrimination[1])。而且還有很多用于修飾這些單詞的形容詞,比如“純的”(pure)多态、“真正的”(true)多态。面對這些,你很容易墜入迷惘之網。在新生領域,時髦詞語是一種流行病,因為待到技術逐漸成熟至能夠用标準語彙來準确表達該技術的概念,還需要相當長的時間。在面向對象領域中,這個問題更為嚴重,因為計算機科學的很多不同子領域不約而同地在向對象範型遷移,而每個子領域都有它們自己的一套術語。可能一個領域的人很高興地談論包含關系和繼承關系,另一個領域的人已經把這些概念分别稱作“has-a”和“a-kind-of”關系了。我估計,在不久的将來,時髦詞語的問題還會常伴我們左右,但等到這個領域成熟了,這個問題也就不複存在了。在這個過渡時期中,我将避免在本書中使用同義詞,除非我需要向使用者強調一些東西。

繼續閱讀