面向對象和面向過(guò)程的區別
★面向過(guò)程就是分析出解決問(wèn)題所需要的步驟,然后用函數把這些步驟一步一步實(shí)現,使用的時(shí)候一個(gè)一個(gè)依次調用就可以了。
★面向對象是把構成問(wèn)題事務(wù)分解成各個(gè)對象,建立對象的目的不是為了完成一個(gè)步驟,而是為了描敘某個(gè)事物在整個(gè)解決問(wèn)題的步驟中的行為。
例如五子棋,面向過(guò)程的設計思路就是首先分析問(wèn)題的步驟:1、開(kāi)始游戲,2、黑子先走,3、繪制畫(huà)面,4、判斷輸贏(yíng),5、輪到白子,6、繪制畫(huà)面,7、判斷輸贏(yíng),8、返回步驟2,9、輸出最后結果。把上面每個(gè)步驟用分別的函數來(lái)實(shí)現,問(wèn)題就解決了。
而面向對象的設計則是從另外的思路來(lái)解決問(wèn)題。整個(gè)五子棋可以分為 1、黑白雙方,這兩方的行為是一模一樣的,2、棋盤(pán)系統,負責繪制畫(huà)面,3、規則系統,負責判定諸如犯規、輸贏(yíng)等。第一類(lèi)對象(玩家對象)負責接受用戶(hù)輸入,并告知第二類(lèi)對象(棋盤(pán)對象)棋子布局的變化,棋盤(pán)對象接收到了棋子的i變化就要負責在屏幕上面顯示出這種變化,同時(shí)利用第三類(lèi)對象(規則系統)來(lái)對棋局進(jìn)行判定。
可以明顯地看出,★面向對象是以功能來(lái)劃分問(wèn)題,而不是步驟。同樣是繪制棋局,這樣的行為在面向過(guò)程的設計中分散在了總多步驟中,很可能出現不同的繪制版本,因為通常設計人員會(huì )考慮到實(shí)際情況進(jìn)行各種各樣的簡(jiǎn)化。而面向對象的設計中,繪圖只可能在棋盤(pán)對象中出現,從而保證了繪圖的統一。
★功能上的統一保證了面向對象設計的可擴展性。比如我要加入悔棋的功能,如果要改動(dòng)面向過(guò)程的設計,那么從輸入到判斷到顯示這一連串的步驟都要改動(dòng),甚至步驟之間的循序都要進(jìn)行大規模調整。如果是面向對象的話(huà),只用改動(dòng)棋盤(pán)對象就行了,棋盤(pán)系統保存了黑白雙方的棋譜,簡(jiǎn)單回溯就可以了,而顯示和規則判斷則不用顧及,同時(shí)整個(gè)對對象功能的調用順序都沒(méi)有變化,改動(dòng)只是局部的。
再比如我要把這個(gè)五子棋游戲改為圍棋游戲,如果你是面向過(guò)程設計,那么五子棋的規則就分布在了你的程序的每一個(gè)角落,要改動(dòng)還不如重寫(xiě)。但是如果你當初就是面向對象的設計,那么你只用改動(dòng)規則對象就可以了,五子棋和圍棋的區別不就是規則嗎?(當然棋盤(pán)大小好像也不一樣,但是你會(huì )覺(jué)得這是一個(gè)難題嗎?直接在棋盤(pán)對象中進(jìn)行一番小改動(dòng)就可以了。)而下棋的大致步驟從面向對象的角度來(lái)看沒(méi)有任何變化。
當然,要達到改動(dòng)只是局部的需要設計的人有足夠的經(jīng)驗,使用對象不能保證你的程序就是面向對象,初學(xué)者或者很蹩腳的程序員很可能以面向對象之虛而行面向過(guò)程之實(shí),這樣設計出來(lái)的所謂面向對象的程序很難有良好的可移植性和可擴展性。
還有一說(shuō)法~面向過(guò)程就像兩條生產(chǎn)不同類(lèi)型汽車(chē)的流水線(xiàn)
而面向對象則是生產(chǎn)出玻璃,底盤(pán)。。。。等等后再分給不同的汽車(chē)
面向過(guò)程、基于對象、面向對象,到底有什么區別?
我們可理解“純粹”的面向對象程序設計方法是什么樣的:
(1) 所有東西都是對象??蓪ο笙胂蟪梢环N新型變量;它保存著(zhù)數據,但可要求它對自身進(jìn)行操作。理論上講,可從要解決的問(wèn)題身上提出所有概念性的組件,然后在程序中將其表達為一個(gè)對象。
(2) 程序是一大堆對象的組合;通過(guò)消息傳遞,各對象知道自己該做些什么。為了向對象發(fā)出請求,需向那個(gè)對象“發(fā)送一條消息”。更具體地講,可將消息想象為一個(gè)調用請求,它調用的是從屬于目標對象的一個(gè)子例程或函數。
(3) 每個(gè)對象都有自己的存儲空間,可容納其他對象?;蛘哒f(shuō),通過(guò)封裝現有對象,可制作出新型對象。所以,盡管對象的概念非常簡(jiǎn)單,但在程序中卻可達到任意高的復雜程度。
(4) 每個(gè)對象都有一種類(lèi)型。根據語(yǔ)法,每個(gè)對象都是某個(gè)“類(lèi)”的一個(gè)“實(shí)例”。其中,“類(lèi)”(Class)是“類(lèi)型”(Type)的同義詞。一個(gè)類(lèi)最重要的特征就是“能將什么消息發(fā)給它?”。
(5) 同一類(lèi)所有對象都能接收相同的消息。這實(shí)際是別有含義的一種說(shuō)法,大家不久便能理解。由于類(lèi)型為“圓”(Circle)的一個(gè)對象也屬于類(lèi)型為“形狀”(Shape)的一個(gè)對象,所以一個(gè)圓完全能接收形狀消息。這意味著(zhù)可讓程序代碼統一指揮“形狀”,令其自動(dòng)控制所有符合“形狀”描述的對象,其中自然包括“圓”。這一特性稱(chēng)為對象的“可替換性”,是OOP最重要的概念之一。
一些語(yǔ)言設計者認為面向對象的程序設計本身并不足以方便解決所有形式的程序問(wèn)題,提倡將不同的方法組合成“多形程序設計語(yǔ)言”
面向對象其實(shí)是現實(shí)世界模型的自然延伸?,F實(shí)世界中任何實(shí)體都可以看作是對象。
對象之間通過(guò)消息相互作用。另外,現實(shí)世界中任何實(shí)體都可歸屬于某類(lèi)事物,
任何對象都是某一類(lèi)事物的實(shí)例。如果說(shuō)傳統的過(guò)程式編程語(yǔ)言是以過(guò)程為中心以算法為驅動(dòng)的話(huà),
面向對象的編程語(yǔ)言則是以對象為中心以消息為驅動(dòng)。用公式表示,過(guò)程式編程語(yǔ)言為:程序=算法+數據;
面向對象編程語(yǔ)言為:程序=對象+消息。
面向對象要完全支持封裝、繼承和多態(tài),如C++和Java;而基于對象只要支持封裝就可以了,如VB6.0。
in object theory, OO is seperated to object-based and class-based world.
Java, C++, C# are class-based. You have class to describe your object.
object-based language does not have class. What you have is simply objects.And you may use prototype to clone objects.(modern object-based languages utilize prototype and traits,which make them more and more like class-based language)
I feel python is kind of an object-based language.面向對象,將軟件程序的元素構造成對象,指定對象類(lèi)型,表示對象屬性,和描述對象方法,
定義對象后即可用于創(chuàng )建這種
類(lèi)型的對象的具體實(shí)例并構造其他更復雜的對象類(lèi)型。
基于對象的編程語(yǔ)言,并不支持所有面向對象的功能,往往基于對象只提供一部分面向對象的功能,
有時(shí)加入自己的新功能。
例:java是面向對象的程序設計語(yǔ)言,JAVASCRIPT是基于對象的程序設計語(yǔ)言(腳本語(yǔ)言)
,javascript并不支持所有
java面向對象的功能,致使支持其中一部分!
按照傳統的思想,面向對象和基于對象之間的界限可以說(shuō)是既清楚又模糊。說(shuō)它清楚,
是因為面向對象語(yǔ)言必須從語(yǔ)法上直
接支持繼承和動(dòng)態(tài)綁定,也就是虛函數機制。說(shuō)它模糊,是因為基于對象的語(yǔ)言可以
在沒(méi)有語(yǔ)法直接支持的情況下,達成與
面向對象語(yǔ)言相同的效果。舉個(gè)例子,在很多用C語(yǔ)言寫(xiě)成的操作系統里,“File”這個(gè)概念,
既可以代表磁盤(pán)文件,也可
以代表串行口,還可以代表各種各樣的設備,這不是多態(tài)性是什么?
有一個(gè)概念大家必須改變,就大部分當前項目而言,C語(yǔ)言已經(jīng)是一種基于對象甚至面向對象的語(yǔ)言,
而不是單純的“面向過(guò)程”
語(yǔ)言,例如在Win32 API編程中,實(shí)際上我們就是在按照面向對象的模式撰寫(xiě)程序。
另外,最經(jīng)典的基于對象語(yǔ)言是Ada83。
按照我現在的體會(huì ),面向對象這個(gè)概念,更多的是說(shuō)一種環(huán)境和一種設計思維方式。要談這個(gè)問(wèn)題,實(shí)在需要不少篇幅,
這里就不多說(shuō)了。
Object-oriented支持Polymorphism,而Object-based不支持Polymorphism.主要的區別就在于此。
支持多態(tài)的代價(jià)是額外的間接性--
不論是在“內存的獲得”或是在“類(lèi)型的決斷”上。
C++通過(guò)class的pointers和references來(lái)支持多態(tài),這種程序設計風(fēng)格就叫面向對象。
C++也支持具體的ADT程序風(fēng)格,被稱(chēng)為基于對象,它只支持封裝,不支持類(lèi)型的擴充。
一個(gè)Object-based設計可能比一個(gè)對等的Object-oriented設計速度更快而且空間更緊湊。
速度快是因為所有的函數引發(fā)操作都在編譯時(shí)期解析完成,不需要設置virtual機制;
空間緊湊則是因為每一個(gè)class object不需要負擔傳統上為了支持virtual機制而需要的額外負擔。
不過(guò),Object-based設計比較沒(méi)有彈性。
這是引用《深度探索C++對象模型》上第一章最后幾段的話(huà)。上面有更詳細的討論!
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。