實踐中的重構31 結果類兩種實現的比較

2021-08-31 17:41:45 字數 2223 閱讀 1027

在查詢介面結果類設計中,有這麼一種思路,即把查詢的真實結果和結果碼組合起來,形成乙個結果類,當呼叫方使用該介面時,先判斷結果是否是成功結果,然後進行相應的處理。

乙個示例如下:

/**

* 列表查詢結果。

* * 請在處理成功時[ issuccess() == true; ]才使用查詢結果物件。

* *

*/public class querylistresult

public querylistresult(resultcode resultcode)

public querylistresult(resultcode resultcode, listbooklist)

public boolean issuccess()

public listgetresultobject()

public void setresultobject(listbooklist)

public resultcode getresultcode()

public void setresultcode(resultcode resultcode)

}

該實現的優點是簡單。當需要構建乙個失敗結果的時候,呼叫單引數構造方法,當需要構建乙個成功結果的時候,呼叫雙引數構造方法。

該實現的缺點如下:

該類沒有主動保持自己的不變數,完全依賴呼叫方對該類不變數的理解。從該類的設計思路,可以很快的推出,該類應該滿足以下性質:

任何時刻,該類的結果碼不為null。

當結果碼為resultcode.success時,該結果為成功結果,呼叫方可以使用真實的結果物件resultobject。

當結果碼不為resultcode.success時,該結果為失敗結果,resultcode表明了失敗的原因,結果物件resultobject無定義。

預設建構函式導致resultcode為null,單引數建構函式有可能誤傳null或者成功碼,雙引數建構函式有可能誤傳null或者失敗碼。

總而言之,該物件的不變數的保持,必須依賴呼叫方的正確使用。

在該類的實際使用中,遵循的標準是失敗結果呼叫單引數建構函式,成功結果呼叫雙引數建構函式,但是由於建構函式和類名同名,該語義沒有清晰的表達出來。

因為所有的成功結果都是呼叫雙引數建構函式,因此,在正確使用該類的情況下,傳入的resultcode都是resultcode.success,這個實際上是一種重複和冗餘的體現。

基於以上的分析,**重構如下:

/**

* 列表查詢結果。

* * 請在處理成功時[ issuccess() == true; ]才使用查詢結果物件。

* *

*/public class querylistresult

public static querylistresult createfailedresult(resultcode resultcode)

return failedresult;

}public static querylistresult createsuccessfulresult(listbooklist) else

return successfulresult;

}public boolean issuccess()

public listgetresultobject()

public void setresultobject(listbooklist)

public resultcode getresultcode()

public void setresultcode(resultcode resultcode)

}

resultcode賦予乙個預設值resultcode.unknown_exception,保證了即使使用預設建構函式,建立的物件也是乙個合法的物件。

使用靜態方法代替建構函式來構建物件,由於靜態方法可以自定義方法名,可以明確的指明方法的使用場景。

在靜態方法中,使用防禦性程式設計,保持物件的不變數。該處也可以更為強硬的使用異常來指明引數錯誤。

**對成功結果結果碼的賦值,去除了呼叫方的對成功結果碼的冗餘重複使用。

setter和getter方法為系統框架使用,為了保持簡單,沒有加上防禦性**。

**比重構前稍微複雜一點,但是考慮到該實現可以較好的保持物件的不變數,明確了方法的呼叫場景,以及去除了冗餘**,個人認為這樣的實現優於原有實現。

java中棧的兩種實現

public class node 請自行腦補自行車鍊子,就是一種僅定義前後關係的資料結構,基於鍊錶的這種特點,我們可以實現 出棧 刪除棧頂 入棧 新增棧頂 判空 檢查棧頂元素是否為空 如下 通過鍊錶實現 public class stack return null public node pop ...

objective C 中兩種實現動畫的方法

第一種方法 uiview beginanimations curl context nil 動畫開始 uiview setanimationduration 1.25 動畫持續時間 uiview setanimationcurve uiviewanimationcurveeaseinout 動畫速度...

Oracle中spool命令實現的兩種方法比較

要輸出符合要求格式的資料檔案只需在select時用字元連線來規範格式。比如有如下表 sql select id,username,password from myuser 測試表 1 john 1234 2 jack 12345 3 rose 2345 4 joe 384657 5 tom 3846...