一起學UML建模:面向對象基礎與UML表示

統一建模語言(Unified Modeling Language, UML)是軟件業的標準語言。我們常見的軟件通常都是面向對象的。複雜系統建模,需要調研需求、分析問題、設計解決方案等。在開發的每個階段都應使用對象,使用對象可有效減少信息量,加強團隊的協作交流。此篇爲學習筆記整理備忘,瞭解的請忽略:)

本文主要整理了面向技術的最基礎知識,設計了個栗子,介紹對象和類,並簡要介紹了UML的類圖和對象圖。

目錄

1. 爲什麼要面向對象

1.1 對象更便於人們理解

1.2 專業人員可以更好的交流

1.3 數據和過程不是人爲分離的

1.4 代碼更容易重用

2. 什麼是對象

2.1 對象

2.2 類

3. 面向對象技術的相關原則

3.1 抽象

3.2 封裝

3.3 泛化

3.4 多態


 

 

1. 爲什麼要面向對象

 

1.1 對象更便於人們理解

例如,在銀行系統中,是根據銀行賬戶、銀行出納員和顧客來編程,而不是直接深入賬戶記錄、取款和存款過程、貸款資格的算法等。

1.2 專業人員可以更好的交流

無論是①修改別人的代碼的程序員;②自己編寫代碼的高級程序員;③根據需要決定編寫什麼代碼的設計師;還是④與客戶交流,瞭解需求總結出最終完成的系統必須要做的工作的分析師。不同階段的專業人士在交流時需要統一高效表達方式。在面向對象的方法中,每個人都使用相同的概念和表示法。而且,要處理的概念和表示法都比較少。

1.3 數據和過程不是人爲分離的

在傳統方法中,需要存儲的數據早早地與操作這些數據的算法分離開來,算法是獨立開發的。從需要訪問這些數據的過程來看,這會導致數據的格式不合適,或者數據放置的位肯不方便。而利用面向對象的開發方式,數據和過程一起放在容易管理的小軟件包中,數據從來不與算法分開。最後得到的代碼不太複雜,對客戶而求的變化也不太敏感。

1.4 代碼更容易重用

在傳統方法中,是從要解決的問題開始,利用問題來驅動整個開發,最後得到當前問題的單個解決方案,但明天總是會有另一個問題要解決。無論新問題和已解決的舊問題多麼接近,都不能分解單個系統,對它進行調整,因爲一個小問題就會影響系統的每個部分。

最後,面向對象是成熟的,並已得到了證明。在面向對象的開發方式中,我們總是要在類似的系統中尋找有用的對象。對象就像是智力拼圖玩具中的各塊拼圖。如果一塊拼圖變化了,就會影響臨近的兒塊拼圖,但其他的拼圖保持不變。

下面我們使用太陽系爲例說明對象與類的關係和具體UML表示方法。

圖片來自網絡

 

2. 什麼是對象

 

2.1 對象

對象(object)是一件事、一個實體、一個名詞,可以獲得的某種東西,可以想像有自己標識的任何東西。一些對象是活的,一些對象不是。現實世界中的例子有人、鳥、行星、銀行賬戶或CV中能完成跟蹤算法功能的模塊等。

所有的對象都有屬性(attribute), 例如人有姓名、身高、體重、性格;行星有直徑、質量、軌道、表面溫度、水分含量;跟蹤算法有當前幀圖像、跟蹤框、模版、匹配分數等。對象還有行爲(behavior):人會工作,行星會繞恆星運動;跟蹤算法會更新目標位置。

 

2.2 類

在現實世界中,對象是具體存在的,但現實世界的對象常常和其他對象很相近。例如張三和李四都是人,鴿子和喜鵲都是鳥,地球和火星都是行星等。所以爲了編程方便,對某一系列對象只應該定義一次,在需要時再創建具體的實體。類(Class)就是這一系列對象的抽象描述,這些對象共享相同的屬性、操作、關係和語義。與此對應,一個具體的對象是該類的一個實例。由此可見,類是一種抽象,它將相似的實體抽象成相同的概念,這種抽象過程強調相關特徵而忽略其他特徵。

UML表示類的方式如下圖所示。表示類的方框:第一格爲類名,第二格爲類的屬性,第三格爲類的行爲、方法。例如Celestial body(天體)類有描述天體的如下屬性:name(名字), size(大小), mass(重量), density(密度), composition(組成), location(位置);還有天體類的行爲:move(運動)。屬性或者方法前的+號表示public,-號表示private。屬性後還可以用加上類型,例如name屬性的類型是string字符串,添加方法爲屬性編輯區的type項後面輸入。

用UML表示的對象如下圖所示。左圖的對象是“地球”使用“:”表示其屬於Planet(行星)類;中圖的對象沒有名稱,爲匿名對象,表示行星類的某個對象;右圖的對象“Venus”(金星)對象,沒有指定所屬的類。

