这个"模式"有名字吗?

Dav*_*ler 11 c# design-patterns

我不知道是否有这个"模式",其中一个方法签名被称为TrySomething,如姓名int.TryParse,decimal.TryParse等等.

我的一个同事经常使用这个命名约定 - 而不是返回值或抛出异常,他们将调用一个方法TryDoSomething,如果在处理期间捕获异常,它将通过out param返回.

编辑:我理解私有的例子不是TryParse方法的工作原理.这就是张贴这个......我不知道该怎么称呼它.我同意它似乎更像是命名约定而不是模式.感谢所有的投入.

编辑:有趣 ......

考虑可能在常见场景中抛出异常的成员的TryParse模式,以避免与异常相关的性能问题.

要实现TryParse模式,您需要提供两种不同的方法来执行可在常见方案中引发异常的操作.第一个方法X执行操作并在适当时抛出异常.第二种方法TryX不会抛出异常,而是返回一个表示成功或失败的布尔值.使用out(Visual Basic中的ByRef)参数返回成功调用TryX返回的任何数据.Parse和TryParse方法就是这种模式的例子.

use*_*116 13

我可能会称错误隐藏模式.TryX当你拥有通常会产生异常的代码时,你会受益于创建一个异常,而不是早期使用布尔值.如果你看一下框架提供的方法,你会注意到TryX变体存在,只要它是非常重要的或容易出错(或者经常应该在框架中完成)来编写自己的IsValidX方法.

如果你必须捕获异常,那么在方法中包装它是没有意义的.您所做的只是使调试输入问题变得更加困难.用户可能只看到失败方法的副作用,而不是跟踪一个好的堆栈跟踪来追踪输入失败.更糟糕的是,在调试手头的问题时,开发人员可能必须重新创建钝的程序状态才能实现故障模式.

基本上,如果先验知道操作将因异常而失败,那么提供伴随TryX操作是合乎逻辑的.这就是所谓的Tester-Doer模式.操作的事后分析不是Tester-Doer,而只是简单的异常处理.


Bal*_*a R 7

在这篇关于TryParse的帖子中,他们称之为Tester-Doer模式.


ang*_*son 6

首先,如果你的描述是准确的,那不是int.TryParse及其兄弟姐妹的工作方式.

我承认,在我看来,这些方法稍有破坏,因为它们没有向调用者传达解析失败的原因,只是它失败了.在这方面,我希望看到更好的方法来处理这个问题.

事实上,在我看来,更好的方式是我在第三方库中看到的一些我不记得的东西,但基本上他们有各种自定义类型,它们有这样的Parse/TryParse方法,他们做了以下:

  1. 定义一个通用结构,它包含通过解析字符串获得的值以及传递解析结果的枚举类型的值
  2. 所有TryParse方法都返回了这个结构,并且没有out参数
  3. Parse方法简单地称为TryParse方法,然后将该枚举的各种非成功结果转换为适当的异常

同样,在我看来,这里的主要问题是它不可扩展.如果我想使用他们的系统和类型,并添加我自己的原因,我不能这样做,但是一些变体可以很容易地解决这个问题.

在任何情况下,int.TryParse方法都不会在内部抛出任何异常.相反,他们会经历实际解析字符串的动作,如果他们遇到了他们无法应付的事情,他们只会返回虚假,就是这样,没有例外.

异常处理比没有异常的替代方案略贵,这就是为什么一些这样的核心方法针对性能进行了优化的原因.

这就是为什么在我的评论中我调用你的模式,如果准确,愚蠢,因为你将异常处理与out参数结合起来.一旦你检索到它,你会怎么做?丢它?然后你又回到了第一个方向.

我会认真看看你的模式并尝试改变它.

当然,所有这些都取决于您对它的描述是否准确的假设.