若要實作作業,請執行下列動作:
-
選擇演算法。
-
選擇適合演算法的資料結構。
-
必要時請定義新的類別及作業。
-
編寫作業程式碼。
選擇演算法。
對於許多簡式作業,您可直接從作業及其規格實作。
非顯然 (Nontrivial) 演算法不可或缺的原因有兩種︰為了要實作已給定規格的複式作業,以及最佳化以簡式但無效率之演算法作為定義的作業。
選擇適合演算法的資料結構
選擇演算法時需同時選擇其所使用的資料結構。多數實作資料結構為儲存區類別,如陣列、清單、佇列、堆疊、集合、工具袋以及上述之變式。多數物件導向語言及程式設計環境提供類別程式庫及這些可重複使用的元件。
必要時請定義新的類別及作業
新類別也可能包含中間結果。新的低階作業可能新增到類別以拆解複式作業。這些作業通常只屬於類別,也就是在類別外是看不到的。
編寫作業程式碼
先從作業的介面陳述式開始來編寫作業程式碼。請遵循程式設計準則。
物件的狀態可藉由參照其屬性值來實作,不需特殊的表示法。 這類物件的狀態轉移將隱含於變更的屬性值中,且不同的行為將透過條件性陳述式來設計。
此解決方案不適用於複雜行為,因為它通常會導致複式結構,而此結構於狀態新增或行為變更時將不易變更。
如果設計元素(或其組成內容)行為為狀態相依,設計元素中通常會有一或多個狀態圖說明模型元素的行為。這些狀態圖在實作期間扮演重要的輸入用途。
狀態圖中顯示的狀態機讓物件的狀態明確,而轉移及所需的行為也有清楚的描述。狀態機可依下列方法來實作︰
-
簡式狀態機可藉由定義列舉可能狀態的屬性來實作,並使用該屬性來選取送入訊息之行為。例如,在 Java 或 C++ 中的切換陳述式。此解決方案無法為複式狀態機有效調整,且可能導致執行時期效能不佳。如需此方法的範例,請參閱 [DOUG98],第 4 章 4.4.3。
-
較複雜的狀態機可使用「狀態」型樣。如需「狀態」型樣的說明,請參閱[GAM94] 。[DOUG98],第 6 章 6.2.3 的 狀態型樣 中也有這個方法的說明
-
表格驅動方法適用於以變更難易度為準則的非常複雜的狀態機。在這種方式中, 表格中有每一個狀態的項目,每一個項目將輸入對映至成功狀態和相關的轉換動作。如需此方法的範例,請參閱 [DOUG98] 第 6 章 6.2.3 State Table Pattern。
由於並行子狀態代表獨立的運算(仍然可能互動),將狀態管理委派給主動物件,可以實作具有並行子狀態的狀態機,每一個物件各負責一個並行子狀態。 每一個子狀態可以利用上述其中一種技術來管理。
如果可以重複使用現有的類別來實作類別或類別的一部分,請使用委派,不要使用繼承。
委派意味著利用其他類別來實作類別。類別利用變數來參照其他類別的物件。 呼叫操作時,實際上是呼叫參照物件(重複使用的類別)的操作。 因此將責任委派給其他類別。
單向關聯實作為指標 - 包含物件參照的屬性。如果多重性是一,則實作為簡單的指標。 如果多重性是多,則是一組指標。如果多是可排序的一端,則可以使用清單來代替集合。
雙向關聯使用單向關聯的技術實作為雙向的屬性。
限定關聯在限定物件中實作為參考表(例如 Smalltalk Dictionary 類別)。 參考表中的選擇器值是限定元,目標值是其他類別的物件。
如果限定元值必須依序存取,則限定元可以設計為排序陣列或樹狀結構。 在此情況下,存取時間與對數 N 成正比,N 代表限定元值的數目。
如果從精簡有限集繪出限定元,則限定元值可以對映至整數範圍,而關聯可以有效地實作為陣列。 如果關聯幾乎填滿,而非稀疏填入,則非常適合這種方式,也很適合完全填滿的有限集。
大多數物件導向語言和程式設計環境都提供類別庫及可重複使用的元件,供實作各種不同的關聯。
實作屬性有三種方式:使用內建的初始類型、使用現有的類別或定義新的類別。 定義新的類別通常較為靈活,但會有多餘的間接性。例如,員工的「社會保險號碼」可以實作為 String 類型的屬性或新類別。
屬性的替代實作。
多個屬性也可能合併為新的類別,如下列範例所示。兩種實作都正確。
Line 的屬性實作為指向 Point 類別的關聯。
|