面向?qū)ο蟮膬?yōu)缺點_第1頁
面向?qū)ο蟮膬?yōu)缺點_第2頁
面向?qū)ο蟮膬?yōu)缺點_第3頁
面向?qū)ο蟮膬?yōu)缺點_第4頁
面向?qū)ο蟮膬?yōu)缺點_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、面向?qū)ο蟮膬?yōu)缺點什么是面向?qū)ο蟪绦蛟O(shè)計?面向?qū)ο蟪绦蛟O(shè)計(OOP)技術(shù)汲取了結(jié)構(gòu)化程序設(shè)計中的好的思想,并將這些思想與一些新的,強大的理念相結(jié)合,從而給你的程序設(shè)計工作提供了一種全新的方法。通常,在面向?qū)ο蟮某绦蛟O(shè)計風(fēng)格中,你會將一個問題分解為一些相互關(guān)聯(lián)的子集,每個子集內(nèi)部都包括了相關(guān)的數(shù)據(jù)和函數(shù)。同時,你會以某種方法將這些子集分為不同等級,而一個對象就是已定義的某個類型的變量。當(dāng)你定義了一個對象,你就隱含的創(chuàng)建了一個新的數(shù)據(jù)類型。面向?qū)ο蟪绦蛟O(shè)計模式 發(fā)明面向?qū)ο蟪绦蛟O(shè)計方法的主要出發(fā)點是彌補面向過程程序設(shè)計方法中的一些缺點。OOP把數(shù)據(jù)看作程序開發(fā)中的基本元素,并且不允許它們在系統(tǒng)中自由

2、流動。它將數(shù)據(jù)和操作這些數(shù)據(jù)的函數(shù)緊密的連結(jié)在一起,并保護數(shù)據(jù)不會被外界的函數(shù)意外的改變。OOP允許我們將問題分解為一系列實體這些實體被稱為對象(object),然后圍繞這些實體建立數(shù)據(jù)和函數(shù)。一、使用面向?qū)ο笏枷腴_發(fā)的優(yōu)點:1、 易維護采用面向?qū)ο笏枷朐O(shè)計的結(jié)構(gòu),可讀性高,由于繼承的存在,即使改變需求,那么維護也只是在局部模塊,所以維護起來是非常方便和較低成本的。2、質(zhì)量高在設(shè)計時,可重用現(xiàn)有的,在以前的項目的領(lǐng)域中已被測試過的類使系統(tǒng)滿足業(yè)務(wù)需求并具有較高的質(zhì)量。3、效率高在軟件開發(fā)時,根據(jù)設(shè)計的需要對現(xiàn)實世界的事物進行抽象,產(chǎn)生類。使用這樣的方法解決問題,接近于日常生活和自然的思考方式,

3、勢必提高軟件開發(fā)的效率和質(zhì)量。4、易擴展由于繼承、封裝、多態(tài)的特性,自然設(shè)計出高內(nèi)聚、低耦合的系統(tǒng)結(jié)構(gòu),使得系統(tǒng)更靈活、更容易擴展,而且成本較低。缺點:類和繼承等特點使得程序會多很多指針操作來定位函數(shù)入口和自身要維護虛擬方法表等額外的工作,程序的處理效率相對要低(但程序開發(fā)效率高)。所以現(xiàn)在單純的C語言還是大為用武之地的。 但隨著科技的進步,CPU和內(nèi)存的性能也突發(fā)猛進。由原來的1核到8核,內(nèi)存16M和現(xiàn)在的16G,所以程序的效率多多少少會隨著硬件的性能變得更好。你可以發(fā)現(xiàn)很多大的項目也開始由C轉(zhuǎn)而變成讓c+和JAVA等面向?qū)ο髞韺懥?。二、面向?qū)ο蟮奶攸c和優(yōu)缺點:1、特點  (1)利

4、用特定軟件直接從對象客體的描述到軟件結(jié)構(gòu)的轉(zhuǎn)換。   (2)解決了傳統(tǒng)結(jié)構(gòu)化方法中客觀世界描述工具與軟件結(jié)構(gòu)的不一致性。   (3)減少了從系統(tǒng)分析、設(shè)計到軟件模塊結(jié)構(gòu)之間的多次轉(zhuǎn)換映射的繁雜過程。2、OO方法優(yōu)缺點    優(yōu)點:     (1)是一種全新的系統(tǒng)分析設(shè)計方法(對象、類、結(jié)構(gòu)屬性、方法)。     (2)適用于各類信息系統(tǒng)的開發(fā)。     (3)實現(xiàn)了對客觀世界描述到軟件結(jié)

