1

我不确定如何构建这个问题,但我很想知道你们对以下情况有何看法以及您更喜欢哪一种。

我们正在使用 winforms 处理客户端-服务器应用程序。我们有一个控件,在填充另一个字段时会自动计算一些字段。所以我们有一个字段货币,当用户填写它时,它将确定另一个字段的自动填充,可能是更多字段。

当用户填写货币字段时,将根据用户引入的字符串从缓存中检索货币对象。如果在缓存中找不到输入的货币,缓存对象将返回空引用。当要求应用层根据货币计算其他字段时,再往下,给定一个空货币,将返回一个空的特定字段。这种方式默认的隐式行为是清除所有字段。这是预期的行为。只是为了更清楚一点,当用户输入“不可用的货币”时,他当然会收到通知,但依赖于输入的货币的字段也应该被清除。这是通过将特定控制值设置为空来完成的。

我称之为显式实现的是验证 Currency 对象是否为空,在这种情况下,依赖字段被显式清除。

我认为后一个版本更清晰,更不容易出错且更可测试。但这意味着一种冗余形式。前一个版本不太清楚,它暗示了应用层的某种行为,而在测试中没有表达出来。也许在较低层测试中,但是当需要修改较低层时,以便在给定零货币的情况下应该返回其他东西,我认为没有动机的测试不会成为阻碍在上层引入错误。

你们有什么感想?

4

3 回答 3

2

显式优于隐式。- Python 的禅宗,蒂姆·彼得斯 (Tim Peters)

据我了解,通过明确的方式,您可以获得一些冗余的可读性,但我总是更喜欢这种方式而不是一些晦涩的魔术行为(乍一看并不明显)。

于 2010-03-21T09:22:36.473 回答
1

首先,Dinu Florin 是对的,显式通常比隐式好(但一个尺寸并不适合所有人,所以也有例外)。

其次,我不确定我是否正确理解了您的问题,但您可能想看看Null-Object Pattern。这个想法是,即使没有可用数据,您的后端也应该始终返回有效的数据对象(在您的情况下为货币对象)。在这种情况下,会返回一个特殊的 Null-Object。此对象实现与普通数据对象相同的接口,但它可能包含字段的特殊值。它应该以这样一种方式设计,即您的应用程序不必区分有效的数据对象和空对象。

我不知道这是否适合您的需求,它可能不适用于您的情况,但您必须自己确定。

于 2010-03-21T10:37:39.207 回答
0

我理解您的问题的方式是您正在比较是否应该依赖 NullReferenceException 或 null 对象来确定下一步操作。

以下是我的想法:

  1. 如果您想依赖异常,请将其包装在您自己的应用程序异常中,例如 CurrencyNotFoundException。调用者将需要检查该异常并采取相应的行为。这样,引擎盖下发生的事情就更清楚了。
  2. 如果您预计从缓存中找不到货币的情况经常发生,您可能希望远离异常(这不是正常情况下的“异常”)。您可能想要选择空对象模式。使用该模式,您返回一个 NullCurrency 对象。调用者可能有匹配的显示策略,其中之一是 NullCurrencyDisplayStrategy。这样,您将永远不必依赖空检查。返回的对象是其业务域内的有效对象。

希望有帮助

于 2010-03-21T10:18:08.630 回答