面向對象和面向過程的區別
C是面向過程C++、 JAVA是面向對象面向對象和面向過程的區別一個博大,一個精深.總體而言,面向對象簡單,面向過程對人員要求素質過高面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了。面向對象是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。艾蘭.庫伯的《軟體創新之路》中提到:面向過程和面向對象的區別並不像人們想像得那麼大面向對象的大部分思想在面向過程中也能體現但面向過程最大的問題(也許是唯一先天的缺陷)在於隨著系統的膨脹,面向過程將無法應付,最終導致系統的崩潰面向對象的提出正是試圖解決這一軟體危機目前看來,似乎有一定成效但仍任重道遠---------------------------------------------------------------做一些對比來說吧:分析 基本構件 方法 工具---------------------------------面向過程 基於演算法 函數/過程 數據流圖、偽代碼... ...面向對象 基於對象 類 UML建模... Rose,viso等---------------------------------------------------------------其實我始終認為,不管是面向對象,還是面向過程,都體現了一種軟體重用的思想!只不過面向過程中重用的是過程和函數,但是面向對象重用的是類,一種將數據和處理數據的過程及函數封裝在一起的實體,其實面向對象中的過程和函數和面向過程中的分別不是很大,所以數據流圖和偽代碼還是有用的。面向對象一個很大的好處就是數據 和方法的封裝,由此面向對象的三大特性得到發揮什麼是面向對象 面向過程 面向事件2010-06-05 11:26
|
關於面向過程及面向對象編程2010-06-10 10:00
從事軟體開發的人可能同時用過面向過程及面向對象的編碼,例如JAVA、C++、C#均是面向對象的語言、C語言是面向過程的語言、PHP既支持面向過程也支持面向對象的功能,面向過程及面向對象均有自己的優缺點,也均有自己的適用範圍。 面向過程 優點:性能比面向對象高,因為類調用時需要實例化,開銷比較大,比較消耗資源;比如單片機、嵌入式開發、Linux/Unix等一般採用面向過程開發,性能是最重要的因素。 缺點:沒有面向對象易維護、易復用、易擴展 面向對象 優點:易維護、易復用、易擴展,由於面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統更加靈活、更加易於維護 缺點:性能比面向過程低 面向對象程序設計的一些顯著的特性包括: .程序設計的重點在於數據而不是過程; .程序被劃分為所謂的對象; .數據結構為表現對象的特性而設計; .函數作為對某個對象數據的操作,與數據結構緊密的結合在一起; .數據被隱藏起來,不能為外部函數訪問; .對象之間可以通過函數溝通; .新的數據和函數可以在需要的時候輕而易舉的添加進來; .在程序設計過程中遵循由下至上(bottom-up)的設計方法。 面向對象程序設計在程序設計模式中是一個新的概念,對於不同的人可能意味著不同的內容。我們對面向對象程序設計的定義是"面向對象程序設計是一種方法,這種方法為數據和函數提供共同的獨立內存空間,這些數據和函數可以作為模板以便在需要時創建類似模塊的拷貝。這樣的程序設計方法稱為面向對象程序設計。" 從以上定義可以看到,一個對象被認為是計算機內存中的一個獨立區間,在這個區間中保存著數據和能夠訪問數據的一組操作。因為內存區間是相互獨立的,所以對象可以不經修改就應用於多個不同的程序中。 什麼是面向對象程序設計? 面向對象程序設計(OOP)技術汲取了結構化程序設計中好的思想,並將這些思想與一些新的、強大的理念相結合,從而給你的程序設計工作提供了一種全新的方法。通常,在面向對象的程序設計風格中,你會將一個問題分解為一些相互關聯的子集,每個子集內部都包含了相關的數據和函數。同時,你會以某種方式將這些子集分為不同等級,而一個對象就是已定義的某個類型的變數。當你定義了一個對象,你就隱含的創建了一個新的數據類型。 對象 在一個面向對象的系統中,對象是運行期的基本實體。它可以用來表示一個人或者說一個銀行帳戶,一張數據表格,或者其它什麼需要被程序處理的東西。它也可以用來表示用戶定義的數據,例如一個向量,時間或者列表。在面向對象程序設計中,問題的分析一般以對象及對象間的自然聯繫為依據。如前所述,對象在內存中佔有一定空間,並且具有一個與之關聯的地址,就像Pascal中的record和C中的結構一樣。 當一個程序運行時,對象之間通過互發消息來相互作用。例如,程序中包含一個"customer"對象和一個"account"對象,而customer對象可能會向account對象發送一個消息,查詢其銀行帳目。每個對象都包含數據以及操作這些數據的代碼。即使不了解彼此的數據和代碼的細節,對象之間依然可以相互作用,所要了解的只是對象能夠接受的消息的類型,以及對象返回的響應的類型,雖然不同的人會以不同的方法實現它們。 類 我們剛才提到,對象包含數據以及操作這些數據的代碼。一個對象所包含的所有數據和代碼可以通過類來構成一個用戶定義的數據類型。事實上,對象就是類類型(classtype)的變數。一旦定義了一個類,我們就可以創建這個類的多個對象,每個對象與一組數據相關,而這組數據的類型在類中定義。因此,一個類就是具有相同類型的對象的抽象。例如,芒果、蘋果和桔子都是fruit類的對象。類是用戶定義的數據類型,但在一個程序設計語言中,它和內建的數據類型行為相同。比如創建一個類對象的語法和創建一個整數對象的語法一模一樣。 數據抽象和封裝 把數據和函數包裝在一個單獨的單元(稱為類)的行為稱為封裝。數據封裝是類的最典型特點。數據不能被外界訪問,只能被封裝在同一個類中的函數訪問。這些函數提供了對象數據和程序之間的介面。避免數據被程序直接訪問的概念被稱為"數據隱藏"。 抽象指僅表現核心的特性而不描述背景細節的行為。類使用了抽象的概念,並且被定義為一系列抽象的屬性如尺寸、重量和價格,以及操作這些屬性的函數。類封裝了將要被創建的對象的所有核心屬性。因為類使用了數據抽象的概念,所以它們被稱為抽象數據類型(ADT)。 封裝 封裝機制將數據和代碼捆綁到一起,避免了外界的干擾和不確定性。它同樣允許創建對象。簡單的說,一個對象就是一個封裝了數據和操作這些數據的代碼的邏輯實體。 在一個對象內部,某些代碼和(或)某些數據可以是私有的,不能被外界訪問。通過這種方式,對象對內部數據提供了不同級別的保護,以防止程序中無關的部分意外的改變或錯誤的使用了對象的私有部分。 繼承 繼承是可以讓某個類型的對象獲得另一個類型的對象的屬性的方法。它支持按級分類的概念。例如,知更鳥屬於飛鳥類,也屬於鳥類。這種分類的原則是,每一個子類都具有父類的公共特性。 在OOP中,繼承的概念很好的支持了代碼的重用性(reusability),也就是說,我們可以向一個已經存在的類中添加新的特性,而不必改變這個類。這可以通過從這個已存在的類派生一個新類來實現。這個新的類將具有原來那個類的特性,以及新的特性。而繼承機制的魅力和強大就在於它允許程序員利用已經存在的類(接近需要,而不是完全符合需要的類),並且可以以某種方式修改這個類,而不會影響其它的東西。 注意,每個子類只定義那些這個類所特有的特性。而如果沒有按級分類,每類都必須顯式的定義它所有的特性。 多態 多態是OOP的另一個重要概念。多態的意思是事物具有不同形式的能力。舉個例子,對於不同的實例,某個操作可能會有不同的行為。這個行為依賴於所要操作數據的類型。比如說加法操作,如果操作的數據是數,它對兩個數求和。如果操作的數據是字元串,則它將連接兩個字元串。 多態機制使具有不同內部結構的對象可以共享相同的外部介面。這意味著,雖然針對不同對象的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以調用。多態在實現繼承的過程中被廣泛應用。 面向對象程序設計語言支持多態,術語稱之為"one interface multiplemethod(一個介面,多個實現)"。簡單來說,多態機制允許通過相同的介面引發一組相關但不相同的動作,通過這種方式,可以減少代碼的複雜度。在某個特定的情況下應該作出怎樣的動作,這由編譯器決定,而不需要程序員手工干預。 在多函數程序中,許多重要的數據被聲明為全局變數,這樣它們才可以被所有的函數訪問。每個函數又可以具有它自己的局部變數。全局變數很容易被某個函數不經意之間改變。而在一個大程序中,很難分辨每個函數都使用了哪些變數。如果我們需要修改某個外部數據的結構,我們就要修改所有訪問這個數據的函數。這很容易導致bug的產生。 在結構化程序設計中,另一個嚴重的缺陷是不能很好的模擬真實世界的問題。這是因為函數都是面向過程的,而不是真正的對應於問題中的各個元素。 面向過程的程序設計的一些特點如下: .強調做(演算法); .大程序被分隔為許多小程序,這些小程序稱為函數; .大多數函數共享全局數據; .數據開放的由一個函數流向另一個函數。函數把數據從一種形式轉換為另一種形式。 採用由上至下的程序設計方法。 動態綁定 綁定指的是將一個過程調用與相應代碼鏈接起來的行為。動態綁定的意思是,與給定的過程調用相關聯的代碼只有在運行期才可知。它與多態和繼承的聯繫極為緊密。一個多態引用的函數調用決定於這個引用的動態類型。 消息傳遞 一個面向對象的程序由許多對象組成,這些對象之間需要相互溝通。因此,在面向對象程序設計語言中,程序設計的主要步驟如下: 1、創建類,這些類定義了對象及其行為; 2、由類定義創建對象; 3、建立對象之間的通訊。 對象之間通過收發信息相互溝通,這一點類似於人與人之間的信息傳遞。信息傳遞的概念使得真實世界的直接模擬更易於和建立系統交流。 對於某個特定對象來說,消息就是請求執行某個過程,因此,消息的接收對象會調用一個函數(過程),以產生預期的結果。傳遞的消息的內容包括接收消息的對象的名字,需要調用的函數的名字,以及必要的信息。 對象就有一個生命周期。它們可以被創建和銷毀。只要對象正處於其生存期,就可以與其進行通訊。 OOP的優點 OOP具有許多優點,無論是對於程序設計者或者用戶來說都是如此。面向對象為軟體產品擴展和質量保證中的許多問題提供了解決辦法。這項技術能夠大大提高程序員的生產力,並可提高軟體的質量以及降低其維護費用。其主要的優點陳列於下: 1、通過繼承,我們可以大幅減少多餘的代碼,並擴展現有代碼的用途; 2、我們可以在標準的模塊上(這裡所謂的"標準"指程序員之間彼此達成的協議)構建我們的程序,而不必一切從頭開始。這可以減少軟體開發時間並提高生產效率; 3、數據隱藏的概念幫助程序員們保護程序免受外部代碼的侵襲; 4、允許一個對象的多個實例同時存在,而且彼此之間不會相互干擾; 5、允許將問題空間中的對象直接映射到程序中; 6、基於對象的工程可以很容易的分割為獨立的部分; 7、以數據為中心的設計方法允許我們抓住可實現模型的更多細節; 8、面向對象的系統很容易從小到大逐步升級; 9、對象間通訊所使用的消息傳遞技術與外部系統介面部分的描述更簡單; 10、更便於控制軟體複雜度。 當需要將以上所說的所有特性有機的結合於一個面向對象系統中,它們之間的相對重要性就取決於工程的類型和程序員的喜好。為了獲得上述的某些優勢,必須考慮很多事情。例如,對象庫必須可以被重用。技術還在不停的發展,現有的產品也會很快的更新換代。如果重用沒有能夠實現,那麼就需要進行嚴格的控制和管理。 易於使用的開發軟體往往難以編寫。面向對象程序設計工具有望解決這個問題。 面向對象程序設計語言 面向對象技術並不是某個特定語言的特權。如同結構化程序設計一樣,OOP概念可以在很多語言比如C和Pascal中實現。但是,當程序越來越大時,程序設計工作會變得拙劣而混亂。而一個支持OOP概念的程序設計語言則可以讓一切變得簡單。 一個語言必須支持幾個主要的OOP概念才能稱其是面向對象的。根據所支持的OOP特性,語言可以分為以下兩類: 1、基於對象的程序設計語言; 2、面向對象的程序設計語言。 基於對象的程序設計語言僅支持封裝和對象辨識。 一個面向對象的程序設計語言所要支持的重要特性如下: .數據封裝 .數據隱藏和訪問機制 .對象的自動初始化和清除 .操作符重載 支持對象風格程序設計的語言稱為基於對象的程序設計語言。它們不支持繼承和動態綁定。 Ada就是一個典型的基於對象的程序設計語言。 面向對象的程序設計不僅僅包含基於對象程序設計的特性,還支持繼承和動態綁定。 OOP的應用 OOP最有前途的應用領域如下: 1、實時系統; 2、模擬和建模; 3、面相對象資料庫; 4、超文本、超媒體和擴展文本; 5、AI和專家系統; 6、神經網路和並行程序設計; 7、決策支持和辦公自動化系統; 8、CIM/CAM/CAD系統。 Via 業務邏輯比較簡單的適合用面向過程,例如統計當前在線用戶數,一條SQL語句就可以搞定的沒有多大必要用面向對象,也沒有必要用什麼設計模式,那樣就是簡單問題複雜化了。 業務邏輯比較複雜的適合用面向對象,這樣當需求有變化時,維護起來會比較方便。 面向對象的局部是面向過程的,比如某個類裡面某個方法裡面實際就是面向過程的,而面向過程會借用面向對象的一些優點來進行優化。 網上發現了一篇文章,說了一下OP與OO的不同,並且打了一個比喻,通俗易懂。 有人這麼形容OP和OO的不同:用面向過程的方法寫出來的程序是一份蛋炒飯,而用面向對象寫出來的程序是一份蓋澆飯。所謂蓋澆飯,北京叫蓋飯,東北叫燴飯,廣東叫碟頭飯,就是在一碗白米飯上面澆上一份蓋菜,你喜歡什麼菜,你就澆上什麼菜。我覺得這個比喻還是比較貼切的。 蛋炒飯製作的細節,我不太清楚,因為我沒當過廚師,也不會做飯,但最後的一道工序肯定是把米飯和雞蛋混在一起炒勻。蓋澆飯呢,則是把米飯和蓋菜分別做好,你如果要一份紅燒肉蓋飯呢,就給你澆一份紅燒肉;如果要一份青椒土豆蓋澆飯,就給澆一份青椒土豆絲。 蛋炒飯的好處就是入味均勻,吃起來香。如果恰巧你不愛吃雞蛋,只愛吃青菜的話,那麼唯一的辦法就是全部倒掉,重新做一份青菜炒飯了。蓋澆飯就沒這麼多麻煩,你只需要把上面的蓋菜撥掉,更換一份蓋菜就可以了。蓋澆飯的缺點是入味不均,可能沒有蛋炒飯那麼香。 到底是蛋炒飯好還是蓋澆飯好呢?其實這類問題都很難回答,非要比個上下高低的話,就必須設定一個場景,否則只能說是各有所長。如果大家都不是美食家,沒那麼多講究,那麼從飯館角度來講的話,做蓋澆飯顯然比蛋炒飯更有優勢,他可以組合出來任意多的組合,而且不會浪費。 蓋澆飯的好處就是"菜""飯"分離,從而提高了製作蓋澆飯的靈活性。飯不滿意就換飯,菜不滿意換菜。用軟體工程的專業術語就是"可維護性"比較好,"飯"和"菜"的耦合度比較低。蛋炒飯將"蛋""飯"攪和在一起,想換"蛋""飯"中任何一種都很困難,耦合度很高,以至於"可維護性"比較差。軟體工程追求的目標之一就是可維護性,可維護性主要表現在3個方面:可理解性、可測試性和可修改性。面向對象的好處之一就是顯著的改善了軟體系統的可維護性。 Via 更多其它的可以參考下面的鏈接,裡面的文章寫得都不錯。 參考: http://wenda.tianya.cn/wenda/thread?tid=3a8af1a399 a97786 http://hi.baidu.com/jingxshi/blog/item/461c37dcb48a7aa8cd1166d2.html http://www.google.com/search?q=面向% E8??程+面向對??+優點+缺點&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:zh-CN:official&client=firefox-a http://www.baidu.com/baidu?wd=?????%B 3?+???????+???+?%B5?&tn=monline_dg http://wenwen.soso.com/z/q90127340.htm http://student.csdn.net/space.php?uid=2331&do=blog&id=2302 http://blog.csdn.net/wanghao72214/archive/2009/03/05/3961250.aspx http://blog.csdn.net/wanghao72214/archive/2009/02/24/3933983.aspx |
最近打算給開發和QA的同學介紹一下面向對象和UML相關的內容。這是第一篇,介紹主要面向對象的基礎概念和UML類圖的繪製。
類概念:類似對象的一種軟體抽象,創建對象的模板。
UML圖:屬性和操作之前可附加一個可見性修飾符。加號(+)表示具有公共可見性。減號(-)表示私有可見性。#號表示受保護的可見性。省略這些修飾符表示具有package(包)級別的可見性。如果屬性或操作具有下劃線,表明它是靜態的。在操作中,可同時列出它接受的參數,以及返回類型。
介面概念:定義了一套內聚行為的一個或多個操作特性標記的集合。介面是確保送耦合的一種強大的方法。它們允許類參與一套共同的功能集,除了支持介面意外,不需要別的類知道任何有關他的事情。介面的設計要遵循「介面分離原則」,參見什麼是面相對象設計的SOLID原則(s)
UML圖:介面的UML圖展現的樣式會有幾種變化,但內容都是一樣的。
註:在StarUML中可以通過選擇Interface元素的Format->【StereotypeDisplay】、【Suppress Attributes】、【Suppress Operations】來調整。
聯繫(Association)概念:實體之間的一個結構化關係表明對象是相互連接的。箭頭是可選的,它用於指定導航能力。如果沒有箭頭,暗示是一種雙向的導航能力。
UML圖:
聚合(Aggregation)
概念:有時對象會有其他對象組成。例如,飛機由機身、機翼、引擎、起落架等組成。這些全部都是聚合這個概念的例子,它表示「ispart of」關係。
UML圖:
class Node{ private: vector<Node*> itsNodes;};
上述代碼只有當子節點不會成為父節點的父節點時(即,必須是樹結構,不能是圖結構),才能稱之
為聚合。
組合(Composition)
概念:組合是更強形式的聚合,其中「整體」負責部分,每個「部分」對象也僅與一個整體對象聯繫。例如,
在任何給定時間,引擎是且僅是飛機的一部分。而且,除了飛機以外,其他對象都不能直接與引擎對象發
生交互。
UML圖:
class Car{ public: virtual ~Car() {delete itsCarb;} private: Carburetor* itsCarb};
依賴(Dependency)
概念:對象之間存在臨時關係,只有一個原因,它們可能會相互協作。一個對象與另一個對象進行協作,它需要了解這個對象。這意味著兩個對象之間必須存在對象關係或part-of關係。當兩個對象之間不存在持久關聯的時候,我們需要在兩個類之間建立依賴。
UML圖:
泛化(Generalization)
概念:表示一個更泛化的元素和一個更具體的元素之間的關係。
UML圖:
AbstractKmsTheme被標記為抽象的(名字是斜體)。
實現(Realization)概念:指定兩個實體之間的一個合同。換言之,一個實體定義一個合同,而另一個實體保證履行該合同。
UML圖
總結面向對象的概念和術語彙總表術語 | 描述 |
Abstract Class抽象類 | 不能實例化的類 |
Abstraction抽象 | 一個項目(可能是類或者操作)的本質特徵 |
Aggregation聚合 | 兩個類或者組件之間的關係,定義為「is part of」 |
Association關聯 | 兩個類或者對象之間的關係 |
Attribute屬性 | 類了解的東西(數據/信息) |
Cardinality基數 | 表示「有多少」的概念 |
Class類 | 類似對象的一種軟體抽象,創建對象的模板 |
Cohesion內聚 | 封裝單元(如組件或者類)的相關程度 |
Component組件 | 一種內聚功能單元,可以獨立開發、發布、由其他組件編輯組成更大的單元。 |
Composition組合 | 強類型的聚合,其中「整體」完全負責各個組成部分,每個部分對象僅與一個「整體」對象相關聯 |
Concrete Class具體類 | 可以從中實例化對象的類 |
Coupling耦合 | 兩個項目之間的依賴程度 |
Generalization泛化 | 表示一個更泛化的元素和一個更具體的元素之間的關係。 |
Inheritance繼承 | 定義為「is a」或者「is like」的關係 |
Instance實例 | 一個對象,它是某個類的一個示例 |
Instantiate實例化 | 從類定義中創建對象 |
Interface介面 | 定義了一套內聚行為的一個或多個操作特性標記的集合 |
Message消息 | 請求星系或者執行任務 |
Messaging消息傳遞 | 對象之間通過發送消息相互協作的過程 |
Method方法 | 有執行值操作的類實現的一個過程(與結構化編程中的函數相似) |
Multiple Inheritance多重繼承 | 直接繼承自一個以上的類 |
Object對象 | 基於類定義的人物、地點、事件、事物等等 |
Optionality選擇性 | 概念「你需要它嗎?」 |
Override | 在子類中重新定義屬性和/或方法,以使它們與父類中的定義有區別 |
Pattern | 在考慮相關因素的情況下,通用問題的一個可行性解決方案 |
Polymorphism多態 | 不同的對象可以以不同的方式響應同一消息,使對象可以交互而不需要知道確切的類型 |
Property | 在UML2中,是一個命名的值,例如,屬性和關聯,包括組合,指定元素(例如類或者組件)的一個特徵。在Java中,屬性的組合包括Getter和Setter |
Single Inheritance多重繼承 | 僅從一個類直接繼承 |
Stereotype構造型 | 建模元素的一種通用用法 |
Subclass子類 | 繼承自另一個類的類 |
Superclass父類 | 另一個類從中繼承的類 |
推薦閱讀:
※世界兩大鐘表展到底有什麼區別
※紅茶與普洱茶兩者之間的區別在哪裡
※八字食神的功用以及身旺身弱之人,食神與傷官的區別
※低脂奶和脫脂奶的區別
※老婆和情人的區別,服了