Javascript 如果每个操作都返回一个结果类的实例,那么如何调用这个(反?)模式?

Javascript 如果每个操作都返回一个结果类的实例,那么如何调用这个(反?)模式?,javascript,c#,php,design-patterns,anti-patterns,Javascript,C#,Php,Design Patterns,Anti Patterns,以下(反?)模式是否有名称 每个函数都返回一个结果类(或结构或关联数组)的实例,该类至少包含以下两个公共变量: success:如果操作成功完成,则保留的真/假值 result:保存函数结果的变量,如果函数无效,则不保存任何结果 如果success为false则错误变量可能包含有关错误的信息(异常/堆栈跟踪/调试) 如果error不为空,则可以定义包含用户友好消息的message变量 只封装操作的结果。输入正常传递 我在.Net和PHP(在服务器上以及在JavaScript/Ajax请求

以下(反?)模式是否有名称

  • 每个函数都返回一个
    结果
    类(或结构或关联数组)的实例,该类至少包含以下两个公共变量:
    
    • success
      :如果操作成功完成,则保留的真/假值
    • result
      :保存函数结果的变量,如果函数无效,则不保存任何结果
  • 如果
    success
    false
    错误
    变量可能包含有关错误的信息(异常/堆栈跟踪/调试)
  • 如果
    error
    不为空,则可以定义包含用户友好消息的
    message
    变量
  • 只封装操作的结果。输入正常传递

我在.Net和PHP(在服务器上以及在JavaScript/Ajax请求调用的脚本中)中都看到过这种用法。这是最佳实践吗?这是一种反模式吗?

这是处理过程调用的常用方法,该过程调用可以返回失败或成功以及一个值。如注释中所述,调用API时这是相当常见的。备选方案包括:a)将返回值与成功/失败相结合,因此必须在调用代码中对其进行外部了解和检查;b)使用out参数在成功时返回所需的值;或c)抛出异常以指示失败,这既昂贵又愚蠢,因此我将不再进一步讨论

a)将返回值与成功/失败相结合

这要求调用代码知道返回值中什么表示失败,而不是显式地告诉它失败

public string GetSomeString(int id)
{
    //return a value on success or null on failure
}
因此,调用代码必须知道null或空字符串是失败的,并相应地进行检查

var result = obj.GetSomeString(2);
if(string.IsNullOrEmpty(result))
{
    //ooops, failed
}
当然,如果null是一个合法的返回值,那么这不是一个选项

类似地,对于int调用

public int GetSomeInt(string someArg, bool someOtherArg)
{
    //return a value or a -1 for failure
}
因此,调用代码必须再次知道什么是坏的,并假设其他一切都正常

 var result = obj.GetSomeInt("blah", true);
    if(result == -1)
    {
        //ooops, failed
    }
同样,如果您的“错误”值在某些情况下是合法的(或者更糟的是,在以后变得合法),则不起作用

b)成功时使用out参数传回值

另一个选项是从方法返回成功或失败,如果成功,则使用out参数返回值

public bool GetSomeString(int id, out string someString)
{
    //if fail return false
    //otherwise set someString = value and return true
}
调用代码如下所示

string goodString = null;
if(!obj.GetSomeString(2, out goodString))
{
   //ooops, something bad happened
}
这提供了将调用的成功/失败与其返回的值分开的优势。它是有效的,但它是一种klutzy语法,如果需要返回的值多于值,那么最终将添加更多的out参数或创建一个对象以返回out。它也不能告诉你为什么失败。这让我们回到你的问题上

使用结果对象


这为您提供了b)的优势,因为成功/失败是显而易见的,并且不需要调用代码知道什么返回值可能表示失败。它感觉更干净,因为它不需要使用out语法。它还提供了额外的好处,允许您通过在结果对象的message属性中传递失败原因来指示失败原因。

fixed title。我不知道这是不是反模式不是真正的模式,这只是一个简单的数组/对象形式的http响应表示,因为大多数开发人员都不知道如何使用HTTPS的状态代码听起来像是在谈论某种API控制器类。这两个类一起使用:每个函数都返回一个结果类的实例,我在.Net和PHP中都看到过。并非所有的.NET函数都能做到这一点。事实上,我想知道你的意思是…@TaW我指的是用户代码!人们是否通常使用结果对象将其称为