5、構(gòu)的直接轉(zhuǎn)換 ,大大減少后續(xù)軟件開發(fā)量。     (4)開發(fā)工作的重用性、繼承性高,降低重復(fù)工作量。     (5)縮短了開發(fā)周期。    缺點:    (1)需要一定的軟件支持環(huán)境。    (2)不太適宜大型的MIS開發(fā),若缺乏整體系統(tǒng)設(shè)計劃分,易造成系統(tǒng)結(jié)構(gòu)不合理、各部分關(guān)系失調(diào)等問題。    (3)只能在現(xiàn)有業(yè)務(wù)基礎(chǔ)上進行分類整理,不能從科學(xué)管理角度進行理順和優(yōu)化。  &

6、#160; (4)初學(xué)者不易接受、難學(xué)。三、面向?qū)ο缶幊痰膬?yōu)缺點:1、優(yōu)點:(1)通過繼承,我們可以大幅減少多余的代碼,并擴展現(xiàn)有代碼的用途。(2)我們可以在標準的模塊上構(gòu)建我們的程序,而不必一切從頭開始。這可以減少軟件開發(fā)時間并提高生產(chǎn)率。(3)數(shù)據(jù)隱藏的概念幫助程序員保護程序免受外部代碼的侵襲。(4)容許一個對象的多個實現(xiàn)同時存在,而且彼此之間不會相互干擾。(5)容許將問題中的對象直接映射到程序中。(6)基于對象的工程可以很容易的分割為獨立的部分。(7)以數(shù)據(jù)為中心的設(shè)計方法容許我們抓住可實現(xiàn)的更多細節(jié)。(8)面向?qū)ο蟪绦虻南到y(tǒng)很容易從小到大逐步升級。(9)對象間通訊所使用的消息傳遞技術(shù)與

7、外部系統(tǒng)接口部分的描述更簡單。(10)更便于控制軟件的復(fù)雜度。面向?qū)ο蠓椒▽W(xué)把分析、設(shè)計和實現(xiàn)很自然地聯(lián)系在一起了。雖然面向?qū)ο笤O(shè)計原則上不依賴于特定的實現(xiàn)環(huán)境,但是實現(xiàn)結(jié)果和實現(xiàn)成本卻在很大程度上取決于實現(xiàn)環(huán)境。因此,直接支持面向?qū)ο笤O(shè)計范式的面向?qū)ο蟪绦蛘Z言、開發(fā)環(huán)境及類庫,對于面向?qū)ο髮崿F(xiàn)來說是非常重要的。為了把面向?qū)ο笤O(shè)計結(jié)果順利地轉(zhuǎn)變成面向?qū)ο蟪绦?,首先?yīng)該選擇一種適當(dāng)?shù)某绦蛟O(shè)計語言。面向?qū)ο蟮某绦蛟O(shè)計語言適合用來實現(xiàn)面向?qū)ο笤O(shè)計結(jié)果。事實上,具有方便的開發(fā)環(huán)境和豐富的類庫的面向?qū)ο蟪绦蛟O(shè)計語言,是實現(xiàn)面向?qū)ο笤O(shè)計的最佳選擇。良好的程序設(shè)計風(fēng)格對于面向?qū)ο髮崿F(xiàn)來說格外重要。它既包括傳

8、統(tǒng)的程序設(shè)計風(fēng)格準則,也包括與面向?qū)ο蠓椒ǖ奶攸c相適應(yīng)的一些新準則。面向?qū)ο蠓椒▽W(xué)使用獨特的概念和完成軟件開發(fā)工作,因此,在測試面向?qū)ο蟪绦虻臅r候,除了繼承傳統(tǒng)的測試技術(shù)之外,還必須研究與面向?qū)ο蟪绦蛱攸c相適應(yīng)的新的測試技術(shù)。在這方面需要做的研究工作還很多,目前已逐漸成為國內(nèi)外軟件工程界研究的一個新的熱門課題。面向過程的優(yōu)缺點“面向過程”(Procedure Oriented)是一種以過程為中心的編程思想?!懊嫦蜻^程”也可稱之為“面向記錄”編程思想,他們不支持豐富的“面向?qū)ο蟆碧匦裕ū热缋^承、多態(tài)),并且它們不允許混合持久化狀態(tài)和域邏輯。就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步

