面向物件分析與設計 - 物件模型



物件模型將軟體應用程式中的元素視覺化為物件。本章我們將探討面向物件系統的一些基本概念和術語。

物件和類

物件和類的概念彼此緊密相連,構成了面向物件正規化的基礎。

物件

物件是在面向物件環境中一個現實世界的元素,它可能具有物理或概念上的存在。每個物件具有:

  • 標識,用於區分系統中的其他物件。

  • 狀態,決定物件的特性以及物件持有的屬性值。

  • 行為,表示物件根據其狀態變化執行的外部可見活動。

可以根據應用程式的需要對物件進行建模。物件可能具有物理存在,例如客戶、汽車等;也可能具有無形的概念存在,例如專案、流程等。

類表示具有相同特性並表現出共同行為的物件集合。它提供了可以從中建立物件的藍圖或描述。建立作為類成員的物件稱為例項化。因此,物件是類的例項。

類的組成部分包括:

  • 一組屬性,用於將要從類例項化的物件。通常,類的不同物件在屬性值上存在一些差異。屬性通常稱為類資料。

  • 一組操作,描繪類物件的 behaviour。操作也稱為函式或方法。

示例

讓我們考慮一個簡單的類Circle,它表示二維空間中的幾何圖形圓。該類的屬性可以識別如下:

  • x-coord,表示中心的x座標
  • y-coord,表示中心的y座標
  • a,表示圓的半徑

其一些操作可以定義如下:

  • findArea(),計算面積的方法
  • findCircumference(),計算周長的方法
  • scale(),增加或減小半徑的方法

在例項化期間,至少為某些屬性賦值。如果我們建立一個物件my_circle,我們可以為其賦值 x-coord: 2, y-coord: 3, 和 a: 4 來描述其狀態。現在,如果對my_circle執行scale()操作,縮放因子為2,則變數a的值將變為8。此操作會改變my_circle的狀態,即物件表現出某種行為。

封裝和資料隱藏

封裝

封裝是將屬性和方法都繫結到類中的過程。透過封裝,可以隱藏類的內部細節。它允許僅透過類提供的介面從外部訪問類的元素。

資料隱藏

通常,類的設計使得其資料(屬性)只能被其類方法訪問,並與外部直接訪問隔離。這個隔離物件資料的過程稱為資料隱藏或資訊隱藏。

示例

在Circle類中,可以透過使屬性對類外部不可見並向類新增另外兩種訪問類資料的方法來實現資料隱藏,即:

  • setValues(),為x-coord、y-coord和a賦值的方法
  • getValues(),檢索x-coord、y-coord和a的值的方法

這裡,物件my_circle的私有資料不能被Circle類中未封裝的任何方法直接訪問。而應該透過setValues()和getValues()方法訪問。

訊息傳遞

任何應用程式都需要許多物件以和諧的方式互動。系統中的物件可以使用訊息傳遞相互通訊。假設一個系統有兩個物件:obj1和obj2。如果obj1希望obj2執行其方法之一,則obj1會向obj2傳送訊息。

訊息傳遞的特點包括:

  • 兩個物件之間的訊息傳遞通常是單向的。
  • 訊息傳遞使物件之間所有互動成為可能。
  • 訊息傳遞本質上涉及呼叫類方法。
  • 不同程序中的物件可以參與訊息傳遞。

繼承

繼承是一種機制,它允許透過擴充套件和改進其功能來從現有類建立新類。現有類稱為基類/父類/超類,新類稱為派生類/子類/子類。子類可以繼承或派生超類(超類)的屬性和方法,前提是超類允許這樣做。此外,子類可以新增自己的屬性和方法,並可以修改任何超類方法。繼承定義了“is-a”關係。

示例

從哺乳動物類,可以派生許多類,例如人類、貓、狗、牛等。人類、貓、狗和牛都具有哺乳動物的獨特特徵。此外,每種動物都有其自身的特殊特徵。可以說,牛“is-a”哺乳動物。

