Design patterns 这种反模式/代码气味有名字吗?

Design patterns 这种反模式/代码气味有名字吗?,design-patterns,anti-patterns,Design Patterns,Anti Patterns,让我首先说,我不主张这种做法,但我最近看到了它,我想知道是否有一个名称,我可以用来指出有罪的一方。这就来了 现在您有了一个方法,并且希望返回一个值。您还希望返回一个错误代码。当然,异常是一个更好的选择,但无论出于什么原因,您都希望使用错误代码。记住,我在这里扮演魔鬼代言人。所以创建一个泛型类,如下所示: class FunctionResult<T> { public T payload; public int result; } FunctionResult<

让我首先说,我不主张这种做法,但我最近看到了它,我想知道是否有一个名称,我可以用来指出有罪的一方。这就来了

现在您有了一个方法,并且希望返回一个值。您还希望返回一个错误代码。当然,异常是一个更好的选择,但无论出于什么原因,您都希望使用错误代码。记住,我在这里扮演魔鬼代言人。所以创建一个泛型类,如下所示:

class FunctionResult<T>
{
    public T payload;
    public int result;
}
FunctionResult<string> MyFunction()
{
    FunctionResult<string> result;
    //...

    return result;
}
类函数结果
{
公共T载荷;
公共结果;
}
然后像这样声明函数:

class FunctionResult<T>
{
    public T payload;
    public int result;
}
FunctionResult<string> MyFunction()
{
    FunctionResult<string> result;
    //...

    return result;
}
FunctionResult MyFunction()
{
功能结果;
//...
返回结果;
}

此模式的一个变体是对错误代码使用枚举,而不是字符串。现在,回到我的问题:这有一个名称吗?如果有,它是什么?

关于“无法确定这是否是一个错误”模式如何。似乎如果您确实有一个异常,但希望返回一个部分结果,您应该将结果包装在异常中。

我不确定这是一个反模式。我经常看到,出于性能原因,或者为了使方法可能会失败这一事实更加明确,使用它来代替异常。对我来说,这似乎是一种个人偏好,而不是一种反模式。

它被称为“

嗯,它不是一种反模式。C++标准库利用了这个特性,.NET甚至在.NET框架中提供了一个特殊的<代码>函数结果< /代码>类。它被称为
Nullable
。是的,这并不局限于函数结果,但它可以用于此类情况,并且在这里非常有用。如果.NET 1.0已经有了
Nullable
类,它肯定会被用于
NumberType.TryParse
方法,而不是
out
参数。

这种方法实际上比我见过的其他一些方法好得多。例如,C中的一些函数在遇到错误时返回,并且似乎成功了。判断它们是否失败的唯一方法是调用一个将获取最新错误的函数


在我最终发现sem_init在OSX上不起作用之前,我花了几个小时在我的MacBook上调试信号量代码!它编译时没有错误,运行时也没有引起任何错误——但信号量不起作用,我也不知道为什么。我很同情那些将应用程序移植到OSX的人,他们必须处理已经调试过的资源争用问题。

我通常将有效负载作为(而不是常量)引用传递,将错误代码作为返回值传递


我是一名游戏开发人员,我们排除异常

我同意这不是一个特定的反模式。这可能是一种气味,取决于使用情况。有理由不想使用异常(例如,对于初学者来说,返回的错误不是“异常”)

在某些情况下,您希望服务返回其结果的公共模型,包括错误和正确值。这可能由低级服务交互包装,该交互将结果转换为异常或其他错误结构,但在服务级别,它允许服务返回结果和状态代码,而无需定义可能必须跨远程边界转换的异常结构


<>这个代码可能不一定是一个错误:考虑HTTP响应,它包括许多不同的数据,包括状态代码,以及响应的主体。

< P>如果您不想使用异常,最简洁的方法是让函数返回错误/成功代码,并使用结果填充引用或指针参数


我不会称之为反模式。这是一种经过充分验证的可行方法,通常比使用异常更可取中使用的这种模式。
bool TryMyFunction(out FunctionResult result){    

     //...    
     result = new FunctionResult();
}
康拉德是对的,C#一直使用双返回值。但我有点喜欢C#中的TryParse、Dictionary.TryGetValue等方法

而不是

int? value = int.TryParse("123");
if (value != null) {
    // use value
}
…主要是因为可空模式不能扩展到非值返回类型(即类实例)。这对Dictionary.TryGetValue()不起作用。TryGetValue不仅比KeyNotFoundException更好(在调试器中没有“第一次机会异常”,可以说效率更高),也比Java的get()返回null的实践更好(如果需要null值该怎么办),而且比必须先调用ContainsKey()更有效

但这仍然有点奇怪——因为这看起来像C#,所以它应该使用out参数。实例化该类可能会损失所有效率增益


(可以是Java,但“string”类型是小写的。在Java中,当然必须使用类来模拟双返回值。)

我同意那些认为这不是反模式的说法。在某些情况下,这是一种完全有效的模式。异常用于异常情况,返回值(如示例中所示)应在预期情况下使用。有些域期望从类中得到有效和无效的结果,而这两种结果都不应建模为异常


例如,给定X的汽油量,一辆汽车能从a到B吗?如果能,还剩下多少汽油?这种问题非常适合您提供的数据结构。预计无法从A跳到B,因此不应使用例外情况。

为保护反模式指定,此代码可用于以下几种方式:

  • 对象x=MyFunction().payload;(忽略返回结果-非常糟糕)
  • int code=MyFunction().result;(扔掉有效载荷-如果这是预期用途,也可以。)
  • F