Лучший способ структурировать утверждение «Если» - PullRequest
0 голосов
/ 06 октября 2010

Что из перечисленного является лучшим способом структурирования вложенности If характеристик.

if (x && y)
   doXY();
else if (x)
   doX();
else if (y)
   doY();

(ИЛИ)

if(x)
   if(y)
     doXY();
   else
     doX();       
else if(Y)
   doY();

Ответы [ 8 ]

5 голосов
/ 06 октября 2010

У первого меньше вложенности, так что я говорю это.

Во втором случае вы оцениваете, является ли "x" истинным, затем входите в этот блок и оцениваете, если "y" истинно, как правило, хорошей практикой является вложение кода как можно меньше.

if (x && y)
{
   // doXY
}
else if (x)
{
   // doX
}
else
{
   // doY
}
2 голосов
/ 06 октября 2010

1.) Как говорили кендиги, меньше вложений - хорошая практика.

2.) Еще один хороший совет - заключить блок операторов в квадратные скобки { }, независимо от того, существует ли только один вызываемый метод или более.«если» заявление.Я имею в виду if (isTrue) лучше, чем if (!(!isNotFalse))

Я бы написал код выше таким образом:

if (x && y) {
   doXY();
}
else if (x) {
   doX();
}
else if (y) {
   doY();
}
2 голосов
/ 06 октября 2010

Другая возможность:

if (x && y)
   doXY();
if (x && !y)
   doX();
if (!x && y)
   doY();

Это - я заявляю заранее - менее эффективно, но в такой незначительной степени, что это вряд ли когда-либо будет иметь значение. С точки зрения удобочитаемости и удобства обслуживания, в некоторых обстоятельствах это может быть лучше, поскольку ни одно из положений не зависит от других, и нет требования, чтобы они выполнялись в указанном порядке. Каждое отдельное предложение может быть извлечено в свой собственный метод, если это необходимо.

2 голосов
/ 06 октября 2010

С точки зрения читабельности, я бы определенно выбрал первый вариант.

Но если это часть некоторой логики, которая выполняется миллионы раз, и вы знаете, что распределение вероятностей для обоих x & y верно, а только x является истинным, или только y является истинным, предпочтение отдается одному изВо-вторых, вы можете пожертвовать удобочитаемостью ради производительности.Тем не менее, убедитесь, что вы профилировали, прежде чем переходить к подобным оптимизациям, и убедитесь, что вы документируете причину структурирования операторов if таким образом, чтобы другие разработчики не просто приходили и оказали вам услугу путем рефакторинга вашегокод.

1 голос
/ 06 октября 2010

Вы также можете сделать следующее:

switch (x + (y<<1))
{
   case 1: doX();  break;
   case 2: doY();  break;
   case 3: doXY(); break;
}

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

1 голос
/ 06 октября 2010

Я думаю, что первое лучше для удобочитаемости, а также для структурированности

0 голосов
/ 06 октября 2010

Являются ли действия в DoXY взаимоисключающими от действий DoX () и DoY ()? Т.е. можете ли вы переработать действия, чтобы они работали так:

if (x) { DoX(); }
if (y) { DoY(); }
if (X && y) { DoXY(); }

Возможно, даже в качестве Paramters to DoXY ()

if (X || y) { DoXY(x,y); }

Но я бы, наверное, выбрал первый вариант для удобства чтения ...

0 голосов
/ 06 октября 2010

Мне нравится думать о строках кода как о стоимости обслуживания.Меньше линий = более низкая стоимость.В вашем случае первый блок кода на одну строку короче, поэтому я голосую за это.

Обычно это, конечно, будет зависеть от контекста оператора.1005 * SLOC

...