【问题标题】:How to reduce the number of if-else statements in PHP?如何减少 PHP 中 if-else 语句的数量?
【发布时间】:2010-12-20 17:23:07
【问题描述】:

我发现有很多 if-else 语句,尤其是嵌套的 if else 语句,这些语句使我的代码可读性降低。如何减少 PHP 中 if else 语句的数量?

我的建议如下: 1.在合适的时候使用switch语句; 2.在可行的情况下使用exit()语句; 3. 可行时使用三元语句;

还有其他可以减少 if else 语句,尤其是嵌套 if-else 语句的技巧吗?

【问题讨论】:

    标签: php nested readability if-statement


    【解决方案1】:

    有一种官方学术方法可以重构和简化很多if条件,称为卡诺映射

    它接受多个测试条件并尝试帮助创建涵盖所有必需案例的简化 if 语句。

    您可以从 wiki here 了解更多信息。

    【讨论】:

    • @WantSimpleLife-您能否在答案中添加更多代码 sn-p。一段时间阅读 wiki 令人沮丧。
    • 卡诺图并不是真正的代码。它更多是一种查看条件并使用表格简化它们的方法。
    【解决方案2】:

    我编写了大量的代码,这些代码充满了不断发展的业务逻辑,并且需要每隔一天修改一次。肯定有助于我跟上修改的两个技巧是:避免所有其他语句并尽快返回/退出。永远不要深入嵌套 -> 创建子例程/函数。

    用否定的 if 语句替换所有 else 语句使您的代码更容易从上到下阅读(条件和代码块的接近度):

    # business logic block
    if ( $condition ) {
        # do something
        # code code code
    } else {
        # code code code
        return;
    }
    
    # refactored:
    if ( ! $contition ) {
        # code code code
        return;
    }
    if ( $condition ) {
        # code code code 
    }
    

    其次,尽快返回/退出。我的意见当然是,但是当您已经确定子例程的结果时,尤其是当您想从上到下阅读代码时,我看不出运行任何额外条件/测试的意义。消除所有歧义使事情变得更简单。

    最后,我喜欢避免使用 else,尤其是在长的 BL 列表中。知道结果后立即返回。如果嵌套层数大于2,则创建子例程/函数。

    【讨论】:

      【解决方案3】:

      使用三元运算符,重构代码,编写函数或类来执行所有必要的 if else 语句。

      【讨论】:

        【解决方案4】:

        尽可能使用“提前返回”以减少嵌套深度。尝试使用布尔表达式求值。

        例子:

        function foo($param)
        {
            $ret = false;
        
            if(userIsLoggedIn()) {
                if(is_array($param)) {
                    if($param['count'] > 0) {
                        $ret = true;
                    }
                    else {
                        $ret = false;
                    }
                }        
            }
        
            return $ret;
        }
        

        你可以这样重写:

        function foo($param) 
        {
            if(!userIsLoggedIn()) return false;
            if(!is_array($param)) return false;
            return $param['count'] > 0;
        }
        

        【讨论】:

        • +1 这非常重要,因为它可以将您的文件大小减少几个 KB!
        • +1 也适用于继续、中断、投掷。您通常可以通过这种方式保持较低的循环复杂度,从而使代码更具可读性。
        • 我个人也会在这里使用return userIsLoggedIn() && is_array($param) && $param['count'] > 0;。简洁明了。
        【解决方案5】:

        多态性也可以摆脱一些,尽管难以实现减少 PHP 中的 if/else,因为它不是类型安全的......

        【讨论】:

          【解决方案6】:

          将您的代码重构为更小的工作单元。过多的条件逻辑是代码异味,通常表明您的函数需要重构。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-11-21
            • 2012-05-11
            • 1970-01-01
            • 2016-09-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多