9、一步實現(xiàn),使用的時候一個一個依次調(diào)用就可以了。面向過程其實是最為實際的一種思考方式,就是算面向?qū)ο蟮姆椒ㄒ彩呛忻嫦蜻^程的思想.可以說面向過程是一種基礎(chǔ)的方法.它考慮的是實際的實現(xiàn).一般的面向過程是從上往下步步求精.所以面向過程最重要的是模塊化的思想方法.對比較面向?qū)ο?面向?qū)ο蟮姆椒ㄖ饕前咽挛锝o對象化,對象包括屬性與行為.當(dāng)程序規(guī)模不是很大時,面向過程的方法還會體現(xiàn)出一種優(yōu)勢,因為程序的流程很清楚,按著模塊與函數(shù)的方法可以很好的組織.比如拿學(xué)生早上起來的事情來說說這種面向過程吧.粗略的可以將過程擬為。(1)起床 (2)穿衣 (3)洗臉刷牙 (4)去學(xué)校

10、0;而這4步就是一步一步的完成,它的順序很重要,你只須一個一個的實現(xiàn)就行了.而如果是用面向?qū)ο蟮姆椒ǖ脑?可能就只抽象出一個學(xué)生的類,它包括這四個方法,但是具體的順序就不能體現(xiàn)出來。1、 面向?qū)ο笙鄬γ嫦蜻^程的優(yōu)點 (1) 結(jié)構(gòu)清晰。使人們的編程與實際的世界更加接近,所有的對象被賦予屬性和方法,結(jié)果編程就更加富有人性化。 (2) 封裝性。減小外部對內(nèi)部的影響。封裝將對象有關(guān)的數(shù)據(jù)和行為封裝成整體來處理,使得對象以外的部分不能隨意存取對象的內(nèi)部屬性,從而有效地避免了外部錯誤對它的影響,大大減小了查錯和排錯的難度。 (3) 容易擴展,代碼重用率高。容易擴展,在大框架不變的情況下很容易就開發(fā)出適合自

11、己的功能,實現(xiàn)簡單,可有效地減少程序的維護工作量,軟件開發(fā)效率高。 2、 面向?qū)ο笙鄬γ嫦蜻^程的缺點 (1) 增加工作量。如果一味地強調(diào)封裝,當(dāng)進行修改對象內(nèi)部時,對象的任何屬性都不允許外部直接存取,則要增加許多沒有其他意義、只負責(zé)讀或?qū)懙男袨?。這會為編程工作增加負擔(dān),增加運行開銷,并且使程序顯得臃腫。 (2) 性能低。由于面向更高的邏輯抽象層,使得面向?qū)ο笤趯崿F(xiàn)的時候,不得不做出性能上面的犧牲,計算時間和空間存儲大小的都開銷很大。 3、舉例 (1) 面向?qū)ο蟮膬?yōu)點舉例:如象棋程序,比如我要加入悔棋的功能,如果面向過程設(shè)計的話,那么從輸入到判斷到顯示這一連串的步驟都要改動,甚至步驟之間的循序都

12、要進行大規(guī)模調(diào)整。如果是面向?qū)ο蟮脑?,只用改動棋盤對象就行了,棋盤系統(tǒng)保存了紅黑雙方的棋譜,簡單回溯就可以了,而顯示和規(guī)則判斷則不用顧及,同時整個對對象功能的調(diào)用順序都沒有變化,改動只是局部的。 (2) 面向?qū)ο蟮娜秉c舉例:如技術(shù)類開放問題2的留言板系統(tǒng),當(dāng)設(shè)計一個留言板系統(tǒng),要求滿足記錄數(shù)每日新增10萬條和查詢量100萬,如果每一個數(shù)據(jù)交換過程都是一個對象,那么總的性能損失將是天文數(shù)字。 泛型編程思想什么是泛型編程思想:泛型編程(Generic Programming)最初提出時的動機很簡單直接:發(fā)明一種語言機制,能夠幫助實現(xiàn)一個通用的標準容器庫。所謂通用的標準容器庫,就是要能夠做到,比如用

13、一個List類存放所有可能類型的對象這樣的事;泛型編程讓你編寫完全一般化并可重復(fù)使用的算法,其效率與針對某特定數(shù)據(jù)類型而設(shè)計的算法相同。泛型即是指具有在多種數(shù)據(jù)類型上皆可操作的含意,與模板有些相似。STL巨大,而且可以擴充,它包含很多計算機基本算法和數(shù)據(jù)結(jié)構(gòu),而且將算法與數(shù)據(jù)結(jié)構(gòu)完全分離,其中算法是泛型的,不與任何特定數(shù)據(jù)結(jié)構(gòu)或?qū)ο箢愋拖翟谝黄稹8攀龇盒途幊痰拇碜髌稴TL是一種高效、泛型、可交互操作的軟件組件。STL以迭代器 (Iterators)和容器(Containers)為基礎(chǔ),是一種泛型算法(Generic Algorithms)庫,容器的存在使這些算法有東西可以操作。STL包含各種

