類別之間的關係(Relationship) — 一般化—特殊化(Generalization-Specialization) (3) — Basic

說明

從生活面的觀點來觀察時,當發現到兩個以上的類別有其相似之處(但又不盡相同),我們可以把相似之處抽象(abstract)放在更高層次的一般性類別。例如,觀察「貓」與「狗」兩個類別,是否有可能抽象化成為一般性的類別? 兩者的品種完全不同,但其實也存在著某種程度的相似性,事實上,若我們要開發一個 “寵物店管理系統”,那麼,其實很自然,就可以將此兩個類別抽象成為「寵物」這個一般化的類別。相對來說,只要是符合「寵物」一般化類別共同特性的其它類別,包括可愛、能取悅、陪伴主人等特徵與行為,就可以成為「寵物」的特殊化類別。一般化—特殊化關係的 UML 表示法如下圖。

 

範例、一般化—特殊化的 UML 表示法
圖1、範例 一般化—特殊化的 UML 表示法

概念上,所有貓、狗的個體(instances)從定義來看也都是「寵物」的個體,那麼就可以將「貓」、「狗」等視為是「寵物」的子型態(sub-type)。由此可以看出,「貓」是一種特別的「寵物」。其中一個重要的觀念在於,所有與「寵物」有關係的特徵(features),包括關連、屬性(attributes)與操作(operations),對「貓」、「狗」、「烏龜」來說也都是成立的。

從軟體的觀點來看,對一般化關係的具體實作就是 “繼承(inheritance)” : 「貓」是「寵物」的子類別(sub-class),在主流的 OOP 語言,包括 Java 與 .NET 等,子類別會繼承超類別(super-class)的所有特性,而且還可以覆寫(override)任何超類別的方法(method)。

一般程式設計人員最容易誤解物件導向的繼承觀念就在於,以為繼承是被用來 “可重用(re-use)”的:可重用既有的程式碼。其實繼承的最重要原則是在於 “可被替代性(substitutability)”,而這正是物件導向另一個非常重要的思維– “多型(polymorphism)”:讓外界(Client)能以「一視同仁」的角度來看待多個特殊化類別所抽象出的一般化類別!

關於 "多型" ,留待在在進階主題內再行詳述。請記得,多型同時也是解決軟體複雜度的一個重要原則。

繼續閱讀 »

股票/期貨/選擇權 還真是台彎的全民運動

最近的 Iteration-2 期指投資又準備開始了。前兩天先把一小筆資金給匯入到期貨保證金帳號裡,準備先暖身一下,練練手感。結果沒想到被 『掛帳』,Hold 在「日盛期貨」的金融部門裡。原因原來是我必須申請期貨入金的約定帳戶,還真是麻煩,必須本人親自到日盛證券的櫃臺辦理。

今天早上約 11:00 到了「永安市場捷運站」的日盛證券,在 3F,嘿,好多人喔,看上去大部分是上了年紀的老伯伯、婆婆等,倒是也有年輕的小姐們也是坐在外圍看盤。很專注,每個人都佔了一個看盤的電腦,現場大約有九成的看盤電腦是被使用了,當然還有一個電視牆,也有好幾位投資戶坐在那裡看大盤的情況。

我真有些訝異,個人若是在投機交易時,是絕不願意到人群多的地方,因為人多嘴雜,很容易影響判斷。不過這些老伯伯、婆婆們等,看起來倒是蠻熱中於看盤與交易的氣氛,也看到會有幾人聚在一起討論大盤局勢的變化等。然後約中午時,還有人會帶著便當直接就在大廳吃了,好像已經是當成自家的感覺了。 :)

順便拜望一下我的營業員 『蔡大』,好久不見,不過倒是常在 msn 聯絡,看來氣色也不錯。蔡大說,這些伯伯們可都是日盛的「元老」,在這裡的資歷還比他長很多呢。

還真的呢,股票/期貨/選擇權 等這些金融商品,真的是台彎的全民運動,看來也是因為台彎民眾們的「賭性堅強」,不下去「玩」一番,手會癢,同時也就沒有「一夜致富」的美夢了。 ;D

利用 IBM RSA 實現 CoR 的塑模與產出程式碼

使用環境

  • IBM RSA(Rational Software Architect 6.0) Trial UML 工具
  • JDK 1.5

新增 UML 空白專案

首先開啟 Rational Software Architect(使用版本為 6.0),並切換 workspaces 至 \workspaces\GoFPatterns。

新增名為 CoRProject 的 UML 專案:

  1. 在工作區中,選擇File > New > Project > Other
  2. 選擇 UML Project 並選擇 Next
  3. 輸入 CoRProject 作為專案名稱,並選擇 Next
  4. 選擇範本為 “空白模型(Blank Model)”,檔名輸入為 CoRModel,然後在預設選項中勾選 在新模型中建立預設圖形,預設圖形選擇 開放式圖形(Freeform Diagram),選擇 Finish 完成。
  5. 圖1、新增 UML 空白專案

    (點擊圖片鏈接看原圖)圖1、新增 UML 空白專案

  6. 在 “模型瀏覽器(Model Explorer)” 視圖中,可以看到一個新增的 UML 空白專案。
  7. 圖2、Model Explorer 所顯示的空白 UML 專案

    (點擊圖片鏈接看原圖)圖2、Model Explorer 所顯示的空白 UML 專案

