Лучший способ отформатировать условные проверки в операторе if - PullRequest
8 голосов
/ 30 августа 2011

Этот код выглядит грязным, и я не могу понять, как его отформатировать, чтобы я мог его читать, понимать и одновременно выглядеть чисто.

if(center==2 && ((((y-height/2)==j) && ((x+width/2)==i)) || (((y+height/2)==j) &&  ((x+width/2)==i))))
  regenerateDot(i+1, j, dots); 

Есть предложения?

Ответы [ 8 ]

17 голосов
/ 30 августа 2011

Я бы разбил логические выражения на переменные, названные для удобства чтения.Что-то вроде:

bool isCentered = center == 2;
bool inLowerRegion = (y-height/2) == j && (x+width/2) == i;
bool inUpperRegion = (y+height/2) == j && (x+width/2) == i;
bool inEitherRegion = inLowerRegion || inUpperRegion;

if (isCentered && inEitherRegion) {
   regenerateDot(i+1, j, dots);
}
6 голосов
/ 30 августа 2011

Рассмотрим рефакторинг.Вы можете поместить подвыражения в их собственные функции, указав таким образом их назначение.

Например:

if (IsCentered(center) && IsInsideLower(y, j, i) && IsInsideUpper(y, j, i))
  regenerateDot(i + 1, j, dots);

Обратите внимание, что в приведенном выше примере имена функций могут быть поддельными (я недействительно пытался понять, какова цель кода), но вы должны понять.

2 голосов
/ 30 августа 2011

Для чего-то сложного я бы, вероятно, разбил его на то, что каждое условие (сгруппированное по shared &&) пытается обозначить и присвоить его разумному имени переменной.

2 голосов
/ 30 августа 2011

Самое большее, вы можете удалить лишние скобки, добавить несколько пробелов и поместить логические разделы в разные строки следующим образом:

if(center == 2 && 
  (((y - height/2) == j || (y + height/2) == j) && (x + width/2) == i))
{
  regenerateDot(i+1, j, dots);
}

Изменить : у вас есть одно избыточное условие (x + width/2) == iЯ оптимизировал здесь.

1 голос
/ 30 августа 2011

Повторный заказ даст что-то вроде:

if (center==2 && (i-x)==(width/2) && abs(j-y)==(height/2))
    regenerateDot(i+1, j, dots); 
1 голос
/ 30 августа 2011

Это тот же код, который вы разместили:

if( center == 2 )
{
    if( (x+width/2) == i )
    {
        if( (y-height/2) == j ) || (y+height/2) == j ) )
        {
            regenerateDot(i+1, j, dots); 
        }
    }
}
1 голос
/ 30 августа 2011

Я бы сделал это так

if (2 == center &&  
    (((y - height/2) == j && (x + width/2) == i) ||  
     ((y + height/2) == j && (x + width/2) == i))
   )
{ 
  regenerateDot(i + 1, j, dots); 
}
1 голос
/ 30 августа 2011

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

    if(center == 2 && 
        (y - height/2 == j && x + width/2 == i || 
         y + height/2 == j && x + width/2 == i))
        regenerateDot(i+1, j, dots);
...