繼承的型別

  • 單繼承 - 子類派生自單個超類。

  • 多繼承 - 子類派生自多個超類。

  • 多層繼承 - 子類派生自一個超類,而該超類又派生自另一個類,依此類推。

  • 層次繼承 - 一個類有多個子類,每個子類可能又有後續子類,持續多個級別,從而形成樹狀結構。

  • 混合繼承 - 多繼承和多層繼承的組合,形成網狀結構。

下圖描述了不同型別繼承的示例。(此處應插入圖例)

Inheritance

多型性

多型性最初是一個希臘詞,意思是能夠採用多種形式。在面向物件正規化中,多型性意味著根據操作所作用的例項以不同的方式使用操作。多型性允許具有不同內部結構的物件具有共同的外部介面。多型性在實現繼承時特別有效。

示例

讓我們考慮兩個類,Circle和Square,每個類都有一個方法findArea()。儘管類中的方法名稱和目的相同,但內部實現,即計算面積的過程,對於每個類都是不同的。當Circle類的物件呼叫其findArea()方法時,該操作會找到圓的面積,而不會與Square類的findArea()方法發生衝突。

泛化和特化

泛化和特化表示類之間層次關係,其中子類繼承自超類。

泛化

在泛化過程中,類的共同特性被組合起來形成更高層次層次結構中的類,即子類組合起來形成泛化的超類。它表示“is-a-kind-of”關係。例如,“汽車是一種陸地車輛”,或“船是一種水上車輛”。

特化

特化是泛化的逆過程。在這裡,物件的組的區分特徵用於從現有類形成專用類。可以說,子類是超類的專用版本。

下圖顯示了泛化和特化的示例。(此處應插入圖例)

Specialization

連結和關聯

連結

連結表示一個連線,透過該連線物件與其他物件協作。Rumbaugh將其定義為“物件之間的物理或概念連線”。透過連結,一個物件可以呼叫方法或遍歷另一個物件。連結描述了兩個或多個物件之間的關係。

關聯

關聯是一組具有共同結構和共同行為的連結。關聯描述了一個或多個類的物件之間的關係。連結可以定義為關聯的例項。

關聯的度

關聯的度表示連線中涉及的類的數量。度可以是一元、二元或三元。

  • 一元關係連線同一類的物件。

  • 二元關係連線兩個類的物件。

  • 三元關係連線三個或更多類的物件。

關聯的基數比率

二元關聯的基數表示參與關聯的例項數。基數比率有三種類型,即:

  • 一對一 - A類的一個物件與B類的一個物件相關聯。

  • 一對多 - A類的一個物件與B類的多個物件相關聯。

  • 多對多 - A類的一個物件可能與B類的多個物件相關聯,反之亦然。

聚合或組合

聚合或組合是類之間的一種關係,透過這種關係,一個類可以由其他類的物件的任意組合構成。它允許物件直接放置在其他類的主體中。聚合被稱為“部分-整體”或“具有-一個”關係,能夠從整體導航到其各個部分。聚合物件是由一個或多個其他物件組成的物件。

示例

在這種關係中,“一輛汽車具有一個發動機”,汽車是整體物件或聚合體,而發動機是汽車的“一部分”。聚合可以表示:

  • 物理包含 − 例如,一臺電腦由顯示器、CPU、滑鼠、鍵盤等組成。

  • 概念包含 − 例如,股東具有股份。

物件模型的優勢

既然我們已經瞭解了面向物件的核心概念,那麼值得注意的是這種模型所提供的優勢。

使用物件模型的優勢在於:

  • 它有助於加快軟體開發速度。

  • 易於維護。如果某個模組出現錯誤,程式設計師可以修復該特定模組,而軟體的其他部分仍然可以正常執行。

  • 它支援相對輕鬆的升級。

  • 它能夠重用物件、設計和功能。

  • 它降低了開發風險,尤其是在複雜系統整合方面。

廣告