請教賬單領域的實體,值物件與服務的設計問題.

greentree發表於2009-05-07
請教賬單領域的實體,值物件與服務的設計問題.
將一堆賬單按照型別(自來水,電力,燃氣,電信)的不同分別挑揀出來,然後按照型別放在不同的籃子裡面,對於這種業務場景.
我寫了一段程式碼,但感覺明顯是過程思維,而且裡面有很多if...else...,請教我如何將其使用模式重構為OO程式碼?如何徹底消除if...else...
賬單的類為:
public class Bill {
private String barCode;//賬單條碼
private float billAmount;//賬單 金額
private float commission;//手續費
private float totalAmount;//總金額
private int type;// 賬單型別,比如(自來水,電力,燃氣,電信)
private int commitStatus;//提交狀態
private int payStatus;//是否成功繳費
private Date commitDate;//賬單提交時間
private MemberCard card; //支付賬單所使用的會員卡
private BsOnlineTradeRecord record;//支付所產生的交易記錄
private Date billDate;//賬單日期
private Date payDate;//支付日期
private int finalStatus;//賬單最終出來狀態

/***
set() and get()方法省略
***/

}//end of class

賬單服務類中的一個分揀不同賬單的方法:
private Map<String, List<Bill>> sortBills(List<Bill> bill){
List<Bill> waterBills = new ArrayList<Bill>();
List<Bill> electricBills = new ArrayList<Bill>();
List<Bill> gasBills = new ArrayList<Bill>();
List<Bill> telecomBills =new ArrayList<Bill>();

for(Bill b:bill){
int bType = b.getType();

if(bType==10){//賬單型別碼是10為電力賬單
electricBills.add(b);
continue;
}else if(bType==5||bType==6||bType==7||bType==8||bType==9||bType==19||bType==20){
//賬單型別碼是5,6,7,8,9,19,20中一個就為自來水賬單
waterBills.add(b);
continue;
}else if(bType==1||bType==2||bType==3){
//賬單型別碼是1,2,3中一個就為燃氣賬單
gasBills.add(b);
continue;
}else if (bType==12){//賬單型別碼是12為電信賬單
telecomBills.add(b);
continue;
}//end of if...else...
}//end of for...

Map<String, List<Bill>> resultMap = new HashMap<String, List<Bill>>();
resultMap.put("water", waterBills);
resultMap.put("electric", electricBills);
resultMap.put("gas", gasBills);
resultMap.put("telecom", telecomBills);

return resultMap;
}//end of method

請各位大哥多多指教?感覺是Model Bill中的內容有點臃腫了. 一些屬性MemberCard card 是可以拉出來做值物件的.而賬單中似乎也不應該將交易記錄 BsOnlineTradeRecord record;作為賬單的屬性.請多指教!

相關文章