1. 程式人生 > >面向過程與面向對象的本質區別-對面向過程與面向對象的一點感悟

面向過程與面向對象的本質區別-對面向過程與面向對象的一點感悟

層次 包括 感悟 兩種 上進 detail 計算 行為 向上

面向過程與面向對象的本質區別

一位計算機界的大師曾說過,“我認為,面向對象的目標從來都不是復用和擴展,而是提供一種處理復雜問題的方法”。

面向過程講究自頂向下逐步求精。找到一個系統的入口然後順藤摸瓜,分析出每一步以及影響這一步的其他因素,我們就能夠定義這個系統。

面向對象認為世界是有很多對象組成的,各個對象之間相互獨立,平時並沒有什麽關系。在某些外力的作用之下對象之間相互協作,表現出一定的行為,最終塑造了這個復雜的世界。面向過程和面向對象都是人們認識和了解這個世界的手段和方法,並無優劣之分,只有是否適用之差別。

面向對象和面向過程的最根本區別就是提供了一種新的認識和了解復雜系統的方法。面向對象有一個術語:抽象層次。比如對一輛汽車來說,從整體上來看,它是由底盤、懸掛、發動機、變速箱、外殼等部件組成的。而從發動機這個抽象層次來看,它是由活塞、曲軸、連桿、火花塞、油底殼、缸壁等組成。不同的抽象層次上會有不同的認識。通過不斷變換抽象層次,我們能對系統有個更好的認識。在每個層次上我們只需要關心當前層次上的對象和它們之間的交互。其他層次上的東西,與本層次無關。這樣帶來的好處是:無論出於哪個層次上,我們都面臨有限的對象和復雜度,從而可以更專心的了解這個層次上的對象是如何工作的。通過不斷分離關註點,達到降低復雜度的目的。

抽象層次的另一個好處就是更換低層次的零件不會對高層次進行影響。比如,更換全新的發動機之後不會導致汽車無法行駛,更換火花塞之後不會導致發動機無法運轉。低層次的信息對高層次隱藏,高層次不知道也不想知道低層次的零件如何工作。

回到大師的話,面向過程需要分析出整個系統的所有細節,當系統規模足夠復雜,復雜到了超越其處理能力,使用結構化程序設計常常有無處下手的無力感。采用面向對象方法,引入了有個抽象層次的概念,我們就能通過不斷提升抽象級別來構建更大更復雜的系統。

抽象層次越高,具體信息越少,細節也就越少,也就越容易理解。而抽象層次越低,具體信息越多,細節也越多。細節越多越容易陷入枝枝葉葉的泥潭而無法自拔。一旦超越人腦的處理極限,就很難去理解了。人們認識事物總是習慣從表面到本質,由表及裏的一步步去分析。剛認識一件事物時我們可以從外觀、整體較高的抽象層次去認識,然後逐步深入。比如對一個不了解汽車的人講汽車,我們可以從整體介紹汽車包括底盤、發送機、變速箱、懸掛等。這時我們的抽象層次是很高的。當介紹清楚之後,我們可以深入到下一個層次,比如講發動機結構。在發動機結構講清楚以後,我們在從力學、熱學的角度講述發動機的工作原理。這樣逐步深入,結構清晰,聽的人也容易理解。逐步的深入中我們的抽象層次是逐漸降低的。反過來如果上來就講發動機工作原理,聽的人必定一頭霧水。上面這個由表面到機理的過程其實就是自頂向下方法。另一種方法是自底向上。先從內部、底層講起,逐步提高抽象層次。

這兩種方法都是分析、研究問題的方法。在軟件開發過程中,主體上應該采用自頂向下的方法,用少量的概念抽象、概括系統,再逐步降低抽象層次,直到代碼編寫。同時輔以自底向上的方法,通過總結在較低抽象層次的實踐經驗,來改進較高層次的概念以提升軟件質量。

抽象層次高了,具體信息越少,分析問題簡單了,但是隨之而來也會帶來另一個問題:抽象層次太高。抽象層次太高具體信息太少,又會導致信息量不足。所以在面向對象的分析過程中,在適當的時候選擇適當的抽象層次是十分重要的。

層次確定好了,接下來就是在該層次上進行面向對象的分析工作了。無論任何時候在同一個抽象層次上,都應當將對象看成一個不可分割的整體。無論對象的規模多麽大,大到一個國家、一座工廠,只要我們認為它是對象,它與其他對象交互時就是一個整體,不能分割。這就是說的對象的原子性,一旦破壞了原子性,就表示在同一抽象層次上 的對象不具備同一粒度,就將使得分析工作陷入混亂 。

在分析工作中,應該牢記對象有一個邊界,不應該打破邊界去窺探對象內部。形象一點來說,對象看上去就像是一個雞蛋,蛋殼就是雞蛋的邊界。在分析對象的過程中。對雞蛋的所有關系都是通過蛋殼發生。如果我們試圖了解對象內部的細節,就像打破蛋殼去窺探雞蛋內部,內部一團黏黏糊糊,無從下手。

在分析過程中得到的所有對於對象的認識都是依賴於對象的邊界,在實現這個對象之前不要去理會其內部細節。這被稱為面向接口編程。

http://blog.csdn.net/lan_liang/article/details/6619430

面向過程與面向對象的本質區別-對面向過程與面向對象的一點感悟