14、泛型算法(algorithms)、泛型指針(iterators)、泛型容器(containers)以及函數(shù)對象(function objects)。STL并非只是一些有用組件的集合,它是描述軟件組件抽象需求條件的一個正規(guī)而有條理的架構(gòu)。泛型的第一個好處是編譯時的嚴格類型檢查。這是集合框架最重要的特點。此外,泛型消除了絕大多數(shù)的類型轉(zhuǎn)換。如果沒有泛型,當(dāng)你使用集合框架時,你不得不進行類型轉(zhuǎn)換。關(guān)于泛型的理解可以總結(jié)下面的一句話,它是把數(shù)據(jù)類型作為一種參數(shù)傳遞進來。泛型編程(Generic Programming)最初提出時的動機很簡單直接:發(fā)明一種語言機制,能夠幫助實現(xiàn)一個通用的標準容器庫。所謂

15、通用的標準容器庫,就是要能夠做到,比如用一個List類存放所有可能類型的對象,這樣的事情;熟悉一些其它面向?qū)ο蟮恼Z言的人應(yīng)該知道,如Java里面這是通過在List里面存放Object引用來實現(xiàn)的。Java的單根繼承在這里起到了關(guān)鍵的作用。然而單根繼承對C+這樣的處在語言鏈底層的語言卻是不能承受之重。此外使用單根繼承來實現(xiàn)通用容器也會帶來效率和類型安全方面的問題,兩者都與C+的理念不相吻合。由來泛型編程最初誕生于C+中,由Alexander Stepanov2和David Musser3創(chuàng)立。目的是為了實現(xiàn)C+的STL(標準模板庫)。其語言支持機制就是模板(Templates)。模板的精神其實很

16、簡單:參數(shù)化類型。換句話說,把一個原本特定于某個類型的算法或類當(dāng)中的類型信息抽掉,抽出來做成模板參數(shù)T。比如qsort泛化之后就變成了:template<class RandomAccessIterator, class Compare>void sort(RandomAccessIterator first, RandomAccessIterator last,Compare comp);其中first,last這一對迭代器代表一個前閉后開區(qū)間,迭代器和前閉后開區(qū)間都是STL的核心概念。迭代器建模的是內(nèi)建指針的接口(解引用、遞增、遞減等)、前閉后開區(qū)間是一個簡單的數(shù)學(xué)概念,表示從

17、first(含first)到last(不含last)的區(qū)間內(nèi)的所有元素。此外,comp是一個仿函數(shù)(functor)。仿函數(shù)也是STL的核心概念,仿函數(shù)是建模的內(nèi)建函數(shù)的接口,一個仿函數(shù)可以是一個內(nèi)建的函數(shù),也可以是一個重載了operator()的類對象,只要是支持函數(shù)調(diào)用的語法形式就可成為一個仿函數(shù)。通過操作符重載,C+允許了自定義類型具有跟內(nèi)建類型同樣的使用接口;又通過模板這樣的參數(shù)化類型機制,C+允許了一個算法或類定義,能夠利用這樣的接口一致性來對自身進行泛化。例如,一個原本操作內(nèi)建指針的算法,被泛化為操縱一切迭代器的算法。一個原本使用內(nèi)建函數(shù)指針的算法,被泛化為能夠接受一切重載了函數(shù)調(diào)

18、用操作符(operator())的類對象的算法。編輯本段泛型的機制編譯機制1. 第一輪編譯時,編譯器只為Stack<T>(棧算法)類型產(chǎn)生“泛型版”的IL代碼與元數(shù)據(jù)-并不進行泛型類型的實例化,T在中間只充當(dāng)占位符2. JIT編譯時,當(dāng)JIT編譯器第一次遇到Stack<int>時,將用int替換“泛型版”IL代碼與元數(shù)據(jù)中的T-進行泛型類型的實例化。CLR為所有類型參數(shù)為“引用類型”的泛型類型產(chǎn)生同一份代碼;但如果類型參數(shù)為“值類型”,對每一個不同的“值類型”,CLR將為其產(chǎn)生一份獨立的代碼。泛型編程的優(yōu)點:(1)使用泛型類型可以最大限度地重用代碼、保護類型的安全以及提

