【问题标题】:How do you call this (anti?)pattern where every operation returns an instance of a result class?您如何称呼这种(反?)模式,其中每个操作都返回结果类的实例?
【发布时间】:2017-01-21 00:14:54
【问题描述】:

以下(反?)模式有名称吗?

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

我已经在 .Net 和 PHP(在服务器上和由 JavaScript/Ajax 请求调用的脚本中)都看到了这个。这是最佳实践吗?这是反模式吗?

【问题讨论】:

  • 固定标题。我不知道这是否是反模式
  • 不是真正的模式,只是以数组/对象形式简单地表示您的 http 响应,因为大多数开发人员不知道如何使用 http 的状态代码
  • 听起来你在谈论某种 API 控制器类
  • 这是否结合在一起:每个函数都返回一个结果类的实例 _ 并且 _我在 .Net 和 PHP 中都看到过这种情况。并非所有 .NET 函数都这样做。事实上我想知道你的意思..
  • @TaW 我的意思是用户代码!

标签: javascript c# php design-patterns anti-patterns


【解决方案1】:

这是处理可以返回失败或成功和值的过程调用的常用方法。如 cmets 中所述,调用 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
}

这提供了将调用的成功/失败与其返回的值分开的优势。它有效,但它是一种笨拙的语法,如果您需要返回的不仅仅是值,您最终将添加更多的输出参数或创建一个对象以在输出中返回。它也不能告诉你为什么它失败了。这让我们回到你的问题的主题......

使用 Result 对象

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

【讨论】:

  • 人们通常将其称为using a Result object 吗?
  • 嗯,我想就是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
相关资源
最近更新 更多