0

我有一大群嵌套的 IF 语句,我想知道是否有人对如何优化速度、大小和可读性有任何建议。

下面是其中一个 if 语句及其嵌套语句的示例。文档中大约有 25-30 个。

if( $row["inlet_moisture"] > $row["inlet_moisture_high_warning"] ) {
    if( $row["inlet_moisture"] > $row["inlet_moisture_high_critical"] ) {
        if( $row["inlet_high_critical"] == 0 ) {
            if( $row["email_notification"] == 1 ) {

            }
            if( $row["mobile_notification"] == 1 ) {

            }
        }
    } else {
        if( $row["inlet_high_warning"] == 0 ) {
            if( $row["email_notification"] == 1 ) {

            }
            if( $row["mobile_notification"] == 1 ) {

            }
        }
    }
} else if( $row["inlet_moisture"] < $row["inlet_moisture_low_warning"] ) {
    if( $row["inlet_moisture"] < $row["inlet_moisture_low_critical"] ) {
        if( $row["inlet_low_critical"] == 0 ) {
            if( $row["email_notification"] == 1 ) {

            }
            if( $row["mobile_notification"] == 1 ) {

            }
        }
    } else {
        if( $row["inlet_low_warning"] == 0 ) {
            if( $row["email_notification"] == 1 ) {

            }
            if( $row["mobile_notification"] == 1 ) {

            }
        }
    }
}

这个想法是;我有一个读数(温度/速度/湿度),我需要检查它是否达到任何限制(高警告/高临界/低警告/低临界),如果是,我首先需要检查我是否已经发送一个警报。如果没有发送警报,我需要检查用户是否请求警报通知(手机/电子邮件/两者)

目前这有效。我只是不喜欢它有多重?我可以改进吗?

谢谢。

4

2 回答 2

2

过早的优化是万恶之源——我们在这里处理的事情,无论你做什么,它都不会对性能产生太大/任何明显的影响。

话虽如此,大量if语句通常可以用一个或多个switch结构替换,尽管这是否会提高性能可读性是值得商榷的。您也可以为重复的代码位创建一些函数,尽管这实际上可能会对性能产生负面影响。

根据您上面的评论...创建具有更好名称的变量对性能的影响几乎为零。如果会稍微增加您的内存使用量,但处理时间的影响将接近于零。而且,如果您将值评估为布尔值,则不需要将它们显式转换为布尔值,因为 1 仍计算为TRUE,而 0仍为FALSE。但是,如果您确实想这样做

$email_notification = $row["email_notification"] == 1 ? true : false;

...不必要地冗长,您可以这样做:

$email_notification = $row["email_notification"] == 1;

...或者...

$email_notification = (bool) $row["email_notification"];

......它会产生同样的效果。

于 2011-09-12T15:47:59.023 回答
2

这在我看来要清楚得多,即使你可以结合嵌套的 if 我宁愿喜欢这个

if( $row["inlet_moisture"] > $row["inlet_moisture_high_critical"] ) {
  if( $row["inlet_high_critical"] == 0 ) {
   $message = 'the pertinent message';
  }
}
else if( $row["inlet_moisture"] > $row["inlet_moisture_high_warning"] ) {
  if( $row["inlet_high_warning"] == 0 ) {
   $message = 'the pertinent message';
  }
}
else if( $row["inlet_moisture"] < $row["inlet_moisture_low_critical"] ) {
  if( $row["inlet_low_critical"] == 0 ) {
   $message = 'the pertinent message';
  }
}
else if( $row["inlet_moisture"] < $row["inlet_moisture_low_warning"] ) {
  if( $row["inlet_low_warning"] == 0 ) {
   $message = 'the pertinent message';
  }
}


if( $row["email_notification"] == 1 ) {
  sendMessage($message, $email);
}
if( $row["mobile_notification"] == 1 ) {
  sendMessage($message, $mobile);    
}
于 2011-09-12T15:56:12.427 回答