物件導向設計
如前所述,分析是提取和整理使用者需求,並建立問題域精確模型的過程。設計準則*是把分析階段得到的需求轉變成符合成本和質量要求的、抽象的系統實現方案的過程。從物件導向分析到物件導向設計(ood),是乙個逐漸擴充模型的過程。或者說,物件導向設計就是用物件導向觀點建立求解域模型的過程。
儘管分析和設計的定義有明顯區別,但是在實際的軟體開發過程中二者的界限是模糊的。許多分析結果可以直接對映成設計結果,而在設計過程中又往往會加深和補充對系統需求的理解,從而進一步完善分析結果。因此,分析和設計活動是乙個多次反覆迭代的過程。物件導向方法學在概念和表示方法上的一致性,保證了在各項開發活動之間的平滑(無縫)過渡,領域專家和開發人員能夠比較容易地跟蹤整個系統開發過程,這是物件導向方法與傳統方法比較起來所具有的一大優勢。
生命週期方法學把設計進一步劃分成總體設計和詳細設計兩個階段,類似地,也可以把物件導向設計再細分為系統設計和物件設計。系統設計確定實現系統的策略和目標系統的高層結構。物件設計確定解空間中的類、關聯、介面形式及實現服務的演算法。系統設計與物件設計之間的界限,比分析與設計之間的界限更模糊,本書不再對它們加以區分。
本章首先講述為獲得優秀設計結果應該遵循的準則,然後具體講述物件導向設計的任務和方法。*
11.1 物件導向設計的準則*
所謂優秀設計,就是權衡了各種因素,從而使得系統在其整個生命週期中的總開銷最小的設計。對大多數軟體系統而言,60%以上的軟體費用都用於軟體維護,因此,優秀軟體設計的乙個主要特點就是容易維護。
本書第5章曾經講述了指導軟體設計的幾條基本原理,這些原理在進行物件導向設計時仍然成立,但是增加了一些與物件導向方法密切相關的新特點,從而具體化為下列的物件導向設計準則。*
1.模組化
物件導向軟體開發模式,很自然地支援了把系統分解成模組的設計原理:物件就是模組。它是把資料結構和操作這些資料的方法緊密地結合在一起所構成的模組。
2.抽象
物件導向方法不僅支援過程抽象 而且支援資料抽象,類實際上是一種抽象資料型別,它對外開放的公共介面構成了類的規格說明(即協議),這種介面規定了外界可以使用的合法操作符,利用這些操作符可以對類例項中包含的資料進行操作,使用者無須知道這些操作符的實現演算法和類中資料元素的具體表示方法,就可以通過這些操作符使用類中定義的資料。通常把這類抽象稱為規格說明抽象。
此外,某些物件導向的程式語言還支援引數化抽象。所謂引數化抽象,是指當描述類的規格說明時並不具體指定所要操作的資料型別,而是把資料型別作為引數。這使得類的抽象程度更高,應用範圍更廣,可重用性更高。例如,c++語言提供的「模板」機制就是一種引數化抽象機制。
3.資訊隱藏
在物件導向方法中,資訊隱藏通過物件的裝性現:類結構分離了介面與實現,從而支援了資訊隱藏。對於類的使用者來說,屬性的表示方法和操作的實現演算法都應該是隱藏的。
4.弱耦合
耦合是指乙個軟體結構內不同模組之間互連的緊密程度。在物件導向方法中,物件是最基本的模組,因此,耦合主要指不同物件之間相互關聯的緊密程度。弱耦合是優秀設計的乙個重要標準,因為這有助於使得系統中某一部分的變化對其他部分的影響降到最低程度。在理想情況下,對某一部分的理解、測試或修改,無須涉及系統的其他部分。
如果一類物件過多地依賴其他類物件來完成自己的工作,則不僅給理解、測試或修改這個類帶來很大困難,而且還將大大降低該類的可重用性和可移植性。顯然,類之間的這種相互依賴關係是緊耦合的。
當然,物件不可能是完全孤立的,當兩個物件必須相互聯絡相互依賴時,應該通過類的協議(即公共介面)實現耦合,而不應該依賴於類的具體實現細節。
一般說來,物件之間的耦合可分為兩大類,下面分別討論這兩類耦合。
(1)互動耦合
如果物件之間的概合通過訊息連線來實現,則這種耦合就是互動耦合,為使互動耦合盡可能鬆散,應該違守下述準則。*
盡量降低訊息連線的複雜程度應該儘量減少訊息中包含的引數個數,降低引數的複雜程度。
減少物件傳送(或接收)的訊息數
2)繼承耦合
與互動耦合相反,應該提高繼承耦合程度,繼承是一般化類與特殊類之間耦合的一種形式。從本質上看,通過繼承關係結合起來的基類和派生類,構成了系統中粒度更大的模組。因此,它們被此之間應該結合得越緊密越好。
為獲得緊密的繼承耦合,特殊類應該確實是對它的一般化類的一種具體化,因此,如果乙個派生類摒棄了它基類的許多屬性,則它們之間是松耦合的。在設計時應該使特殊類盡量多繼承並使用其一般化類的屬性和服務,從而更緊密地合到其一般化類。
5.強內聚
內聚衡量乙個模組內各個元素彼此結合的緊密程度。也可以把內聚定義為:設計中使用的乙個構件內的各個元素,對完成乙個定義明確的目的所做出的貢獻程度。在設計時應該力求做到高內聚。在物件導向設計中存在下述3種內聚:
1)服務內聚。乙個服務應該完成乙個且僅完成乙個功能。
2)類內聚。設計類的原則是,乙個類應該只有乙個用途,它的屬性和服務應該是高內聚的,類的屬性和服務應該全都是完成該類物件的任務所必需的,其中不包含無用的屬性或務。如果某個類有多個用途,通常應該把它分解成多個專用的類
3)一般特殊內聚,設計出的一般特殊結構,應該符合多數人的概念,更準確地說這種結構應該是對相應的領域知識的正確抽取。
例如,雖然表面看來飛機與汽車有相似的地方(都用發動機驅動,都有輪子,……),但是,如果把飛機和汽車都作為「機動車」類的子類,則明顯違背了人們的常識,這樣的一般特殊結構是低內聚的。正確的作法是,設定乙個抽象類「交通工具」,把飛機和機動車作為交通工具類的子類,而汽車又是機動車類的子類。
一般說來,緊密的繼承合與高度的一般特殊內聚是一致的。
6.可重用
軟體重用是提高軟體開發生產率和目標系統質量的重要途徑。重用基本上從設計階段開始。重用有兩方面的含義*:一是盡量使用已有的類(包括開發環境提供的類庫,及以往開發類似系統時建立的類),二是如果確實需要建立新類,則在設計這些新類的協議時應該考慮將來的可重複使用性,關子軟體重用向題,將在11.3節進一步討論。
物件導向設計的準則
1.模組化 物件就是模組 把資料結構和操作這些資料的方法緊密地結合在一起 2.抽象 過程抽象 資料抽象 類 引數化抽象 c 的 模板 3.資訊隱藏 通過物件的封裝性實現類,分離了介面與實現,支援資訊隱藏 4.弱耦合 某一部分的變化對其他部分的影響降到最低程度 耦合 乙個軟體結構內不同模組之間互連的緊...
物件導向設計的幾條經驗準則
這段時間在看arthur j.riel的 object oriented design heuristics 於是參考總結了如下的幾條物件導向設計原則 所有資料都應隱藏在它所在類的內部。類的使用者必須依賴類的公有介面,但類不能依賴它的使用者。儘量減少類的協議中的訊息。實現所有類都理解的最基本的公有介...
物件導向的準則
1.3 物件導向的準則 人們編寫軟體的目的除了使用外,另乙個目的是容易修改,否則我們就改制硬體了。所以說,變更是軟體的天 性。我們不應該限制軟體的更新,而應該適應更新,創造環境使得容易更新,甚至預計可能的變化 所以我們 才有更多的工作機會 人們經過長期的經驗積累和研究認識到,具有可重用性和可維護性的...