《UML物件導向設計基礎》 第1章1 9節一般性

2021-09-23 16:45:56 字數 2512 閱讀 9675

1.9 一般性

uml物件導向設計基礎

一般性(genericity)指乙個或多個類內部使用的類c的結構,僅在執行時(即示例類c的物件時)才提供。

說明一般概念的最好方式是講述乙個不堪回首的故事。當時我還是一名大學生,學習一門資料結構(data structures)的課程101。有乙個學期,rossini 教授給我們留了一項作業,設計和程式設計整數有序平衡二叉樹(見圖1.22)。平衡二叉樹的主要特點是所有的葉子在同層上拉平。

在往樹中插入另乙個整數(如5 ,見圖1.23)之前,一切順利。插入整數5後,樹變得不平衡,你不得不做一些痛苦的節點調整直到樹再次平衡為止。

經過多次的桌面設計和聯機除錯,我們中間大多數人的演算法可以正常執行了。帶著滿意的笑容交出程式去度假,花費幾夜的努力去忘卻那個有序平衡二叉樹。

這種對老程式的複製極大地提高了生產率。但這種方法並非十分理想,因為存在嚴重的複製隱患。這種隱患是現在我們不得不維護三個幾乎相同的程式。

因此,如果我們發現了乙個更好的平衡樹演算法,就不得不修改三個**。這樣不僅增加了額外的工作量,而且維護三個版本也有一定的難度(除非我們有自動的複製修改程式)。我們需要一種方法,只編寫一次基本的平衡樹演算法結構,然後當我們需要對整數、客戶、產品或其他進行處理時可以應用多次(不是簡單的複製)。

此時此刻,一般性就像一匹疾駛而來的白馬拯救了我們。如果將balancedtree 定義為引數化類(正規稱為一般類),則說明至少在balancedtree中有乙個類直到執行時才賦值(引數化類在c++中稱為模板類)。可以猜到這個類就是我們例項化時,儲存在特定平衡二叉樹物件的節點中項所構成的類。

因此可以將類balancedtree寫為如下形式:

class balancedtree;

… var currentnode:classofnodeitem.new;

… currentnode.print;

注意引數化類的引數classofnodeitem。這是乙個形式引數,其實際「值」在執行時提供。例如,當例項化類balancedtree的乙個新物件時,將提供乙個真正的類名作為引數,如:

var custtree:balancedtree :=balancedtree.new;

var prodtree:balancedtree :=balancedtree.new;

因此,custtree現在表示乙個在節點中儲存類customer例項的物件(即balancedtree的例項),如圖1.24所示。當然對於prodtree是類似的。

下面的程式看起來好像將第一段程式複製了兩次(一次是為customer,一次是為product):

class balancedcustomertree;

…  var currentnode:customer:=customer.new;

… currentnode.print;

… class balancedproducttree;

…  var currentnode:product:=product.new;

… currentnode.print;

最後,注意currentnode.print語句。這是多型的乙個好例子,因為當我們在引數化類balancedtree中寫這個語句時還不知道currentnode的類是什麼。因此,例項化balancedtree時操作print應根據用於例項化特定樹的類而定義。

另舉乙個例子,如果你設計乙個引數化類hashtable,則應指出任何向c提供實際引數的類(如symbol)必須定義操作hash 。在第12章詳細討論一般性可能帶來的危險。

你可能意識到一種不用一般性也不用複製編寫balancedtree的方法。可以讓平衡樹的節點接受乙個超類/子類層次結構中最頂層的類物件。如果將該類命名為類object,則該**段為:

class balancedtree;

…  var currentnode:object:=object.new;

… currentnode.print;

現在平衡樹的每個節點將接受任何乙個物件的加入。甚至可以將客戶、整數、產品、多邊形、牛仔及馬混在相同的樹中。這幾乎沒有什麼意義。更糟的是讓這些不同的物件類理解訊息print是不太可能的。

balancedtree和hashtable都是容器類(container class)的例子。容器類用在某些(通常比較複雜)結構中儲存物件。一般性常用在物件導向中設計這樣的容器類。儘管不是必須使用一般性為容器類編寫可重用**,但它確實比複製的程式或將任意類的物件混合在同乙個容器的脆弱設計要好。

《UML物件導向設計基礎》 第1章1 3節狀態保持

1.3 狀態保持 uml物件導向設計基礎 物件導向的第三個抽象概念是物件具有保持狀態的能力。當傳統的過程模組 函式 子程式 過程等 返回到呼叫者時,不會帶來任何負作用,模組執行結束,只是將其結果返回。當同一模組再次被呼叫時就象是第一次誕生一樣。模組對以前的存在沒有任何記憶,就像人類一樣對以前的存在一...

UML物件導向設計與分析教程筆記(第1章)

1.1物件導向介紹 1 產生背景 為解決軟體開發低效率問題,提出軟體工程的思想和方法 2 計算機包含的六大要素 硬體 軟體 人員 資料庫 文件和過程 3 軟體的定義 由系統軟體 支撐軟體和應用軟體組成的軟體系統。軟體是使用者與硬體之間的介面,是計算機系統設計的重要依據 1系統軟體 管理資源和控制程式...

第4章 物件導向程式設計 1 物件導向基礎

類和物件 物件的建立和使用 面向過程 pop 面向過程以實現功能的函式開發為主,強調的是功能行為,以函式為最小單位,考慮怎麼做。物件導向 oop 物件導向,將功能封裝進物件,強調具備了功能的物件,以類 物件為最小單位,考慮誰來做。步驟建立類,設計類的成員。類的語法格式如下 建立類的物件。語法格式如下...