型樣瀏覽器(Pattern Explorer)

  1. 在 Windows Menu 中,選擇 顯示視圖 > Pattern Explorer (若沒有出現,則從 Other… 中選取。
  2. 在 Pattern Explorer 視圖中,展開 Design Patterns > Behavioral。
  3. 選擇 Chain of Responsibility Pattern。
  4. 要瞭解 Design Pattern 的結構圖與說明,在 Pattern Explore 視圖底部的 總覽 與 簡要說明 選項之間切換瀏覽。
  5. 圖3、Pattern Explorer 中所顯示的 CoR Pattern

    (點擊圖片鏈接看原圖)圖3、Pattern Explorer 中所顯示的 CoR Pattern

    繼續閱讀 »

利用 EA(Enterprise Architect) 實現 CoR Pattern 的塑模與產出程式碼

使用環境

  • EA ( Enterprise Architect 6.5) UML 工具
  • Eclipse 3.2
  • JDK 1.5

新增 UML 空白專案

新增 UML 空白專案
首先新增名為 CoRProject 的 UML 專案:

  1. 選擇File > NewProject 。
  2. 在 “Select model(s)” 對話框中,選擇 “simple” 並勾選 Logical View。
  3. 圖1、新增 UML 空白專案

    (點擊圖片鏈接看原圖)圖1、新增 UML 空白專案

  4. 在 “Project Browser” 中,點擊 “Logical View” 並按滑鼠右鍵選擇 Add>Add Diagram… ,在 “New Diagram” 對話框中,”Diagram Types” 選擇 “Class”,並輸入名稱為 CoR Class Diagram。
  5. 圖2、新增 Class Diagram

    (點擊圖片鏈接看原圖)圖2、新增 Class Diagram

使用 CoR 設計樣式

繼續閱讀 »

【設計樣式】「Chain of Responsibility」的範例與說明

範例描述

『敗家子』 是一部經典的武功喜劇,關於本片的劇情介紹,可以參考:【老片分享】經典功夫喜劇片—敗家子
其中,元彪所飾演的 『敗家子』,好打架,經常製造許多麻煩,但他又是九代單傳的寶貝兒子。父親怕他受傷,所以派了一個隨從 『派通街』,在背後協助解決所製造的麻煩。

敗家子是 『麻煩製造者(trouble maker)』,而派通街是 『麻煩處理者(trouble handler)』,敗家子所闖的禍,均交由派通街來處理。

而隨著製造的麻煩越多,派通街需要更多的助手來「分門別類」地處理,這些處理者逐漸有系統性地形成一種 『串鍊(chain)』,當麻煩透過派通街送進來時,第一個處理者認為麻煩不是他所處理的,就會交給後續的(successor)處理者來處理,如此依序跑完整個 『串鍊』,若沒有人可以處理,則拋出 『無法處理』 的訊息。

CoR(Chain of Responsibility) 的說明

敗家子永遠不用擔心 『誰』 來幫他處理麻煩,只要將麻煩丟給一致的介面(interface)–派通街處理即可。

視麻煩的程度或種類,交由串鍊中某一個處理者來處理,當然也有可能因麻煩大到無法解決,而沒有處理者可以處理。

這是一種 『責任的串鍊(Chain of Responsibility, CoR)』,Client 端(敗家子)不需要也不會知道 『誰』 來處理他所丟出的麻煩,如此可以降低 『Client』 與 『處理者』 的耦合(coupling)程度;但相對,』串鍊』 的處理者最好不要太多,否則因責任一直轉派的緣故,會降低處理效率。

CoR 類別圖(Class Diagram)說明

圖、CoR 的 UML 類別圖
(點擊圖片鏈接看原圖)圖、CoR 的 UML 類別圖

  • 把 『派通街』 角色設計為 『抽象類別(abstract class)』,他本身只負責制訂一致性的處理介面: handleTrouble(),與實作指向後續者(successor)的鏈結。
  • 來自 『敗家子』 的 『Trouble』 訊息,會依照麻煩的大小程度依序交給 『大、中、小』 三個具體的類別來處理;其中 『Null Trouble Handler』 類別,並非是空的,而是指麻煩超乎程度而無法處理了。
  • 『大、中、小、Null』 四個具體(concrete)的類別,會覆寫(override) 『handleTrouble()』 操作(operation),個別實作處理麻煩的方法。
  • 『麻煩(Trouble)』 被當作參數從敗家子傳給派通街,實做上可以是 『字串』、』XML』、』物件』 等。
【心智食譜分享】Kenming’s 紫米湯圓粥

紫米湯圓粥食譜心智圖
(點擊圖片鏈接可看原圖)紫米湯圓粥食譜心智圖

沒想到,我也會煮粥耶~ 而且還真的能吃、而且,還不錯吃呢。;)

就是因為星期五至日的狂拉肚子(流感病毒感染的),害得我只能吃清粥小菜,但也因為如此,才發現到吃清粥的幸福,就是簡單、營養、便宜又健康。但吃久也是有些膩,但現在我又不能吃白飯,突然想到,上次到花蓮旅遊時,「葛莉絲莊園」民宿的 Peter 老闆所煮的「紫米粥」,連我們家挑剔的蓁妮都吃了兩大碗,直呼好吃。嗯,想說我應該也能煮來試試看吧?

我是一有想法,馬上就會去做,昨晚馬上就查了網路,參考了這篇:「快鍋食譜 餐廳水準紫米粥」,確定了材料,晚上就衝過去「頂好超市」買食材。一個小插曲是,我怎麼找都找不到「紫米」,問了店員也 『霧煞煞』,好像沒進過,所以又衝到四號公園旁的「松青超市」,問了店員還是沒有。奇怪,疑惑之餘,只好買了「黑糯米」與「糙米」,想說混著煮成「糯米糙米粥」也是不錯的營養好粥。結果原來… 我還買對了,原來「黑糯米」就是「紫米」啦,而「紫米」其實是別名。 :oops:

繼續閱讀 »