检查与隐式行为的显式行为

时间:2010-03-21 08:25:33

标签: .net tdd implicit explicit

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

我们正在使用winforms在客户端 - 服务器应用程序中工作。我们有一个控件,在填充另一个字段时会自动计算一些字段。因此,我们有一种现场货币,当用户填写时,将确定另一个字段的自动填充,可能还有更多字段。

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

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

我认为后一版本更清晰,更不容易出错且更易于测试。但它意味着一种冗余形式。 前一版本不是很清楚,它暗示了应用层的某种行为,而这种行为并未在测试中表达出来。也许在较低层的测试中,但是当需要修改较低层时,因此给定一个空货币应该返回其他东西,我不认为只是说没有动机的测试将成为一个障碍在上层引入一个错误。

你们有什么想法?

3 个答案:

答案 0 :(得分:2)

  

明确比隐含更好。 - 蒂姆·彼得斯的Python之禅

正如我对整个事情的理解一样,通过明确的方式,您可以通过一点点冗余获得可读性,但我总是更喜欢这种方式而不是一些模糊不清的魔术行为(第一眼看上去并不明显)。

答案 1 :(得分:1)

首先,Dinu Florin是正确的,显然通常比隐含更好(但是一个尺寸不适合所有,所以有例外)。

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

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

答案 2 :(得分:0)

我理解你的问题的方法是你在比较是否应该依赖NullReferenceException或null对象来确定下一个动作。

以下是我的想法:

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