【问题标题】:What is the accepted practise for returning from boolean methods从布尔方法返回的公认做法是什么
【发布时间】:2011-08-03 13:46:13
【问题描述】:

好的,这是一个简单的问题,但我想对这里的正确做法提出一些意见。我不是出于性能问题考虑这个问题,因为 CPU 非常强大,除非在没有经过数千次迭代的循环结构的情况下调用它,否则这不会产生任何明显的差异。我只是想了解什么是公认的标准。

我有一个方法,基本上只是检查返回一个布尔值。但是,有很多方法可以实现这一点。

这是我通常的实现方式。

    public bool CanUndo()
    {
        if (_nCurrentUndoIndex > 0)
            return true;
        else
            return false;
    }

但是,从方法的中间返回通常是不受欢迎的。我通常唯一一次这样做是在对这样的表单提交进行检查时。

        if (String.IsNullOrEmpty(firstName.Text))
        {
            MessageBox.Show("Please enter a first name", "Incomplete");
            return;
        }

我认为这是可以接受的。

回到撤消问题,另一种编码方式是这样。

    public bool CanUndo()
    {
        bool returnVal;
        if (_nCurrentUndoIndex > 0)
            returnVal = true;
        else
            returnVal = false;
        return returnVal;
    }

然而,这不必要地分配了一个变量并且是更冗长的代码。另一种选择是。

    public bool CanUndo()
    {
        bool returnVal = false;
        if (_nCurrentUndoIndex > 0)
            returnVal = true;
        return returnVal;
    }

这更加精简,因为它摆脱了 else。但是,如果值为 true,则通过将其初始化为 false 来进行不必要的分配。

【问题讨论】:

  • 您正在担心一个无关紧要的细节。编译器可能会优化掉大部分差异,即使没有优化,您也不太可能注意到差异,除非您谈论的是数以百万计(而不是数千)的循环。

标签: methods boolean


【解决方案1】:
public bool CanUndo () {
    return _nCurrentUndoIndex > 0;
}

就我个人而言,从方法中间返回没有问题。它complicates cleanup code for C functions 但有了 RAII,这个论点就消失了。

我宁愿在合适的时候尽快退出,否则你会得到

if (x) {
   if (y) {
       if (z) {
          complete
       }
   }
}

而不是

if (!x)
    return

if (!y)
    return

if (!z)
    return

complete

这样可以避免嵌套、宽行(水平屏幕空间很昂贵,垂直空间很便宜),并且您始终知道,如果您仍在函数中,那么您就不会处于错误路径中。适合这种设计的代码也能很好地处理异常,这一点非常重要。

【讨论】:

  • 是的,我忘记了那个替代方案,基本上是我们在头文件中实现的内联函数,在我的 C++ 时代。
  • 可能是我选的场景太简单了。如果条件比简单的 > 比较更复杂,并且无法在一行中实现并保持可读性,您会选择三个选项中的哪一个。
  • 如果不需要添加清理代码,我会采取多回路线。如果您必须为额外的分支复制清理代码,那么它就变成了一个品味问题。对于小功能,这并不重要,对于大功能,将它们重构为更小的功能。
【解决方案2】:

您应该始终将布尔返回与其逻辑等效项进行约定,因为这对于开发人员来说更容易阅读,对您来说编写起来更快,并且无论如何它都会被编译器约定。

考虑扩展or

if (a == 1)
    return true;
else if (a == 2)
   return true;
else if (a == 3)
   return true;
else 
   return false;

当您将其与合同版本进行比较时,原因应该会很明显

return (a == 1) || (a == 2) || (a == 3)

【讨论】:

    【解决方案3】:
    public bool CanUndo()
    {
       return (_nCurrentUndoIndex > 0);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      相关资源
      最近更新 更多