軟件工程複試——十一、面向對象設計

十一、面向對象設計

面向對象設計概念

​ 設計是把分析階段得到的需求轉變成符合成本和質量要求的、抽象的系統實現方案的過程。從面向對象分析
到面向對象設計是一個逐漸擴充模型的過程,即面向對象設計就是用面向對象觀點建立求解域模型的過程。

​ 分類:

  • 系統設計:確定實現系統的策略和目標高層結構

  • 對象設計:確定解空間中的類、關聯、接口形式及實現服務的算法。

面向對象設計準則

準則:

  • 模塊化(對象就是模塊。他是把數據結構和操作這些數據方法緊密的結合在一起所構成的模塊)
  • 抽象(支持過程抽象和數據抽象)
  • 信息隱藏(通過封裝性實現)
  • 弱耦合(耦合包括交互耦合和繼承耦合)
  • 強內聚(服務內聚、類內聚、一般-特殊內聚)
  • 可重用

啓發規則

  • 設計結果清晰易懂(遵循用詞一致、使用已有協議、減少消息數目、避免模糊定義等因素)
  • 一般-特殊結構深度適當
  • 設計簡單的類(避免包括太多屬性、有明確的定義、儘量簡化對象之間的合作關係、不要提供太多服務)
  • 使用簡單的協議
  • 使用簡單的服務
  • 把設計變動減至最小

軟件重用

重用也叫再用或複用,是指同一事物不作修改或稍加改動就多次重複使用。軟件重用可分爲以下3個層次:

  • 知識重用;
  • 方法和標準的重用;
  • 軟件成分的重用。

重用一般分爲以下三個級別

① 代碼重用
代碼重用是調用庫中的模塊。
形式:
第一,源代碼剪貼
是最原始的重用形式,複製或修改源代碼時可能出錯,且存在嚴重的配置管理問題。
第二,源代碼包含
配置管理問題有所緩解,所有包含它的程序都必須重新編譯。
第三,繼承
無須修改已有的代碼,就可擴充或具體化在庫中找出的類。基本上不存在配置管理問題。
② 設計結果重用
重用某個軟件系統的設計模型(求解域模型),有助於把一個應用系統移植到完全不同的軟硬件平臺上。
③ 分析結果重用
是一種更高級別的重用,重用某個系統的分析模型。特別適用於用戶需求未改變,但系統體系結構發生了根
本變化的場合。

可重用的軟件成分
  • 項目計劃
  • 成本估計
  • 體系結構
  • 需求模型和規格說明
  • 設計
  • 源代碼
  • 用戶文檔和技術文檔
  • 用戶界面
  • 數據
  • 測試用例

類構件

1、可重用軟構件的特點
爲使軟構件也像硬件集成的電路那樣,能在構造各種各樣的軟件系統時方便地重複使用,就必須使它們滿足
下列要求:
① 模塊獨立性強
具有單一、完整的功能,且經過反覆測試被確認是正確的。它應該是一個不受或很少受外界干擾的封裝體,
其內部實現在外面是不可見的。
② 具有高度可塑性
可重用的軟構件必須具有高度可裁剪性,即必須提供爲適應特定需求而擴充或修改已有構件的機制,而且所
提供的機制必須使用起來簡單方便。
③ 接口清晰、簡明、可靠
軟構件應該提供清晰、簡明、可靠的對外接口,而且還應該有詳盡的文檔說明,以方便用戶使用。

2、類構建的重用方式

① 實例重用
除了用已有的類爲樣板直接創建該類的實例之外,還可以用幾個簡單的對象作爲類的成員創建出一個更復雜
的類。
② 繼承重用
當己有的類構件不能通過實例重用方式滿足當前系統的需求時,利用繼承機制從巳有類派生出符合需要的子
類,是安全修改巳有的類構件並獲得可在當前系統中使用的類構件的有效手段。
③ 多態重用
在設計類構件時應把注意力集中在下列這些可能妨礙重用的操作上:
a. 與表示方法有關的操作。
b. 與數據結構、數據大小等因素有關的操作。
c. 與外部設備有關的操作。
d. 實現算法在將來可能會改變的核心操作。

3、軟件重用的效益

  • 質量(重用代碼質量高!)
  • 生產率(速度當然變快了)
  • 成本(直接拿來用比較省錢啊!)

系統分解

​ 在設計比較複雜的應用系統時,先把系統分解成若干個較小部分,然後分別設計每個部分。這樣做有利於降低設計的難度,有利於分工協作,也有利於維護人員對系統理解和維護。

子系統

系統的主要組成部分稱爲子系統,通常根據所提供的功能來劃分子系統。

