天天看點

面對過程和面對象的最大差別與比較(初學者)

記得剛開始學習面對對象語言(JAVA),感覺不到面向對象與面向過程有什麼差別和什麼好處,隻覺得書本上的對面對對象聲稱的好處:封裝,繼承,多态都很模糊。相信很多初學的都會有和我一樣的感覺吧。

面對對象的語言的出現,是在對軟體的快速開發要求的背景下出現的,它的目的就是使得軟體開發的效率更快,軟體開發的工作量更少,軟體的擴充性更好(利于對軟體的再次修改,完善)。這些都是面對對象所帶來工作上的優勢,是以大型的系統會盡可能使用面對對象語言來開發的理由也是在這裡了。

開始接觸面向對象的人,都感覺不到面對對象和面對過程有什麼不同,感覺就是多了了類這個概念。這可能是由于面對對象是通過調用已經寫好類的方法,面對過程的是調用庫的方法很相同,因為這點兩種語言太相似了,一開始我也陷入這個點上,錯誤地以為面向對象就是調用類的方法,面向過程就是調用庫的方法,兩者沒有什麼差別,這是對面對對象中的對象沒有去思考對象與過程的差別所造成的,也是缺乏實踐經驗,代碼寫得少所造成的。

站在馬克思高度上看,面對對象和面向過程的最大思想差別就是面向對象是先站在對象的角度來分析問題的,面向過程是面對問題一開始就尋找解決解決問題的步驟是怎麼樣的。

舉例:坐電梯這件事情,用面向過程的思想:電梯啟動,有人選擇坐電梯上樓,這人在電梯外選擇電梯是向上還是向下,然後等待電梯的過來,電梯到來的時候,電梯門打開,人進入電梯,選擇所要去的樓層,電梯關門,電梯到達指定的地方,門打開,人走出電梯,坐電梯的過程結束。這就是坐電梯的一個過程,也是解決的步驟。

同樣用面向對象的思想來思考解決這件事情的時候,就不是一上來就是問題的方法和過程,而是看與所要解決的問題有哪些對象(有哪些事物,實體),我們這個坐電梯的問題,裡面包括的對象有:需要坐電梯的人,為人服務的電梯,還有一個就是樓層;接着,我們要找去這些對象中有哪些屬性,行為與我們所要解決的問題有聯系:電梯的屬性有:現在樓層号,啟動狀态(關閉,空閑,繁忙),行為有運送。人的行為有:等待電梯,選擇電梯運動方向,選擇電梯的去哪一樓層。樓層這個對象的屬性就是樓層号。相信看到這裡,你應該看到了面向過程和面向對象的思想是有多大的不同了吧。分析問題時先看到的是對象,還是過程,我認為這是兩種語言的思想上最大的差別。

講了一大堆,又要回到我們一開提出始面對對象提出的優點。上面的電梯,我們分析了這過程的有哪些對象,并且進行了封裝,這樣,我們就可以重用我們封裝的對象了,而面向過程,把這個過程寫成了一個對程,很明顯不利于重用,修改時需要了解的代碼要比面向對象的要多,不利于擴充,原因是坐電梯過程我們寫成了一過程,代碼的前後耦合度很高,一改而動全身。

寫到這裡,我發現這個坐電梯例子,對于講解面對對象的另外兩個特點并不是很合适。不過,繼承,多态的特點,能起到重用代碼,與提高代碼擴充性。舉例:學校裡的老師和學生上課。這件事,我們得到學生,老師這兩個對象,這兩個對象都有一個共同的行為:上課。多态的作業就是展示其重要的魅力了,還記得面對對象中的接口吧,我們可以建立一個包含了“上課”方法的接口,讓學生和老師都來實作這個接口中的“上課”方法,這時候會出現一個面向過程很難達到的效果,在程式中我們隻要新建立一個人(老師或學生),隻要把它轉為接口類型,我們就會看到不同的效果,要是老師老師就會開始上課課,要是這個接口轉換之前為學生,就會開始上課聽講,就是說同一個方法,不同的對象調用時産生不同的反應,這就是多态了,是不是很神奇!多态同樣是有利于代碼的可擴充性的,現在學校的實體多了一個:學校的上司,隻要讓學校的上司也實作有“上課”方法的接口,同樣我們在調用“上課”的時候隻要這個對象原來是上司這個實體轉換而來的,就會執行上司的“上課”的方法:在教學樓周圍遊蕩,看哪個班上課的情況最亂。代碼的擴充性在多态的影響下,可以說擴充性非常的強,代碼非常的靈活。

繼承也是面對對象很重要的一個特點,同樣是能達到代碼的重用,可擴充性,這裡就不談了!