学习.NET架构设计系列:OO设计初次见面(5)
这个结构看上去和刚才那个似乎没有什么不同,其实差别是很大的。上面的那个Deposit只是缴费记录,这里的Entry是账目,包括缴费、扣费、滞纳金……所有的费用。销账扣费的过程不应该记录在账单中,而是应该以账目的形式记录下来。Account的代码片段如下:
public class Account
{
public Bill[] GetBills()
{
//按时间顺序返回所有的账单
}
public Bill GetBill(DateTime month)
{
//按照月份返回某个账单
}
public Entry[] GetEntrees()
{
//按时间顺序返回所有账目
}
public void Pay(float money)
{
//缴费
//先添加一个账目,然后冲销欠费的账单
}
public Bill GenerateBill(DateTime month)
{
//出账
//先添加一个账单,然后用余额冲销这个账单
}
public float GetBalance()
{
//返回账户的结余
//每一条账目的金额总和,就是账户的结余
}
public float GetDebt()
{
//返回账户的欠费
//每一个账单的欠费金额综合,就是账户的欠费
}
}
Entry有很多种类型(存入、支取、滞纳金、赠送费),可以考虑可以为每一种类型创建一个子类,就像这样:
搞成父子关系看起来很复杂、麻烦,并且目前也看不出将这些类型作为Entry的子类有哪些好处。所以我们决定不这样做,只是简单的把这几种类型作为Entry的一个属性。Entry的代码片段如下:
{
public DateTime GetTime()
{
//返回账目发生的时间
}
public float GetValue()
{
//返回账目的金额
}
public EntryType GetType()
{
//返回账目的类型(存入、扣除、赠送、滞纳金)
}
public string GetLocation()
{
//返回账目发生的营业厅
}
public Bill GetBill()
{
//如果这是一次扣除,这里要返回相关的账单
}
}
Entry是一个枚举类型,代码如下:
{
Deposit = 1,
Withdrawal = 2,
Penalty = 3,
Present = 4
}
下面的界面显示的就是刚才那个账户的账目。要显示这个界面只需要调用Account的GetEntrees方法,得到所有的账目,然后按时间顺序显示出来。这个界面上的消费情况就明确多了,用户很容易弄明白某个缴费是在哪几个月份被消费掉的。
并且,发票上的那几个一直搞不明白的数值也有了答案。比如2005年6月份的发票,我们先看看2005年6月份销账的所有账目(第六行、第八行),这两次一共扣除73.66元,这个金额就是本次消费;两次扣除之间存入200元,这个就是本次实缴;第五行的结余是17.66元,这就是上次结余;第八行上的结余是144元,这个就是本次结余。
用户检查了这个设计,觉得这样的费用显示明确多了。尽管一些措辞不符合习惯的业务词汇,但是他们的概念都是符合的。并且上次还有一个需求没有说:有时候需要把多个月份的发票合在一起打印。按照这样的账目表达方式,合并的发票数值也比较容易搞清楚了。明确了这样的对象关系,实现这个需求其实很容易。