抽象是形成概念的必要手段,它是從許多事物中捨棄個別的、非本質的特徵,抽取共同及本質性的特徵的過程。
抽象是面對物件方法中使用最為廣泛的原則。類是物件的抽象;資料成員是事物靜態特徵的抽象;成員函式是事物動態特徵的抽象。在軟體開發領域,早在物件導向方法出現之前就已經開始運用抽象的原則,主要是過程抽象和資料抽象。
過程抽象是指任何乙個完成確定功能的操作序列,使用都可以把它看作乙個單一的實體。運用過程抽象,開發者可以把一些複雜的功能分解為一些子功能。
資料抽象是根據施加於資料之上的操作來定義資料型別,並限定資料的值只能由這些操作來修改和觀察。20世紀70年代後期形成的抽象資料型別理論明確提出把資料及其操作結合成乙個整體並實行資訊隱蔽,這是對資料抽象原則的進一步發展。
軟體開發者將被開發的整個業務範圍稱作「問題域」,可以按如下步驟考慮發現物件並建立物件層:
問題域側重客觀存在的事物與系統中物件的對映;系統責任側重於系統責任範圍內的每一項職責都應落實到某些物件進行完成。
要正確運用抽象原則,緊緊圍繞系統責任這個目標去進行抽象。抽象就意味著要有所取捨,取捨的準則是看被觀察的事物及其特徵是否與當前的目標有關。
在ooa中正確的運用抽象原則,首先要捨棄與系統責任無關的事物,只注意與系統責任有關的事物;其次,對於與系統責任有關的事物,要捨棄那些與系統責任無關的特徵。判斷事物是否與系統責任有關,一是看該事物是否為系統提供了有用的資訊,二是看它是否向系統提供了某些服務。
要想進行正確的抽象,還需要考慮一些更深入的問題,即應該把問題域中的事物對映為哪種物件,以及如何對這些物件進行分類,而且分類的方法也不是唯一的。
尋找候選物件要從問題域、系統邊界和系統責任三個方面著手。
⑴ 考慮問題域中可以啟發分析人員發現物件的因素;
⑵ 考慮系統邊界可以啟發分析人員發現一些與系統邊界以外的活動者進行互動並處理系統對外介面的物件;
⑶ 考慮系統責任可以檢查所存在的疏漏,通過對照系統責任所要求的每一項功能,檢視是否可以由現有物件完成。
為了盡可能全面的發現系統所需要的物件,分析員應該首先盡可能地找出各種有用的候選物件,然後對發現的候選物件逐個進行嚴格的審查,篩選掉那些不必要的物件,或者對它們進行適當的調整與合併,使系統中物件和類的數量盡可能的少一些。對物件進行審查和篩選,一般要遵循以下原則:
⑴ 捨棄無用的物件;
⑵ 物件精簡;
⑶ 目前不需要考慮的物件。
一般如果有以下情況都算異常情況,需要進行調整。
⑴ 類的資料成員和成員函式不適合該類的全部物件;
⑵ 不同類的資料成員或成員函式相同或相似;
⑶ 對同一事物的重複描述。
① 考慮物件有哪些直觀的資料成員;
② 在當前的問題域中,這個物件應該有哪些資料成員;
③ 根據系統責任的要求,這個物件應該有哪些資料成員;
④ 考慮建立這個物件是為了儲存和管理哪些資訊;
⑤ 考慮物件為了在服務中實現其功能,需要增設哪些資料成員;
⑥ 考慮物件有哪些需要區別的狀態,是否需要增設資料成員;
⑦ 考慮用什麼資料成員表示整體——部分結構和例項連線,對於整體——部分結構,整體物件應有表明其部分物件的資料成員。
審查和篩選可對每個資料成員提出以下問題:
① 這個資料成員是否體現了以系統責任為目標的抽象;
② 這個資料成員是否描述了這個物件本身的特徵;
③ 該屬性是否符合人們日常的思維習慣;
④ 這個資料成員是不是可以通過繼承來得到;
⑤ 是否是可以從其他資料成員直接匯出的資料成員。
使用中要注意區分成員函式、非成員函式和友元函式三者,c++會自動產生一些看不到的預設成員函式,如建構函式、析構函式等。除了從系統責任和問題域方面考慮外,還要分析物件的狀態以及追蹤服務的執行路線,一般要研究物件的狀態和轉換圖。最後還要檢查每個成員函式是否真正有用,它們是否有很強的內聚性。
定義物件之後,需要研究類之間的關係。
分析員應該學習一些與當前問題域有關的分類學的知識,因為問題域現行的分類方法往往比較正確的反映了事物的特徵、類別以及各種概念的一般性與特殊性(恰好對應c++的基類與派生類概念)。
如果該問題域沒有可供參考的分類方法,可以按照自己的常識,從各種不同的角度考慮事物的分類,從而發現其基類與派生類的關係。需要提醒的是,分類要考慮是否符合分類學常識,基類與派生類結構中的各個類之間的關係應該符合分類學的常識和人類的日常思維方式。
發現基類與派生類的類結構,可以把每個類看作是乙個物件的集合,分析這些集合之間的包含關係,如果乙個類是另乙個類的子集,則它們就應該組織到同乙個基類與派生類的結構中去。
對於系統中的每乙個類,一是看乙個類的成員是否適合這個類的全部物件;另一方面檢查是否有兩個或更多的類含有一些共同的資料成員和成員函式。
公有繼承實際上是由兩個不同部分組成的,即函式介面的繼承和函式實現的繼承,概括如下:
① 繼承的總是成員函式的介面;
② 宣告純虛函式的目的是使派生類僅僅繼承函式介面,而純虛函式的實現則由派生類去完成;
③ 宣告虛函式的目的是使派生類既能繼承對此虛函式的實現,又能繼承虛函式提供的介面;
④ 宣告實函式的目的是使派生類既能繼承基類對此實函式的實現,又能繼承實函式提供的介面。
它的兩個特徵,一是它們必須由繼承它們的非抽象類重新說明;二是它們在抽象中沒有定義。
虛函式一般提供乙個可供派生類選擇的實現。
當乙個成員函式是實函式時,無論派生類如何變化,它都是不會有所變化的。
學習筆記十 物件導向程式設計
1.一般可以使用派生型別物件對基類物件進行賦值和初始化。但編譯器不會自動將派生型別物件轉換為基類型別物件。對物件進行初始化和賦值和可以自動轉換引用和指標,之間的區別是微妙的,必須好好理解。但是我理解不了,敘述見primer中文版第四版488頁 2.派生類只能初始化直接基類。3.只含有類型別或內建型別...
學習筆記十 物件導向程式設計(五)
正確的道路是這樣 吸取你的前輩所做的一切,然後再往前走。本講內容 抽象類 初始化塊 一 抽象類 物件導向中,所有的物件都是某乙個類的例項,但是並不是每個類都可以例項化成乙個物件。如果乙個類中沒有足夠的資訊來描繪乙個具體的物件,那麼這個類就不能被例項化,我們稱之為抽象類。抽象類用來描述一系列看起來不同...
二十 物件導向 property使用
一.property使用 乙個靜態屬性property本質就是實現了get,set,delete三種方法 class foo property defaaa self print get的時候執行我啊 aaa.setter defaaa self,value print value,print se...