劃分原則:
① 根據所提供的功能來劃分子系統,子系統數目應該與系統規模基本匹配。
② 各個子系統之間應該具有儘可能簡單、明確的接口。
③ 應該儘量減少子系統彼此間的依賴性。

面向對象模型

​ 面向對象設計模型由主題、類與對象、結構、屬性、服務5個層次組成。這5個層次一層比一層表示的細
節更多,可以把這5個層次想象爲整個模型的水平切片。
​ 面向對象設計模型在邏輯上都由4大部分組成,分別對應於組成目標系統的4個子系統,即問題域子系統、
人機交互子系統、任務管理子系統和數據管理子系統。

下圖是典型的面向對象模型
在這裏插入圖片描述

子系統間交互方式
在軟件系統中,子系統之間的交互有兩種可能的方式,分別是客戶一供應商(Client-supplier)關係和平等夥
伴(peer-to-peer)關係。

① 客戶一供應商關係
作爲“客戶"的子系統調用作爲“供應商”的子系統,後者完成某些服務工作並返回結果。作爲客戶的子系
統必須瞭解作爲供應商的子系統的接口,後者卻無須瞭解前者的接口。
② 平等夥伴關係
每個子系統都可能調用其他子系統,每個子系統都必須瞭解其他子系統的接口。由於各個子系統需要相互了
解對方的接口,子系統之間的交互複雜,且還可能存在通信環路。

組織系統的兩種方案

把子系統組件爲完整系統時,一般使用水平層次組織和垂直塊組織兩種方案。

①層次組織
a. 定義
軟件系統組織成一個層次系統,每層是一個子系統。上層在下層的基礎上建立,下層爲實現上層功能而提供必要的服務。每一層內所包含的對象,彼此間相互獨立,而處於不同層次上的對象,彼此間有關聯。在上、下層之間存在客戶一供應商關係。低層子系統提供服務,上層子系統使用下層提供的服務。
b. 模式分類
第一,封閉式
每層子系統僅僅使用其直接下層提供的服務。降低了各層次之間的相互依賴性,更容易理解和修改。
第二,開放式
子系統可以使用處於其下面的任何一層子系統所提供的服務。優點是減少了需要在每層重新定義的服務數
目,使系統更高效更緊湊。但其不符合信息隱藏原則。

② 塊狀組織
把軟件系統垂直地分解成若干個相對獨立的、弱耦合的子系統,一個子系統相當於一塊,每塊提供一種類型
的服務。
③ 層次和塊的組合
當混合使用層次結構和塊狀結構時,同一層次可以由若干塊組成,而同一塊也可以分爲若干層。
④ 設計系統的拓撲結構
典型的拓撲結構有管道形、樹形、星形等。應釆用與問題結構相適應的、儘可能簡單的拓撲結構,以減少子
系統之間的交互數量。

設計問題域子系統

1.概念
(1) 面向對象分析所得出的問題域精確模型,爲設計問題域子系統建立了完整的框架。
(2) 保持面向對象分析所建立的問題域結構。
(3) 面向對象設計僅需從實現角度對問題域模型做一些補充或修改。
(4) 問題域子系統過分複雜龐大時,應該把它進一步分解成若干個更小的子系統。

2、對問題域模型進行處理

  • 調整需求

  • 重用已有類

  • 把問題域類組合在一起

  • 增添一般化類以建立協議

  • 調整繼承層次

    ​ ①多重繼承機制
    ​ 使用多重繼承機制時,應該避免出現屬性及服務的命名衝突。

    ​ ②單繼承機制
    ​ 使用單重繼承機制時,必須把面向對象分析模型中的多重繼承結構轉換成單繼承結構。

設計人機交互系統

​ 在面向對象設計過程中,對系統的人機交互子系統進行詳細設計,以確定人機交互的細節,其中包括指定窗
口和報表的形式、設計命令層次等項內容。

設計策略

  • 分類用戶(把將來可能與系統交互的用戶進行分類)
  • 描述用戶(瞭解、記錄每類使用系統用戶的情況)
  • 設計命令層次(研究現有的人機交互含義和準則、確定初始的命令層次、精化命令層次)
  • 設計人機交互類

設計任務管理子系統

1.設計的必要性
(1) 許多對象之間往往存在相互依賴關係。
(2) 在實際使用的硬件中,可能僅由一個處理器支持多個對象。

步驟:

1、分析併發性

如果兩個對象彼此間不存在交互,或它們同時接受事件,則它們在本質上是併發的。

分析步驟:

a. 通過面向對象分析建立起來的動態模型,是分析併發性的主要依據。
b. 通過檢查各個對象的狀態圖及它們之間交換的事件,能夠把若干個非併發的對象歸併到一條控制線中。

