【问题标题】:design patterns for currency conversion?货币转换的设计模式?
【发布时间】:2011-02-16 11:12:23
【问题描述】:

我想知道我们是否可以将设计模式应用于编写货币转换的代码,如果可以,那么它们会是什么?假设转化率是静态的,我们可以对其进行硬编码。

我考虑过使用“状态模式”,其中每个状态都代表一种特定的货币,并将公式封装到相应的转换方法中,例如'toDollars()'、'toPounds()' 等

另一种可能性(不确定它是否是一种设计模式)是使用从特定货币转换为另一种货币的函数对象,并将它们作为值存储在 2 级哈希表中,其中第一级键是“来自”货币,而第二级键是“to”货币。

是否有任何其他设计模式适用于这个问题?最抽象层面的问题是我们有“m”个实体,它们都是基于某些特定规则的可相互转换的。示例是将时区值相互转换;不同日历类型(公历/中文)等的日历日期相互转换。

感谢和问候!

【问题讨论】:

    标签: design-patterns currency


    【解决方案1】:

    从学习/设计的角度来看,这个问题完全是落后的,因为目标不应该是应用设计模式,而是解决问题并就解决方案进行交流,设计模式对此有帮助。

    但既然你问:根据需求,大量的设计模式可能是有意义的:

    • 责任链:有一个转换器列表,您一个接一个地咨询,直到可以转换手头的货币
    • 工厂方法:根据原始货币和目标货币创建转换器
    • 外观/装饰器:从另一种货币和转换器创建一种货币的金额,对客户端隐藏 api。
    • 单例:如果您想确保每次转换只有一个转换器
    • 值对象 ...

    我推荐这个视频:http://www.infoq.com/presentations/Value-Objects-Dan-Bergh-Johnsson 这个问题有点矫枉过正,但它恰好使用货币转换作为价值对象的例子......

    【讨论】:

      【解决方案2】:

      转换是简单的算术,为什么需要花哨的代码结构? 您基本上有一个与货币代码匹配的转换率表(如果您想从任何转换为​​任何而不是从一个转换为任何并返回,则为网格)。 从表格或网格中选择正确的比率,然后执行简单的除法或乘法运算(取决于转换的方向)。

      不需要设计模式,除非您想要真正花哨并为每个特定转换(从到对)创建一个类,在这种情况下,您可能会查看工厂以根据货币代码创建这些类的实例你交给工厂。 在工厂上放置一个装饰器或外观,所以你所要做的就是调用一个方法,然后调用工厂并使用结果。 谁知道呢,您可能希望将该外观设为单例,这样您就不必创建多个实例。

      但是对于这个问题来说,所有这些都是多余的,尽管它们可能适用于将转换作为其功能的一部分并希望通过通用接口(如插件架构)公开不同计算的系统中。

      【讨论】:

        【解决方案3】:

        基本上,货币换算是一个图问题,节点对应不同货币,边对应不同货币之间的换算。使用例如广度优先搜索很容易找到最短的转换路径,并且在找到两种货币之间的联系后,您可以在它们之间创建新的直接优势。为了使图形快速处理,您可以单独存储每个节点并将节点的连接存储在从货币名称到边的映射中。边缘将存储转换率和指向目标/源货币节点的指针。或者,您可以使用图形的矩阵表示。使用有向或无向图很容易将其应用于对称和非对称转换。但是,非对称汇率在找到联系后使用单独的计算可能比将它们存储在图表中更好,除非您有一个完整的所有货币之间的转换表。

        没有必要比这更花哨,尤其是在您拥有静态转化率的情况下。使用 toPounds() 之类的函数对所有内容进行硬编码似乎并不明智,除非您的货币很少。像 convert(int amountInFixedPoint, string fromCurrency, string toCurrency) 这样的 API 更加灵活。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多