【问题标题】:Is having the entire function body inside an if statement considered bad practice?将整个函数体放在 if 语句中是否被认为是不好的做法?
【发布时间】:2018-07-03 09:12:57
【问题描述】:

我经常发现自己编写的函数看起来像:

public function foo($param): void 
{
    if($param) {
        //do something
    }
}

如果$param eval 为 false,则不执行任何代码。

这看起来是一种不好的做法,是否有任何关于如何避免这种编码的指南/模式?

【问题讨论】:

  • 这取决于你需要什么。如果您需要这样做,它可能会很有用。
  • 是的,它会让你的功能不那么清晰
  • 我更喜欢if(!$param) return;,然后是你的if-content,但这只是我猜的风格。 (可能返回错误代码或某些异常)
  • 只有在 $param 计算结果为真的情况下才能调用 foo() 函数。喜欢if( $param ) { foo(); }
  • @SudhirBastakoti,但是这样你必须在每次调用之前检查传递的参数!在函数内部这样做,您将编写更少的代码和更少的错误。

标签: php


【解决方案1】:

如果一个函数是一个全有或全无的条件,我首先有 else 条件 - 这样,如果 $param 解析为 false,该函数会立即退出:

public function foo($param): void 
{
    if(!$param) {
        return;
    }
    //do something
}

【讨论】:

  • 请考虑该函数不返回任何内容。
  • 移除返回值。
  • 每个函数,即使是那些没有return 语句的函数,都会返回一些东西。默认情况下这是null(不是真的,但是当您在void 上执行var_dump 时,您会得到null)。所以指定一个空的return 语句与一个函数做它的事情并自动返回是一样的。
  • 这在技术上是正确的,但是 return 语句在指定 void 返回类型的函数中没有意义。我已经相应地编辑了问题。
  • 由于上面的代码没有返回任何东西,只调用return,它会满足函数签名中的返回类型void
【解决方案2】:

您可以像这样改进功能:

function foo($param='defaultValue') 
{
    if($param)
    {
        //do something

        return true; // or something else
    }

    return false; // by default return false
}

通过这样做,如果 $param 将被评估为 false,则将使用 return false

此外,如果您的函数位于类中,最好为该函数指定访问修饰符(publicprotectedprivate)。

【讨论】:

  • 请考虑该函数不返回任何内容。
  • 一个不返回任何内容的函数,我认为这不是最佳实践。
  • 为什么不呢?例如应该做什么一个setter函数返回?
  • 对我来说,setter 函数也必须返回 truefalse 以防成功或失败。
【解决方案3】:

我个人会将此代码更改为:

function foo($param) 
{
    $param 
      && (function () {
        // Do code here.
      })();
}

但是如果我想在其他地方调用内部函数,并保持一切干净,我可能会将其重构为:

function foo($param) 
{
  $param
    && bar();
}

function bar() 
{
  // Do code here
}

然后我会调整 foo 的命名,以明确它是 bar 的包装器并重命名 bar 以便听起来它缺少包装器,可能类似于 action_only 或 @987654328 @

然后我还将它写在每个函数的文档中,在 OOP 领域,这将是一个私有方法,但这也不会强制执行真正的隐私,请参阅:What is the point of OOP visibility in PHP when Closures and Reflections are available?,实际上是函数内部的闭包,在第一个例子中,在技术层面上更“私密”

【讨论】:

  • 这不是让事情复杂化,让 foo 函数更难阅读吗?
  • 这取决于你如何定义更清晰的阅读,我定义更清晰的阅读,类型提示,文档类型,函数+变量名称来声明意图,清除输入和输出,你的意思是更难阅读遇到 foo() 的条款然后你需要了解 bar() 吗?
【解决方案4】:

这取决于你想用这个函数做什么。 但我的意见是你的条件应该在函数之外,例如

function foo() {
    // doing something
}

然后

if ($params) {
    foo();
}

它看起来更可定制

【讨论】:

  • 这只是将问题提升到更高的功能。
  • @dev0 你能给我一个问题的例子吗?
  • 好吧,if 语句不是独立存在的,它会在另一个(包装器)函数中,不是吗?
【解决方案5】:

access modifiers 添加到函数中

类属性必须定义为公共、私有或受保护。如果使用 var 声明,该属性将被定义为 public。

public function foo($param=null) 
{
    /* Condition while not empty then proceed */
    if(!empty($param)) {
        //do something
    } else {

        return false;
    }
}

【讨论】:

  • 我不明白添加访问修饰符与问题有什么关系
  • Oki - 但由于 95% 的 Web 开发问题都被错误标记,我不会相信它们 ;)
  • @CD001 问题已正确标记,使用访问修饰符是一种很好的做法,但为了简洁起见,我省略了它,因为它与任何类型的问题都无关。
  • @AmanKumar 请考虑该函数不返回任何内容。
猜你喜欢
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多