2、設計任務管理子系統
  • 確定事件驅動型任務(主要是完成通信工作)
  • 確定時鐘驅動型任務(每隔一定時間就被觸發)
  • 確定優先任務(優先任務可用滿足高優先級或低優先級的處理請求)
  • 確定關鍵任務(其中包含有系統成功或失敗的關鍵處理)
  • 確定協調任務(當系統中存在3個以上任務時,就應該增加一個協調任務以將不同任務間的協調封裝起來)
  • 儘量減少任務數
  • 確定資源需求

設計數據管理系統

​ 數據管理子系統是系統存儲或檢索對象的基本設施,它建立在某種數據存儲管理系統之上,並且隔離了數據
存儲管理模式的影響。

一般的管理系統有以下幾種:

1、文件管理系統

文件管理系統是操作系統的一個組成部分,使用它長期保存數據具有成本低和簡單的優點。但是其文件操作級別低,爲提供適當的抽象級別還必須寫額外代碼。

2、關係數據庫管理系統

優點:

a. 理論基礎堅實
b. 提供了各種最基本的數據管理功能,例如中斷恢復,多用戶共享,多應用共享,完整性,事務支持等
c. 爲多種應用提供了一致的接口
d. 標準化的語言

缺點:

a. 運行開銷大:即使完成簡單的事務,也需要較長的時間。
b. 不能滿足高級應用的需求:關係數據庫管理系統是爲商務應用服務的,商務應用中數據量雖大但數據結
構卻比較簡單。
c. 與程序設計語言的連接不自然:SQL語言支持面向集合的操作,是一種非過程化的語言;然而大多數程
序設計語言本質上卻是過程性的,每次只能處理一個記錄。

3、面向對象數據庫管理系統

① 擴展的關係數據庫管理系統
在關係數據庫的基礎上,增加了抽象數據類型和繼承機制,此外還增加了創建及管理類和對象的通用服務。
② 擴展的面向對象程序設計語言
擴充了面向對象程序設計語言的語法和功能,增加了在數據庫中存儲和管理對象的機制。可以使用統一的面
向對象觀點進行設計,不需要區分存儲數據結構和程序數據結構。

設計數據管理子系統

設計數據管理子系統既要設計數據的格式也要設計相應的服務。

書上278頁有很多例子,各位自己看一看。

設計類中的服務

確定類中服務

(1) 確定服務的總體思想
① 對象模型是進行對象設計的基本框架。必須把動態模型中對象的行爲以及功能模型中的數據處理轉換成由
適當的類所提供的服務。
② 動態模型中狀態圖中的狀態轉換執行對象服務的結果。
③ 功能模型指明瞭系統必須提供的服務。
(2) 確定操作目標對象的啓發規則
① 如果某個處理的功能是從輸入流中抽取一個值,則該輸入流就是目標對象。
② 如果某個處理具有類型相同的輸入流和輸出流,而且輸出流實質上是輸入流的另一種形式,則該輸入輸出
流就是目標對象。
③ 如果某個處理從多個輸入流得出輸出值,則該處理是輸出類中定義的一個服務。
④ 如果某個處理把對輸入流處理的結果輸出給數據存儲或動作對象,則該數據存儲或動作對象就是目標對
象。
(3) 確定處理歸屬的啓發規則
① 如果處理影響或修改了一個對象,則最好把該處理與處理的目標聯繫在一起。
② 考察處理涉及的對象類及這些類之間的關聯,從中找出處於中心地位的類。

設計實現服務的方法

主要完成以下工作:

  • 設計實現服務的算法

    主要考慮以下因素:

    • 算法複雜度
    • 容易實現容易理解
    • 易修改
  • 選擇數據結構

  • 算法與數據結構的關係

    • 分析問題尋找數據特點,提煉出所有可行有效的算法
    • 定義與所提煉算法相關聯的數據結構
    • 依據此數據結構進行詳細設計
    • 進行一定規模的實驗和評測
    • 確定最佳設計
  • 定義內部類和內部操作

設計關聯

在對象模型中,關聯是聯結不同對象的紐帶,它指定了對象相互間的訪問路徑。

關聯的遍歷一般分爲單向遍歷和雙向遍歷。

實現單項關聯

用指針可以方便的實現單向關聯。下面是用指針實現單向關聯具體例子。

其中a爲關聯b爲實現

單向關聯:

在這裏插入圖片描述

實現雙向關聯

① 只用屬性實現一個方向的關聯
如果兩個方向遍歷的頻度相差很大,而且需要儘量減少存儲開銷和修改時的開銷,則這是一種很有效的實現
雙向關聯的方法。
② 兩個方向的關聯都用屬性實現
這種方法能實現快速訪問。當訪問次數遠遠多於修改次數時,這種實現方法很有效。如下圖所示

