2013-06-04 4 views
0

Какая из следующих двух реализаций является лучшей и почему?if versus if/else в отношении boolean

bool MyClass::hasCContainerValues(CContainer* container) 
{ 
    if(container && container->nrOfValues>0) 
    { 
     return true; 
    } 
    return false; 
} 

bool MyClass::hasCContainerValues(CContainer* container) 
{ 
    if(container && container->nrOfValues>0) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 
+26

'return (container && container-> nrOfValues> 0);' – zch

+0

@zch: +1 потому что это была моя первая мысль тоже :-) – Nicholaz

+0

что zch сказал и/thread. – dowhilefor

ответ

4

Делая предположение, что вы ничего не делаете больше, чем просто простой тест, идти с:

bool MyClass::hasCContainerValues(CContainer* container) const 
{ 
    return (container && container->nrOfValues>0); 
} 

Однако, если вы должны были сделать больше, то иногда считается, что одна точка выхода будет лучше (различные статические наборы правил анализа жалуются на несколько точек выхода, rightly или wrongly):

bool MyClass::hasCContainerValues(CContainer* container) const 
{ 
    bool retval = false; 
    if(container && container->nrOfValues>0) 
    { 
     // something else here perhaps 
     retval = true; 
    } 
    return retval; 
} 

также, как в сторону, если вы только тестируя контент, тогда вы, вероятно, можете сделать метод const, но это не имеет отношения к вашему вопросу.

+2

Я буду [прошу отличаться] (http://programmers.stackexchange.com/q/18454/7043) относительно аккуратности. – delnan

+0

ОК, возможно, аккуратность - неправильная формулировка. Причина, по которой я упоминал наличие единственной точки выхода, - это то, что я недавно делал много статического анализа, а правила, которые мы используем, не любят множественные выходы ... Я, должно быть, сделал что-то неправильно в предыдущем жизнь. Я удалю комментарий о аккуратности :) – icabod

+0

Это освежающе реалистичная причина для предпочтения одиночных точек выхода, радует это! И boo для автора инструмента статического анализа, который терпит неудачу при анализе потока. – delnan

2

Предполагая, что это пример, и вы не хотите делать только return (container && container->nrOfValues>0), они оба в порядке и одинаково правильны.

Остальное - личное мнение/вкус, и здесь будет создана религиозная война. Я лично предпочитаю первый, но могу выбрать либо в зависимости от сложности обоих предложений, то есть логики в true и false пути.

1

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

+0

-1 Это не значит, что это не имеет значения. Это означает, что это не имеет значения для производительности, но для начала это не имело значения для производительности. Оставляя отступ или префикс, все имена переменных с помощью «var» также не влияют на производительность, но я сомневаюсь, что кто-то считает, что это так хорошо, как не делать этого. – delnan

+0

@ delnan lol вы видите разницу между двумя фрагментами? ><Просил ли ОП использовать лучшие практики, соглашения и т. Д.? NO ... – nouney

+0

Я действительно вижу разницу, особенно если мы рассматриваем код как пример для более сложных тел.И ОП спросил: «Какой [...] лучший и почему» - это буквально весь вопрос. Не упоминается и о производительности. – delnan

0

Ну, более короткая форма кода не повредит читаемости кода, поэтому лучше использовать более короткую форму, которая является первой. Потому что читается и имеет меньше строк кода.