0

想象一下,您有一个将整数转换为罗马字符串的函数:

public String roman(int)

只有 1 到 3999(含)之间的数字可以转换。

那么如果有人在任何 OO 语言中通过 4000,你会怎么做?

  1. 引发异常
  2. 返回“”或其他一些特殊字符串
  3. 写一个断言
  4. …</li>
4

2 回答 2

1

第 1 点:引发异常。这就是ArgumentOutOfRangeException(至少在.NET中)的目的:

if (intToConvert >= 4000)
{
    throw new ArgumentOutOfRangeException("intToConvert ", "Only numbers 1-3000 are valid for conversion.");
}
于 2012-12-19T01:28:54.457 回答
1

总的来说,我发现验证主题非常有趣。在我看来,选项 2(返回一个特殊值)不是一个好选项,因为您强制客户端执行 if/case 来检查返回的值,并且必须在任何地方重复该代码。此外,与通过调用堆栈传播的异常不同,在这种情况下,调用者几乎总是必须处理该特殊值的那个。

在 OOP 引发异常或有断言的情况下,IMO 是一种更优雅的处理方式。但是我发现由于某些原因,每种方法中的内联验证码都不能很好地扩展:

  • 很多时候,您的验证逻辑最终会比方法逻辑本身更大,因此您最终会将与代码不完全相关的东西弄得一团糟。
  • 没有适当的验证代码重用(例如范围验证、电子邮件验证等)。
  • 这取决于您的口味,但您将进行防御性编程

几年前,我参加了一个关于验证器的演讲(类似的演讲幻灯片在这里。解释它的文档曾经在http://www.caesarsystems.com/resources/caesarsystems/files/Extreme_Validation.pdf但现在它是 404 :() 并且完全喜欢这个概念。恕我直言,拥有一个采用 OO 哲学的验证框架是可行的方法。如果您想阅读它,我已经在这里这里写了几篇关于它的帖子(免责声明:帖子是我工作的公司博客的一部分)。

高温高压

于 2012-12-19T12:40:52.673 回答