【发布时间】:2015-05-31 07:44:28
【问题描述】:
我从不喜欢 out 和 ref 参数。当我看到它们在运行时,它们让我觉得设计有些混乱。
我认为唯一的例外是所谓的 TryXXX 模式,它返回一个布尔值作为函数结果(无论一切正常还是出现问题)和一个用于实际结果的输出参数,直到我今天读到 this article 和这让我想到是否有更好的模式来实现这种方法。
我认为我们可以有一个返回多个结果的函数(或者如文章所说的一个元组)
Tuple<Exception,T> TryParseT(object obj)
或接受成功回调函数的函数:
void TryParseT(object obj,Action<T> success)
问题是,从功能设计的角度来看,哪个更好?
更新: 重新表述我的问题,我想知道这两个函数中哪一个更符合函数式编程原则,为什么?
【问题讨论】:
-
没有得到更多基于此的意见。我自己会采用可为空的方法。
-
我采用的方法是拥有一个从各种解析器返回的
Option<T>类。然后它返回None或值。更多详情请查看github.com/DavidArno/SuccincT/tree/master/SuccincT/…。 -
@DavidArno 我不明白为什么
null是邪恶的。如果处理得当并记录在案,我认为它没有任何问题。是的,它更容易出错,但这取决于开发人员。 -
@YuvalItzchakov,我向您推荐 (a) “空参考:十亿美元的错误” (infoq.com/presentations/…) 和 (b)
null完全违反直觉的事实,如证据所示无休止的“这个 NullReferenceException 是什么意思?”新手在本站询问。Null可以说是编程语言设计中最大的错误。 -
@YuvalItzchakov
null的问题在于它不尊重它所宣传的合同。一个空的string不是string,即使它说是。这就是为什么使用Option<T>方法更好的原因,因为在编写良好的库中,如果结果是null,它不会让您使用该值。如果您有兴趣,我已经写了更多关于此的内容:github.com/louthy/language-ext
标签: c# functional-programming out