• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    軟件設計本質論—白話面向對象

    發布: 2007-5-14 20:03 | 作者: 網絡轉載 | 來源: blog | 查看: 58次 | 進入軟件測試論壇討論

    領測軟件測試網

      不同的人在談面向對象編程(OOP)時所指的含義并不相同。有人認為任何采用圖形界面的應用程序都是面向對象的。有人把它作為術語來描述一種特別的進程間通信機制。還有人使用這個詞匯是另有深義的,他們其實是想說:“來啊,買我的產品吧!”我一般不提OOP,但只要提到,我的意思是指使用繼承和動態綁定的編程方式。 --《 C++沉思錄》

      《C++沉思錄》說的是十幾年前的事了,現在大家對面向對象的回答已經是眾口一詞:封裝、繼承和多態。大家都知道,在面向對象中,一輛汽車是一個對象,汽車這個概念是一個類。汽車有漂亮的外觀,把各種內部原理都隱藏起來了,司機不必知道它的內部工作原理仍然能開車,即使汽車隨技術的進步不斷升級,對司機也沒有什么影響,這就是封裝的好處。

      汽車是交通工具的一種,汽車是一個類,交通工具也是一個類,而交通工具類包括了汽車類,從而具有更廣泛的意義。這種從抽象到具體的關系就是繼承關系,我們可以說汽車類繼承了交通工具類,汽車類是交通工具類的子類,交通工具類是汽車類的父類。

      作為交通工具,它肯定可以運動(move),從甲地運動到乙地,就起到了交通的作用。輪船是一種交通工具,所以輪船類也是交通工具類的子類。同樣是運動,輪船的運動和汽車的運動方式肯定有所不同,這樣以不同的方式完成同樣的功能就叫多態。

      關于對象:對象就是某一具體的事物,比如一個蘋果, 一臺電腦都是一個對象。每個對象都是唯一的,兩個蘋果,無論它們的外觀有多么相像,內部成分有多么相似,兩個蘋果畢竟是兩個蘋果,它們是兩個不同的對象。對象可以是一個實物,也可能是一個概念,比如某個蘋果對象是實物,而一項政策可能就是一個概念性的對象了。

      關于類:對象可能是一個無窮的集合,用枚舉的方式來表示對象集合不太現實。抽象出對象的特征和功能,按此 標準將對象分類,這就引入類的概念。類就是一類事物的統稱,類實際上就是一個分類的標準,符合這個分類標準的對象都屬于這個類。當然,為了方便起見,通常只需要抽取那些,對當前應用來說是有用的特征和功能。

      關于抽象類:類是對對象的抽象,比如,蘋果是對所有具體的蘋果的抽象。如果我們對蘋果這個類進行一步抽象,可以得到一個水果類。這種對類本身進行抽象而得到的類,就是抽象類。抽象類不像普通類,它是沒有對象與之對應的。像蘋果類,你總是可以拿到一個叫蘋果的東西,而對于水果類,根本沒一個真正叫水果的東西。你可以說一個蘋果是一個水果,從邏輯上講沒有錯,但沒有什么意義。一般在程序中,抽象類是不能實例化的。

      關于面向對象:面向對象就是以對象為中心。為什么不說是面對類,而說是面向對象呢?類是對象的集合,考慮類實際上也是在考慮對象,有時甚至并不嚴格的區分它們。所以說面向對象一詞比面向類更確切。

      既然以對象為中心,面向對象所考慮的內容自然是對象、對象間的協作、對象的分類、類之間的關系等等,由此引申了出幾個重要的概念。

      1. 封裝

      what:對象也有隱私,對象的隱私就是對象內部的實現細節。要想對象保持良好的形象就要保護好對象隱私,所謂的封裝其實就是保護對象隱私。當然,沒有人能完全隱藏自己的隱私,比如你去轉戶口時,你不得不透露自己的家庭信息和健康狀況。另外,在不同的場合所透露隱私的數量也不一樣,朋友和家人可能會知道你更多隱私,同事次之,其他人則知道得更少。面向對象也考慮了這些實際的情況,所以像C++之類的語言有public/private/protected/friend等關鍵字,以適應于不同的情況。

      why:封裝可以隔離變化。據以往的經驗,我們知道內部實現是容易變化的,比如電腦在不斷的升級,機箱還是方的,但里面裝的CPU和內存已是今非昔比了。變化是不可避免的,但變化所影響的范圍是可以控制的,不管CPU怎么變,它不應該影響用戶使用的方式。封裝是隔離變化的好辦法,用機箱把CPU和內存等等封裝起來,對外只提供一些標準的接口,如USB插口、網線插口和顯示器插口等等,只要這些接口不變,內部怎么變,也不會影響用戶的使用方式。

      封裝可以提高易用性。封裝后只暴露最少的信息給用戶,對外接口清晰,使用更方便,更具用戶友好性。試想,如果普通用戶都要知道機箱內部各種芯片和跳線,那是多么恐怖的事情,到現在為止我甚至還搞不清楚硬盤的跳線設置,幸好我沒有必要知道。


      how:在 C語言中,可以用結構+函數來模擬類的實現,而用這種結構定義的變量就是對象。封裝有兩層含義,其一是隱藏內部行為,即隱藏內部函數,調用者只能看到對外提供的公共函數。其二是隱藏內部信息,即隱藏內部數據成員,F在都建議不要對外公開任何數據成員,即使外部需要知道的數據成員,也只能通過函數獲取。

      在C語言中要隱藏內部函數很簡單:不要它把放在頭文件中,在C文件中定義時,前面加static關鍵字,每個類放在獨立的文件中。這樣可以把函數的作用范圍限于當前文件內,當前文件只有類本身的實現,即只有當前的類自己才能看到這些函數,這就達到了隱藏的目的。

      在C語言中要隱藏數據成員較為麻煩,它沒有提供像 C++中所擁有的public/protected/friend/private類似的關鍵字。只能通過一些特殊方法模擬部分效果,我常用的方法有兩種。

      其一是利用C的特殊語法,在頭文件中提前聲明結構,在C文件才真正定義它。這樣可以把結構的全部數據信息都隱藏起來。因為外部不知道對象所占內存的大小,所以不能靜態的創建該類的對象,只能調用類提供的創建函數才能創建。這種方法的缺陷是不支持繼承,因為子類中得不到任何關于父類的信息。
     
      其二是把私有數據信息放在一個不透明的priv變量中。只有類的實現代碼才知道priv的真正定義。

      2. 繼承

      what: 繼承描述的是一種抽象到具體的關系。具體的東西繼承了抽象的東西的特性,比如說,水果這個概念比蘋果這個概念更抽象,其意義更具有一般性,而蘋果這個概念則更具體,其意義更狹窄一些,在面向對象里,我們可以說蘋果類繼承了水果類。繼承是指繼承了父類的特性,繼承本質是源于分類學,細的分類繼承大分類的特性。

      why: 繼承描述了抽象到具體的關系,所以能夠有效利用抽象這件武器來戰勝軟件的復雜性。抽象在實現中無處不在,類就是對事物的抽象,提到蘋果你就想到蘋果這一類事物,無需要關心其大小、顏色和成分,蘋果這兩個字就足夠了。名不正則言不順,言不順則事不成,看來老夫子已經領悟到了抽象的威力。

      繼承不但利用了抽象的力量來降低系統的復雜性,它還提供了一種重用的方式。假設我們承認下列面這個繼承關系,蘋果繼承了水果,水果繼承了食物,如果我們已經知道什么是食物,什么是水果,在描述蘋果時,沒有必要去重復講解食物和水果的概念了,這就是重用,重用了對水果和食物兩個概念的理解。

      how: 在C語言中實現繼承很簡單,可以用結構來模擬。這種實現基于一個明顯的事實,結構在內存中的布局與結構的聲明具有一致的順序。我們知道在程序描述事物的特征時,主要通過數據變量描述事物的屬性特征,如顏色、重量和體積等,用函數來描述事物的行為特征,和運動、成長和搏斗等。

      繼承

      繼承在現實世界中應用很廣,在程序里也是一樣,甚至可以說是過度使用了。多年以前一些大師已經提出,優先使用組合而不是繼承。主要原因有三點,首先是多級繼承和多重繼承太復雜了,失去了抽象帶來的簡潔性。其次是父類與子類之間共享太多信息,它們的耦合太緊密。三是父類與子類之間的關系在編譯時就靜態綁定了,很難做到在運行時多態。

      現在一般都提倡,只繼承接口不繼承實現,通過組合達到代碼重用的目的。在《設計模式》中是這樣強調的,在MS的COM里也是這樣做的。所以我基本上只使用接口繼承,很少遇到什么麻煩,建議大家也遵循這一準則。

      3. 多態

      what: 盡管多態這個詞本身就表明了它所代表的意義,但還是讓初學者感到多少有些神秘。多態就是完成相同功能的多種方式,比如拿動物的運動來說吧,鳥的運動通常是飛,魚的運動通常是游,陸上動物的運動通常是跑,同是運動,但方式不一樣,這就是多態。不少人對多態的回答是,允許同名函數存在。這種回答顯然沒有抓住多態的本質。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: 面向對象

    31/3123>

    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>