一道面试题的分析(续)

前面的讨论中留下了一个问题,还没有分析完。就是表示“币种”的数据类型。因此继续讨论的话就要超出了面试题目的范围,所以另开一文。

如果对币种信息的要求只是为了区别不同Money对象所代表的货币种类,以保证只有相同币种的Money对象才能进行计算,那么无论是String, int还是enum都够了。但是,在一个稍大一点的项目中,要求可能都不会仅限于此。比如需要在显示金额的时候能显示正确的货币符号,或者一些系统中还需要显示3位的币种代码,比如用USD表示美元,RMB表示人民币。在有用户输入或者和其它系统交互的情况下,还会需要判断输入的数据是否是合法的,系统支持的币种。有这些需求的情况下,自然的,我们需要一个单独的类Currency。至于在Currency内部使用具体什么类型,参见前一篇中的讨论。

因此,Money类应该是这个样子的:

public class Money {
    private Currency currency;
    private BigDecimal amount;
   
    public Money (Currency aCurrency, BigDecimal aAmount) {
        ...
    }
   
    public Money add (Money aMoney)
    throws IncompatibleCurrencyException {
        ...
    }
   
    public Money subtract (Money aMoney)
    throws IncompatibleCurrencyException {
        ...
    }
}

如果系统中需要由用户来维护系统所能支持的币种,那么一般需要在数据库中维护一张表,此时Currency就是一个可持久化类了。

关于这个设计问题,还请参看我前面翻译的那篇“Prefactoring”的2.6节。虽然那篇文章主要讨论的是分析和领域建模阶段,但是很多讨论对于设计阶段仍然是有效的。

 

阅读更多
个人分类: Java
上一篇一道面试题的分析
下一篇Hibnerate Annotation使用注意事项
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