【发布时间】:2020-07-15 19:44:30
【问题描述】:
来自此参考:http://functionalprogrammingcsharp.com/honest-functions
在 C# 中定义方法/函数时,我学会了更加诚实。 它表示更喜欢纯函数,以便函数始终给出签名中给出的确切返回类型。
但是当我尝试应用它时:
int Divide(int x, int y)
{
return x / y;
}
来自网站:
签名声明该函数接受两个整数并返回另一个整数。但并非在所有情况下都如此。如果我们调用像 Divide(1, 0) 这样的函数会发生什么?函数实现不遵守其签名,抛出 DivideByZero 异常。这意味着这个函数也是“不诚实的”。我们如何才能使这个函数成为一个诚实的函数?我们可以更改 y 参数的类型(NonZeroInteger 是自定义类型,可以包含除零以外的任何整数):
int Divide(int x, NonZeroInteger y)
{
return x / y.Value;
}
我不确定 NonZeroInteger 的实现是什么,他们似乎没有在网站中提供 NonZeroInteger 的任何实现,是否应该在该类中检查 0?和 我很确定如果我调用 Divide(1, null) 它仍然会显示错误,从而使函数不诚实。
为什么C#中的诚实函数示例仍然不诚实?
【问题讨论】:
-
我不确定是否存在语言障碍,但据我所知,“诚实”不是一个技术术语,我无法从您对在这种情况下的词。您能尝试用技术和客观的措辞来描述问题吗?
-
我已经阅读了链接,我认为作者有点懒惰,只是在没有任何细节的情况下将
NonZeroInteger类型扔出去。 -
我真的不明白如此严格地坚持这一点有什么意义。显然,在一定程度上“诚实”是有好处的,但如果你正在追踪每一种可能的“不诚实”可能性(这在 IMO 中是不可能的),那么你就是在浪费 很多可以花在更好的事情上的时间。更不用说你只是将可能性推向其他地方(即
NonZeroInteger的实现现在将如何处理 0?) -
大概需要某种“CreateNonZeroIntegerOrThrowExceptionIfZero”工厂方法才能 100% 诚实,但是就像@BrootsWaymb 所说的那样......有什么意义?您只是将责任推到了似乎超过收益的程度。
-
@KevinTanudjaja - 任何相当大的应用程序都不会没有错误。关于“Hello World”类型应用程序之外的复杂性,这是一个幻想。只是为了“诚实”而增加的复杂性似乎有可能引入更多错误,或者至少是一些令人头疼的问题和额外的工作。这种做法在合理的情况下很好,但不要像法律/圣经一样对待它