19、高性能;(2)使用泛型可以創(chuàng)建集合類;. NET Framework類庫在System.Collections.Generic命名空間中包含幾個新的泛型集合類,應(yīng)盡可能地使用這些類來代替普通的類,如System.Collections命名空間中的 ArrayList;(3)可以創(chuàng)建自己的泛型接口、泛型類、泛型方法、泛型事件和泛型委托;(4)可以對泛型類進行約束以訪問特定數(shù)據(jù)類型的方法;(5)關(guān)于泛型數(shù)據(jù)類型中使用的類型的信息可在運行時通過反射獲取。缺點:(1)在性能上沒有數(shù)組快。(2)雖然泛型程序設(shè)計方法與面向?qū)ο蟪绦蛟O(shè)計方法相比具有極大的優(yōu)越性,并已成功地用于一大批通用程序庫的開發(fā)。然而,在

20、實際運用中面向?qū)ο蟪绦蛟O(shè)計依然具備泛型程序設(shè)計尚未具備的一個很大優(yōu)勢,由于面向?qū)ο蟪绦蛟O(shè)計采用的對象類表示簡單、易于理解,并且基于對象類的繼承機制語義清晰、便于實現(xiàn)。面向?qū)ο蟪绦蛟O(shè)計的抽象、封裝、繼承性、多態(tài)性等特點能夠得到語言一級的支持。對于泛型程序設(shè)計,目前尚沒有任何一個主流程序設(shè)計語言能夠直接定義或表示泛型程序設(shè)計方法。無論是早期的Ada泛型編程,還是目前流行的c+模板編程,或者正在計劃推出的c#with Generics,所采用的泛型編程方法,都不是真正意義上的“基于需求”的泛型程序設(shè)計。它們所采用的泛型程序設(shè)計方法,主要是通過人工的約定來遵循和運用,并要求編程者具備很高的素質(zhì)和長期的

21、經(jīng)驗。與當(dāng)前面向?qū)ο蟪绦蛟O(shè)計方法已被眾多語言支持相比,這是泛型程序設(shè)計一個很不理想的薄弱環(huán)節(jié)。泛型程序設(shè)計的優(yōu)越性也必須在實現(xiàn)了泛型程序設(shè)計的基本方法的直接程序語言支持之下,才能充分展示出來。 泛型程序設(shè)計不能被程序設(shè)計語言直接支持有多種原因,其中最主要的原因是:泛型程序設(shè)計方法中的概念包含太多,過于龐雜,或內(nèi)容含混,使得現(xiàn)有的程序設(shè)計語言編譯技術(shù)無法有效地處理,不能保證或驗證出類型需求是否確實被類型參數(shù)滿足。導(dǎo)致了泛型程序設(shè)計目前還屬于程序設(shè)計中的高階技術(shù),有礙于其廣泛運用和普及。如下例子:/ Declare the generic class public class GenericLis

22、t<T> void Add(T input) class TestGenericList private class ExampleClass static void Main() GenericList<int> list1 = new GenericList<int>(); GenericList<string> list2 = new GenericList<string>(); GenericList<ExampleClass> list3 = new GenericList<ExampleClass>

23、(); 面向?qū)ο笈c面向過程程序設(shè)計有如下不同: (1)面向過程程序設(shè)計方法采用函數(shù)(或過程)來描述對數(shù)據(jù)的操作,但又將函數(shù)與其操作的數(shù)據(jù)分離開來;面向?qū)ο蟪绦蛟O(shè)計方法將數(shù)據(jù)和對數(shù)據(jù)的操作封裝在一起,作為一個整體來處理。 函數(shù)與數(shù)據(jù)是否分離。(2)面向過程程序設(shè)計方法以功能為中心來設(shè)計功能模塊,難于維護;而面向?qū)ο蟪绦蛟O(shè)計方法以數(shù)據(jù)為中心來描述系統(tǒng),數(shù)據(jù)相對于功能而言具有較強的穩(wěn)定性,因此更易于維護。 以功能為中心;以數(shù)據(jù)為中心。(3)面向過程程序的控制流程由程序中預(yù)定順序來決定;面向?qū)ο蟪绦虻目刂屏鞒逃蛇\行時各種事件的實際發(fā)生來觸發(fā),而不再由預(yù)定順序來決定,更符合實際需要。 預(yù)定順序;由運行時各種事件的實際發(fā)生來觸發(fā) (4)面向?qū)ο蟪绦蛟O(shè)計方法可以利用框架產(chǎn)品(如MFC,Microsoft Foundation Classes)進行編程。 面向?qū)ο罂衫每蚣?面向?qū)ο蠛兔嫦蜻^程的根本差別,在于封裝之后,面向?qū)ο筇峁┝嗣嫦蜻^程不具備的各種特性,最主要的,就是繼承和多態(tài)。面向?qū)ο蟪绦蛟O(shè)計與泛型程序設(shè)計的比較:泛型程序設(shè)計比面向?qū)ο蟪绦蛟O(shè)計具有更高的抽象能

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論