Извините за плохой пояснительный заголовок, я не могу найти лучшего (пока).
Я привык кодировать логические выражения, добавляя некоторые временные переменные для улучшения чтения выражения, другими словами, мне не нравится это:
// 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
, используйте их только в логическом выражении, в той же области выражения и близко к самому выражению, вопросы:
Спасибо за совет.
Проверь это:
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*/
}
Магия!
Я всегда предпочитаю удобочитаемость, а не преждевременную оптимизацию, пока она не окажется узким местом в производительности.
Так что в этом случае пример 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;
}