【问题标题】:Dealing with big IF statements in PHP处理 PHP 中的大 IF 语句
【发布时间】:2010-05-11 19:19:05
【问题描述】:

PHP 中的普通if 语句有什么好的替代方法吗?我知道switch,但我猜在处理非常大的if 语句时,有一些更精致的替代方案会派上用场。

非常感谢,

【问题讨论】:

  • 您的if 声明有多大?有可能它们可以被简化,并且根据您正在处理的逻辑类型,可能会有替代方案。不过,如果您发布一些有见地的代码。
  • 不太清楚你的意思。类似于 ruby​​ 的unless
  • 你说的大是什么意思?大条件、大实体,还是深度嵌套?
  • 条件大还是条件为真时要执行的代码大?
  • 不,条件很大,有很多带有 if_functions 的行,我想让它变得更好......

标签: php if-statement


【解决方案1】:

如果您无法在一屏上阅读算法,则有 99.9% 的可能性需要重构代码以提高可读性。

改变

if ($isHappening) {
  // ... millions of lines of code
} else {
  // .. another million lines of code
} 

进入

if ($isHappening) {
  happen();
} else {
  didntHappen();
}

function happen() {
  // millions of lines of code
}

function didntHappen() {
  // another million lines of code
}

【讨论】:

    【解决方案2】:

    那里真的没有魔锤。使它们易于管理的最佳选择是将嵌套的 if 分解为它们自己的函数,以使它们更具可读性。

    另外,不要忘记array_filter。这可以让您不必编写一个 for 循环来过滤掉项目。

    此外,您可以使用guard statements 消除嵌套。您基本上反转您的 if 并改为执行 return (将条件分解为函数的另一个原因)。

    【讨论】:

      【解决方案3】:

      如果你只想提高可读性,那么你总是可以在 if 语句中拆分表达式:

      $exp1 = is_array($var) && isset($var['key']);
      $exp2 = is_object($var) && isset($var->key);
      $exp3 = substr($string, 0, 4) == 'foo';
      $exp4 = ($exp1 || $exp2) && $exp3;
      if ($exp4) {}
      

      而不是

      if (((is_array($var) && isset($var['key'])) || (is_object($var) && isset($var->key))) && substr($string, 0, 4) == 'foo') {}
      

      显然,这些是简化的示例,但你明白了......

      【讨论】:

      • 我见过很多跨越多行的表达式。这是提高可读性的好方法!
      【解决方案4】:

      欢迎来到面向对象的世界:)

      class Case1 {
         function do() { echo "case 1"; }
      }
      
      class Case2 {
         function do() { echo "case 2"; }
      }
      
      
      $object = new Case1();
      
      $object->do();
      

      然后,使用数组进行调度:

      $choices = array( "case1" => new Case1(), "case2" => new Case2(), ... );
      
      $choices[ $_GET["case"] ]->do();
      

      【讨论】:

      • @xtofl 提倡的是聪明地使用多态性。显然,这是一个过于简单的案例,但是使用多态性来重构复杂的 if 语句是可靠的 OO 设计的一部分。
      • 我可以保证这一点。在使用 OOP 一段时间后,长而复杂的 if 语句的概念对我来说是陌生的。现在一切都变得更短更简单了。
      【解决方案5】:

      好吧,ifif,没有太多其他东西了。当然switch 是一个替代方案,但根据条件可能不适用。

      如果你在做 OOP,state design pattern 可能是你需要的。

      否则你必须提供更多信息......

      【讨论】:

        【解决方案6】:

        如果“大”是指大型、高度嵌套的“ifs”,这是代码异味的明显迹象,您应该关注 OOP 和设计模式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-02-17
          • 2015-08-21
          • 1970-01-01
          • 2021-06-10
          • 2013-08-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多