在這裏插入圖片描述
]③ 用獨立的關聯對象實現雙向關聯
關聯對象不屬於相互關聯的任何一個類,它是獨立的關聯類的實例,如下圖所示。

在這裏插入圖片描述
關聯對象的實現

用一個關聯類來保存描述關聯性質的信息,關聯中的每個連接對應關聯類的一個對象。

設計優化

首先要確定各項指標的相對重要性(優先級)

在效率和清晰度之間尋求適當的折中方案。在折中方案中設置的優先級應當是模糊的。

提升效率的幾項技術

  • 增加冗餘關聯以提高訪問效率
  • 調整查詢次序
  • 保留派生屬性

調整繼承關係

繼承關係能夠爲一個類族定義一個協議,並能在類之間實現代碼共享以減少冗餘。在面向對象設計中,建立良好的類繼承非常重要。

①抽象與具體
在設計類繼承時,很少使用純粹自頂向下的方法,通常的做法如下:
a. 創建滿足具體用途的類,然後對它們進行歸納。
b. 歸納出一些通用的類以後,根據需要再派生出具體類。
c. 進行一些具體化的工作後,再次歸納。

各位可以去看以下書上285頁的例子以加深理解

② 爲提高繼承程度而修改類定義
在一組相似的類中存在公共的屬性和公共的行爲時,可以把這些公共的屬性和行爲抽取出來放在一個共同的
祖先類中,供其子類繼承。。在對現有類進行歸納的時候,要注意下述兩點:
a. 不能違背領域知識和常識。
b. 應該確保現有類的協議不變。
③ 利用委託實現行爲共享
僅當存在真實的一般一特殊關係(子類確實是父類的一種特殊形式)時,利用繼承機制實現行爲共享纔是合
理的。

課後題

1、

(1) 模塊化
對象是面向對象軟件系統中的模塊,它是把數據結構和操作這些數據的方法緊密地結合在一起所構成的模
塊。
(2) 抽象
面向對象的程序設計語言不僅支持過程抽象,而且支持數據抽象,對象類實際上是具有繼承機制的抽象數據
類型。
(3) 信息隱藏
在面向對象的軟件中,信息隱藏通過對象的封裝來實現,即類結構分離了接口與實現,從而支持了信息隱藏。
(4) 弱耦合
① 交互耦合
對象間的耦合通過消息連接來實現,則這種耦合是交互耦合。要使交互耦合儘可能鬆散。
② 繼承耦合
繼承是一般類與特殊類之間耦合的一種形式。通過繼承關係結合起來的基類和派生類構成了系統中粒度更大
的模塊,因此,它們彼此之間應該結合得越緊密越好。
(5) 強內聚
① 服務內聚
一個服務應該完成一個且僅完成一個功能。
② 類內聚
設計類的準則是,一個類應該只有一個用途,它的屬性和服務應該是高內聚的。
③ 一般一特殊內聚
設計出的一般一特殊結構應該是對相應的領域知識的正確抽取。緊密的繼承耦合與高度的一般一特殊內聚是
一致的。
(6) 可重用
軟件重用是提高軟件開發生產率和目標系統質量的重要途徑。重用基本上從設計階段開始。重用有兩方面的
含義:
① 儘量使用已有的類。
② 如果需要創建新類,則在設計這些新類的協議時應該考慮將來的可重複使用性。

2、

答:(1)有助於提高面向對象設計質量的主要啓發規則如下所述:
①設計結果應該清晰易懂
a.用詞一致。

b.使用巳有的協議。
C.減少消息模式的數目。
d.避免模糊的定義。
② 一般一特殊結構的深度應適當
③ 設計簡單的類
a. 不要包含過多的屬性。
b. 有明確的定義。爲使類的定義明確,分配給每個類的任務應該簡單。
c. 簡化對象之間的合作關係。
d. 不要提供太多的服務。
④ 使用簡單的協議
⑤ 使用簡單的服務
⑥ 把設計變動減至最小
(2)啓發規則的必要性
人們使用面向對象方法學開發軟件的歷史雖然不長,但也積累了一些經驗。總結這些經驗得出了幾條啓發規
則,它們往往能幫助軟件開發人員提高面向對象設計的質量。

3、

答:(1)可重用的軟構件應具備的特點:
① 模塊獨立性強。
② 具有高度可塑性。
③ 接口清晰、簡明、可靠。
(2)類構件的重用方式:
① 實例重用。
② 繼承重用。
協議時應該考慮將來的可重複使用性。

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