試試看下面的對象分別是什麼,屬於哪一類?

 

3. 面向對象技術的相關原則

 

3.1 抽象

世界是複雜的,爲了處理這種複雜性,需要將其中的內容抽象化。抽象(Abstraction)的過程就是揭示事物區別千其他事物的本質特徵的過程。是一個分析和理解問題的過程,這個過程取決於使用者的目的,它應該包括使用者所感興趣的那些職責問題,而忽略掉其他不相關的部分。從對象到類的過程就是抽象的過程,即將所見到的具體實體抽象成概念,從而可以在計算機世界中進行描述和對其採取各種操作。抽象過程並沒有唯一的答案,同一個實體在不同的業務場景中可能有不同的抽象。

 

3.2 封裝

封裝(Encapsulation) 是指對象對其客戶隱藏具體的實現,它是軟件模塊化思想的體現。通過封裝實現信息隱藏和數據抽象。信息隱藏的出發點是對象的私有數據不能被外界存取,從而保證外界以合法的手段(對象所提供的操作)訪問。同時,將數據抽象爲一組行爲,而不是內部的具體數據結構,把用戶隔離在實現細節之外,從而使得軟件各個部分依賴於抽象層,各模塊獲得自由,可以變化細節、可以進行替換。通過封裝還可以保證數據的一致性;使用傳統的結構化方法,是很難保證這一點的。

 

3.3 泛化

泛化(Generalization) 是類與類之間一種非常重要的關係,通過這種關係一個類可以共享另外一個或多個類的結構和行爲。

爲了實現泛化關係,採用繼承(Inheritance)機制。一個子類(Subclass)繼承一個或多個父類(Superclass),從而實現不同的抽象層次,這些層次之間所建立is ais kind of 關係,即爲泛化關係。通過這種關係可以很容易地複用已經存在的數據和代碼,並實現多態處理。根據父類的個數不同,存在着單一繼承和多重繼承兩種情況。

單一繼承(Single Inheritance) 是指一個類繼承另外一個類,下圖展示了單一繼承的實例,類Star(恆星)和類Celestial body(天體),類Planet(行星)和類Celestial body 、類Moon(衛星)和類Celestial body,分別通過單一繼承構成3個泛化關係。表明一個恆星類、一個行星類和一個衛星類。三者都是天體。

  • 三者都包含天體的name(名稱)、size(大小)、mass(質量)、density(密度)、composition(組成)、location(位置)信息,和move()運動行爲;
  • 恆星還有brightness(亮度),temperature(溫度)信息,以及radiate()輻射行爲;
  • 行星還有orbit(軌道),period_rotation(自轉週期),period_around_sun(公轉週期),distance2star(與恆星距離),moons(衛星數)屬性;
  • 衛星還有which_planet(所屬行星)屬性。

很自然的有單一繼承就有多重繼承。多重繼承(Multiple Inheritance)是指一個類繼承另外多個(超過一個)類的屬性和行爲。如下圖所示,類Planet同時繼承類Celestial body和類Ball,這是一個多重繼承,表明行星(Planet) 既是一種天體(Celestial body),又是一種球體(Ball) 。

3.4 多態

多態(Polymorphism) 是在同一外表(接口)下表現出多種行爲的能力,它是對象技術的根本特徵,是將對象技術稱爲面向對象的原因所在。對象技術正是利用多態提供的動態行爲特徵,來封裝變化,適應變更,以達到系統的穩定。

可以這樣認爲,一個子類會繼承父類所有的元素(可能有些元素對於子類不可見),這包括屬性、操作和關係。此外,子類還可以根據自己的需要添加額外的屬性、操作或關係,還可對父類已有的操作進行重新定義

例如下圖所示的多態示例。多態需要有泛化關係的支持,如行星和衛星均繼承自天體(斜體字表示其爲抽象類)。通過天體提供的接口move()實現運動行爲的多態性,即根據目標的不同做出不同的運動。如,行星的運動爲自轉和公轉相結合,而衛星沒有自轉。

假設有個數組array,其中放着一些天體,但不知哪些是行星,哪些是衛星。利用多態性,完全可以不用關注這些細節,而直接讓它們嗨起來。

for(int i = 0; i < array.length; ++i) 
{
	CelestialBody cBody = (CelestialBody)array[i];
	cBody.move();
}

在遍歷整個數組的天體過程中,各個天體知道自己該怎樣轉。所以cBody.move()這行代碼在cBody指向不同類的天體時,將表現出不同的行爲,這就是多態

 

本文引用與更新鏈接:https://blog.csdn.net/iracer/article/details/104788317

相關文章:

1.一起學UML建模:UML簡介與建模軟件安裝:https://blog.csdn.net/iracer/article/details/104686010

2.一起學UML建模:面向對象基礎與UML表示:https://blog.csdn.net/iracer/article/details/104788317

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章