0

假设您有以下代码块:

if (Light.On) {
    // do something...
} else if (Light.Off) {
    // do something else...
} else {
    // this state should never be reached
}

现在假设应用程序逻辑规定在这部分代码中,永远不应达到最后一个状态,但这不是在编译时可以确定的。也许还有其他状态(例如Light.Broken)可以由应用程序的其他部分设置,但这里没有使用。

else你在最后一个块中添加了什么代码?

  1. 不添加代码,因为无论如何都不应该达到它。
  2. 添加一些日志记录功能,以便作为开发人员的您知道已达到某些非法状态。
  3. 抛出异常,因为不能达到状态,如果无论如何都达到了,那么肯定有其他问题。

第一个选项对我来说似乎不合理,希望事情顺利似乎不是正确的选择。选项二的优点是您的应用程序不会立即崩溃,因此如果这种情况发生在测试中未发现的极少数情况下,客户可以继续使用该应用程序,并且会通知开发人员该问题。选项三导致应用程序崩溃,这显然不是您希望您的客户体验到的,但它确实很清楚地表明出了问题。

处理这种情况的最佳方法是什么?

编辑,根据评论:

引导讨论的一些额外考虑因素:

  • 包含上述代码的方法的合约不允许在那时设置任何其他值,然后是 On 和 Off。
  • 假设代码位于应用程序的不那么关键的部分。
4

7 回答 7

6

在开发中 - 努力失败并快速失败。抛出某种运行时异常,或者只是 Assert(false)。

在一个版本中 - 优雅地关闭。您的应用程序处于无法使用的状态,并且您无法实现通常的任何操作,例如类不变量等。让用户有机会保存他们的工作,例如,尝试记录可能发送回的错误开发团队,然后关闭。

编辑:基于添加的评论。

如果函数的合同规定灯应该在函数进入时打开或关闭,那么任何其他状态都是错误的。根据我原始答案中概述的原则,该功能应该失败。

关于“非关键”方面 - 如果未满足功能前提条件,则意味着您的应用程序已损坏。无论是否在非关键代码段中检测到错误,这并不意味着问题本身是非关键的 - 您无法知道创建无效状态的错误也不会影响代码的关键区域.

于 2009-04-15T07:45:50.407 回答
2

这要看情况。为布尔测试提供第三种情况会让我想哭。这只是噪音,增加了混乱,并告诉我开发人员至少和我感觉的一样困惑。

对于非布尔值,我想你可以做任何事情......如果ifs 捕获与相关代码相关的状态,那么忽略其他情况并没有什么害处。如果将来很有可能需要更多案例,那么为了清楚起见,评论可能足以表明这一点。

于 2009-04-15T07:47:26.923 回答
1

如前所述,在开发阶段,您应该尽快使其可见。在发布阶段,这取决于达到这种无效状态的关键程度。

至少是为了调试目的发布日志。

然后,您可以尝试通过返回到先前的有效状态或转到新的有效状态来从该无效状态中恢复。

最后,如果不能做任何安全的事情,您可以终止执行(向用户发出警报并将日志发送给维护者)。

于 2009-04-15T08:24:13.263 回答
0

第三个选项是正确的,就好像对于该部分而言,任何其他状态都无效,因此它应该抛出异常并表示无效状态。

于 2009-04-15T07:44:14.420 回答
0

不要做任何事。如果您只关心灯是否亮起:

if (Light.On) {
    // do some work
} else {
    // too darned dark to work
}

否则,您应该枚举所有状态。

如果不允许其他状态,则应出错。如果它们被允许但无关紧要,请忽略它们。使用正确设计的代码,没有问题。

您的主要问题在于可以同时设置 Light.On 和 Light.Off 的设计。您应该使用状态 Light.State ,它设置为 {on, flickering, off, broken, unplugged, exploded, emitting_dangerous_gamma_rays} 等之一。

于 2009-04-15T07:54:24.363 回答
0

抛出异常。

正如你所说,第三种情况永远不应该发生。如果确实发生了,那么就出了问题,你不知道还有什么问题。

您也不希望调用代码认为代码正常工作,而实际上它失败了。

此外,它使在发布之前发现问题变得更加容易。

于 2009-04-15T08:06:10.843 回答
0

在开发版中,只要抛出一个异常。

在发布版本中:

  • 抛出异常
  • 如果可能,将用户的工作保存在一些临时文件中
  • 保存故障转储并(使用小型帮助应用程序)为用户提供将其发送给您的选项,以便您识别和解决问题
于 2009-04-15T08:26:43.897 回答