请教账单领域的实体,值对象与服务的设计问题.

09-05-07 greentree
    

请教账单领域的实体,值对象与服务的设计问题.

将一堆账单按照类型(自来水,电力,燃气,电信)的不同分别挑拣出来,然后按照类型放在不同的篮子里面,对于这种业务场景.

我写了一段代码,但感觉明显是过程思维,而且里面有很多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;作为账单的属性.请多指教!

    

banq
2009-05-07 10:13

Bill这个实体是华而不实,肯定要分解的,分解成一个聚合体。

再配合Specification来替代一些if else约束。