我有一个API,其中有属性访问器,如:
int foo()
有时属性可以为“null”。由于int不能为null,因此使用额外的属性来处理它以检查null。
bool hasFoo()
当人们调用foo()时,会发生什么? foo()的实现不是具有未定义的行为,而是在内部检查hasFoo()和panics,这通常会使用错误消息来杀死线程或进程。
随着花车,事情变得更加有趣。此API中的浮点值具有空值:NaN。float bar()
当hasBar()返回false时,bar将始终返回NaN,这是很好定义的行为。事实上,大多数类型,字符串,日期等都有有效的“空”表示。 int和bools是奇数,其中0可以是有效值。
所以我的问题是,当hasBar()为false时,bar()是否也会因为与int和bools一致而感到恐慌?或者也许它是int和bools,当它们为null时应该返回0,并且只有通过调用hasFoo()才能告诉真实0和空0之间的区别。什么行为不那么令人惊讶?为什么呢?
答案 0 :(得分:2)
案例1:bar()在hasBar()为false时也会发生恐慌
这对我来说并不会令人感到惊讶,好像我没有给浮点数赋予任何东西,我不应该期待任何回报。返回NaN是一种方便的方法,可以避免程序中的异常并让它完成它正在尝试的操作,但如果你正在设计自己的方法来实现它,那就不那么令人惊讶了。但是这会带来其他问题,因为你必须捕获每个抛出的异常并以一些优雅的方式处理。
案例2:只能通过调用hasFoo()来区分真实0和空0
这肯定会令人惊讶,因为不是每个人都知道他们需要检查另一个值来验证这是否为0,但是你将在这里优雅地处理异常。
答案 1 :(得分:1)
如果API将返回可空值,作为开发人员,我最希望返回类型可以为空,如果语言支持它(https://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx)
除此之外,如果您希望将大量空值作为常规用例,那么创建返回的包装器响应对象可能会更好,类似于此伪代码示例:
public class Response<T>()
{
bool HasValue { get; }
T Value { get; }
}
因此,使用这种方法,您将返回Response&lt; int&gt;而不是int和Response&lt;浮动&gt;而不是漂浮...等。