Ленивая логика и временные значения для улучшения чтения выражения

Извините за плохой пояснительный заголовок, я не могу найти лучшего (пока).

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

// Example 1
// hard to read and understand at first glance
if (value % 2 && value ^ weirdFlags &&
(value > threshold) && (value < ceiling) &&
/* lots of comparisions */)
{ /* do something*/ }

И предпочитаю это:

// Example 2
// this is way easier to read and understand
const bool isEven = value % 2;
const bool flagsChecked = value ^ weirdFlags;
const bool inRange = (value > threshold) && (value < ceiling);
const bool foo = /* lots of comparisions */;
if (isEven && flagsChecked && inRange && foo)
{ /* do something*/ }

Но, используя мой любимый стиль кодирования, я не пользуюсь ленивой оптимизацией логики, потому что все временные значения вычисляются, в то время как с другим стилем кодирования вычисляются только неопровержимые.

Есть еще одно решение, которое позволяет использовать ленивые логические оптимизации и делает код читаемым, то есть комментировать код:

// Example 3
// this check test if the value is an even number
// and checks the value with the provided flags
// and assures that the value is in the required range
// and lots of additional comparisions
if (value % 2 && value ^ weirdFlags &&
(value > threshold) && (value < ceiling) &&
/* lots of comparisions */)
{ /* do something*/ }

Но нет никаких гарантий, что комментарии кода соответствуют приведенному ниже коду во время разработки кода, в то время как команда программистов день за днем ​​кодирует один и тот же исходный файл (не все кодеры заботятся о хорошей документации). Вот почему я предпочитаю, чтобы код объяснял себя аккуратно.

Итак, наконец, изучая пример 2, который объявляет временные значения как const, используйте их только в логическом выражении, в той же области выражения и близко к самому выражению, вопросы:

  • В Примере 2, будет ли компилятор выполнять какие-то оптимизации с использованием временных значений, чтобы улучшить производительность логического выражения (ленивая оценка)?
  • По вашему мнению, какой из трех примеров является наиболее правильным? Зачем?

Спасибо за совет.

1

Решение

Проверь это:

if(const bool isEven = value % 2)
if(const bool flagsChecked = value ^ weirdFlags)
if(const bool inRange = (value > threshold) && (value < ceiling))
if(const bool foo = /* lots of comparisions */)
{
/* do something*/
}

Магия!

1

Другие решения

Я всегда предпочитаю удобочитаемость, а не преждевременную оптимизацию, пока она не окажется узким местом в производительности.

Так что в этом случае пример 2. Что-то еще, что вы могли бы сделать с этим, это:

bool Class::isSomething() {
const bool isEven = value % 2;
if(!isEven) return false;

const bool flagsChecked = value ^ weirdFlags;
if(!flagsChecked) return false;

const bool inRange = (value > threshold) && (value < ceiling);
if(!inRange) return false;

const bool foo = /* lots of comparisions */;
if(!foo) return false;

return true;
}
0

По вопросам рекламы [email protected]