我有一个值对象,它存储信息,例如金额。 getAmount()getter返回以美分为单位的金额。但是在各个地方,我们需要以美元计算金额。我能想到两种方法:
我更喜欢第二种方法。你怎么看?这两种方法的优点和缺点是什么?
答案 0 :(得分:4)
我认为最好通过指示哪些单位的重载来推广您的getter,因此我可以调用getAmount()
来获取默认值,但getAmount(Units.Dollar)
或getAmount(Units.Euro)
也是无需为每种可能的货币转换创建新的getter。
当然,这可以进一步概括,因此您可以在开尔文内部存储温度值,但可以允许getAmount(Units.Celsius)
或getAmount(Units.Rankine)
获得其他比例的温度。
答案 1 :(得分:3)
老实说我正在努力解决这个问题,因为我认为钱应该始终用小数表示,在内部用作小数,然后在输出时根据需要进行格式化。所以我可能会在输出格式化程序中处理美元/美分问题。
如果我需要处理转换到其他货币单位,那么我将创建一个Money类并将其返回到包含金额和单位信息的Money类(并且可能是与用于转换的服务的连接)根据需要)。
答案 2 :(得分:1)
这有点像品味问题。但是,在我看来,如果这些信息与相关模型无关,那么我更喜欢第一种方法。它使模型保持清洁,另一个好处是它可以重复使用那种类型的所有其他值。如果你将货币类型作为该实用方法的另一个参数,那么它会更好,这样它就更灵活了。提示:NumberFormat
。
答案 3 :(得分:1)
我更喜欢让一个类的公共API相当集中。一旦你开始添加不属于“核心”的方法,你就有可能拥有一个非常复杂的野兽。在一个几乎只保存数据的类的情况下,我会努力保持这种方式。
最终没有明确的“最佳”答案......它只是基于您的个人经验。我说,一旦你开始“污染”API就很难停止,最终你需要打破这个课程。
实用程序类还为您提供了一个放置其他相关但不完全的方法的地方,这些方法可能会随着时间的推移而找到。
如果你的目标是减少课程数量,我会说不要。如果您觉得在类中使用该方法会使代码“干净”而不是那样。
答案 4 :(得分:0)
因为封装是关于“黑盒子”场景中的数据和行为,所以我更喜欢第二种,用于面向对象的说服。
答案 5 :(得分:0)
我喜欢选项1,因此它可以用于任何可能以美分为单位的值,而不仅仅是该特定类中的特定字段。它使代码可以在代码中的其他地方使用而无需重复代码。