Оптимизация большой группы операторов IF - PullRequest
0 голосов
/ 12 сентября 2011

У меня есть большая группа вложенных выражений 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 ) {

            }
        }
    }
}

Идея есть; У меня есть чтение (температура / скорость / влажность), и мне нужно проверить, достигает ли оно какого-либо из пределов (высокое предупреждение / высокое критическое / низкое предупреждение / низкое критическое значение), если оно мне сначала нужно проверьте, если я уже отправил сигнал тревоги для этого. Если тревога не была отправлена, мне нужно проверить, запросил ли пользователь уведомление о тревоге (мобильный / электронная почта / оба)

В настоящее время это работает. Мне просто не нравится, как это тяжело? Могу ли я улучшить это?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 12 сентября 2011

это кажется мне намного более понятным, даже если вы могли бы объединить вложенные, если бы я предпочел этот

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);    
}
2 голосов
/ 12 сентября 2011

Преждевременная оптимизация - корень всего зла - с тем, с чем мы здесь имеем дело, независимо от того, что вы делаете, это не окажет большого / какого-либо заметного влияния на производительность.

Сказав это, большое количество 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"];

... и будет иметь тот же эффект.

...