让我说,我不主张这种方法,但我看到了它最近我在想如果有一个名字我可以用来指有罪的一方。因此,这里去。

现在你有一个方法,并且你想要返回的价值。你的 想要返回的一个错误代码。当然,例外的是一个更好的选择,但不管是什么原因,你想要一个错误代码来代替。记住,我是玩魔鬼代言人在这里。所以你创建的一般类,像这样:

class FunctionResult<T>
{
    public T payload;
    public int result;
}

然后宣布您的职能是这样的:

FunctionResult<string> MyFunction()
{
    FunctionResult<string> result;
    //...

    return result;
}

一种变化在这个模式是利用一枚举的错误代码,而不是一串。现在,回到我的问题:是否有一个名称为这个,如果是的它是什么?

有帮助吗?

解决方案

我同意,这不是一个具体反模式.它可能是一味依据的使用情况。是有原因为什么一个实际上将不要使用的例外情况(例如错误被退回的不是特殊的',对于初学者).

有些情况下你想拥有一个服务返回的共同模式的结果,包括错误和良好的价值观。这可能是包裹的低水平服务的互动,将导致进入一个异常或其他错误的结构,但在水平的服务,它可以让的服务返回的结果和状态编码,而无需定义的一些异常结构,可能需要翻译的跨越遥远的边界。

这种代码不一定是一个错误:考虑HTTP响应,其中包括了很多不同的数据,包括地位代码,随着身体的反应。

其他提示

这就是所谓的"替代的错误代码例外"

嗯,这是 一个反模式.C++标准图书馆的使用使得这一特征。净甚至提供了一个特殊的 FunctionResult 类。净框架。这就是所谓 Nullable.是的,这不是限制功能的结果,但它可用于这种情况下,实际上是非常有用。如果。净1.0已经有的 Nullable 类,它肯定会有用的 NumberType.TryParse 方法,而不是的 out 参数。

我通常通过有效载荷为(不const)的参考和错误代码作为返回的价值。

我是一个游戏开发人员,我们放逐的例外

康拉德是正确的,C#采用双重返价值观所有的时间。但我有点喜欢TryParse,词典。TryGetValue,等等。方法。

int value;
if (int.TryParse("123", out value)) {
    // use value
}

而不是的

int? value = int.TryParse("123");
if (value != null) {
    // use value
}

...主要是因为可空的图案没有规模,以非价值的回报类型(即,流的实例)。这不会的工作与词典。TryGetValue().和TryGetValue是这两个比一个KeyNotFoundException(没有"例外情况的第一次机会"不断在调试器,可以说是更有效率),更好的比Java的做法获得()返回null(如果有什么空值预期的),和更有效的具有叫ContainsKey()第一次。

但是这个 还是一点点扭曲的-因为这看起来像C#然后,它应当使用一个参数。所有的效率收益可能是丢失的实例类。

(可能是Java除了"string"类被小写。在Java当然,你必须使用一个类仿效的双返回值。)

我不知道这是一个反模式。我经常看到这种使用,而不是例外性的原因,或者也许使事实上,该方法可能会失败,更加明确。对我来说,这似乎是个人的偏好而不是一个反模式。

我同意那些说这不是一个反模式。它是一个完全有效的模式在某些情况。例外的是 特殊 情况,返回值(如在例)应用于预期的情况。一些领域期望的有效和无效的结果的类别,而没有这些应该模型作为例外情况。

例如,鉴于X量的气体,可以汽车从A到B,如果是多少天然气是左?这种问题是理想的数据结构你提供的。不能够成行,从A到B的预期,因此,一个例外,不应使用。

这种方法是实际上比其他一些人,我都看到了。一些职能在C,例如,当他们遇到一个错误,他们返回,并且似乎取得成功。唯一的方式来告诉他们未能是要求一个功能将得到最新的错误。

我花了几个小时试图调试信号码在我的Air之前我最后发现sem_init不工作上的OS x!它编制无误和没有造成任何错误,但该信没有工作,我不知道为什么。我可怜的人口的应用程序的使用 POSIX信号灯 到OS x和必须处理资源争问题,已经调试。

如何对"不能确定这是否是一个错误或不是"的模式。似乎是如果你真的有一个例外,但希望返回的部分结果是,你的包裹结果在例外情况。

如果你不想使用的例外情况,最清洁的方式来做到这一点是有功能返回的错误/成功码,并采取一个基准或指针的论点,即得到填补在与的结果。

我不会称它的一个反模式。这是一个很好的证明可行的方法,往往最好使用例外。

如果你希望你的方法来偶尔失败,但不考虑特殊的,我喜欢这个模式作用。网的框架:

bool TryMyFunction(out FunctionResult result){    

     //...    
     result = new FunctionResult();
}

辩论的气味和反模式,提醒我的"幸存者"的电视节目,在那里您有各种编程结构,试图对投票的每一个其他岛屿。我宁愿看到"构建有这样的和优点和缺点",而不是一个不断发展的清单的法令的什么应该和不应该做的。

在防御的反模式指定,这个代码本身被用在几个方面:

  1. 对象x=MyFunction().载荷; (忽视回返的结果非常糟糕)
  2. int码=MyFunction().结果; (扔掉的有效载荷可能好吧,如果是这样的使用目的。)
  3. FunctionResult x=MyFunction();//... (一堆的额外FunctionResult目的和额外的代码,以检查他们所有的地方)

如果你需要使用返回代码,这很好。但是然后用返回代码。不要试图组的一个额外的有效载荷。那是什么 ref出来 参数(C#)。空类型可能会是一个例外,但是仅仅因为有额外的糖出炉的语言来支持它。

如果你还是不同意这种评估,这列表的答复(不是整个问题)。如果你认为这是一种反模式,然后投票。我们会使用这个回答来看看有什么社区的想法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top