• 沒有找到結果。

2 重構後的合成引擎架構

在 Chapter 3 中,我們已詳細說明各個合成規則以及合成時的步驟與順序。

在本節中,我們將依循這樣的程式邏輯實作出合成規則引擎。並針對合成引擎先 前架構所面臨的問題,提出解決方案。

4.2.1. 消除重複的程式碼:合成引擎的改良

由 Figure 4-1 中可以知道,程式間一個很大的問題在於,許多 method 之間 的程式結構其實大多相同,也就是系統中其實有許多重複的程式碼,分散出現在 不同的 method 中。而在各別的 method 裡,只是在某些地方增加了些許不同的功 能。以沖調咖啡的例子來說,在調味咖啡的步驟中,A 口味的咖啡要加一匙奶精 兩匙糖,B 口味的咖啡要加一匙奶精但不加糖,泡兩種咖啡的步驟幾乎相同,差 別只在於最後加幾匙糖的步驟。

在重構前的合成引擎中,我們也可以發現這樣的關係。例如 enumeration() 和 enumerationWithStateBB()這兩個 method,後者的程式結構幾乎和前者完全相 同,也就是說,兩者都使用 Com1 和 Com2(詳見 Chapter 3)進行狀態的展開;

不同處只是在於 enumerationWithStateBB()在合成狀態數到達使用者所指定的數 目時,合成引擎會交由最小化引擎進行即時化減。在 contextContraint()中,也僅 是在基本的合成規則,即 Com1 和 Com2 中,加入了本文限制的合成規則 Com3,

所以在程式結構上,contextConstraint()也和 enumeration()有著諸多類似之處。

有許多方式可以消除程式中重複的程式碼[19][23]。在本研究中,我們引入

Template Method Design Pattern[8][23]於重構後的架構中。我們在父類別中定義完 整的演算法基礎步驟,並組織成適當的 abstract method,細節則留給各個子類別,

依照個別的目的去填補或改寫。

Template Method Design Pattern 的架構提供的好處在於,演算法的不變之處

只需要撰寫一次,其它會變動之處留待子類別完成。而子類別中重複的行為,也 可以交由父類別的 method 去實作。由此可知,Template method 除了可以消除重 複的程式碼,亦是一種相當實用的程式碼再利用方式。

依照這樣的 design pattern,我們設計了一個名為 Compose 的類別。此類別 也將用來取代原有的合成引擎,新的合成引擎只留下原有單純狀態展開的功能,

並由 enumeration()這個 method 實作。其餘可能變動的部份,如合成規則的使用 和即時化減的方式,我們交由 Rule(即重構後的合成規則引擎)和 Minimize(即 原有的即時化減技術)這兩個繼承架構執行。當合成引擎中狀態展開時需要進行 合成規則的檢查,或是即時化減的技術時;enumeration()會分別去呼叫 Rule 和 Minimize 的物件以執行合成規則的檢查和最小化。Compose 的類別圖如 Figure 4-2 所示。而 Rule 和 Minimize 的實作方式,我們將在下節詳細說明。

Figure 4-2 Class diagram of Compose

4.2.2. 多型取代條件式:

相關文件