在查詢介面結果類設計中,有這麼一種思路,即把查詢的真實結果和結果碼組合起來,形成乙個結果類,當呼叫方使用該介面時,先判斷結果是否是成功結果,然後進行相應的處理。
乙個示例如下:
/**
* 列表查詢結果。
* * 請在處理成功時[ 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...