2010-07-23 2 views
0

Что не разница между этими двумя примерами:Что разница, если я не использую условие еще

if(firstchek) 
{ 
    if(second) 
    { 
    return here(); 
    } 
    else 
    { 
    return here(); 
    } 
} 

и это:

if(firstcheck) 
{ 
    if(second) 
    { 
    return here(); 
    } 
     return here(); 
    // else code without else 
} 
// code without else 
// else code is here 
    return here(); 
+0

Если все, что вы делаете, это 'return', нет никакой разницы. Во втором фрагменте у вас есть код * после 'if' * - который, похоже, не связан с вашим вопросом. – Kobi

+0

Я тоже это чувствую, потому что, когда я запускаю обе команды, я не нахожу разницы. – 2010-07-23 08:12:12

+0

Вы также можете сделать 'return second? here(): here(); 'если вы чувствуете себя особенно сложно. – Greg

ответ

12

Этот код:

if (someCondition) 
{ 
    foo(); 
    return; 
} 
bar(); 
return; 

так же, как это:

if (someCondition) 
{ 
    foo(); 
} 
else 
{ 
    bar(); 
} 
return; 

Единственное отличие заключается в читаемости. Иногда один путь более читабельен, иногда другой. См. Refactoring: Replace Nested Conditional with Guard Clauses.

Вложенные условными:

double getPayAmount() { 
    double result; 
    if (_isDead) result = deadAmount(); 
    else { 
     if (_isSeparated) result = separatedAmount(); 
     else { 
      if (_isRetired) result = retiredAmount(); 
      else result = normalPayAmount(); 
     }; 
    } 
    return result; 
}; 

Guard Морозы:

double getPayAmount() { 
    if (_isDead) return deadAmount(); 
    if (_isSeparated) return separatedAmount(); 
    if (_isRetired) return retiredAmount(); 
    return normalPayAmount(); 
}; 
+1

вы не рассматриваете использование 'return' в своем вопросе. – Jeriko

+0

Извините, вопрос был отредактирован после того, как я отправил свой ответ. Теперь я обновил свой ответ. –

2

Предполагая, что нет другого кода, нет разница в терминах путей кода и то, что выполняется.

Главное отличие состоит в том, что при указании предложения else это будет выполняться только в том случае, если выражение в if оценивается как false. Если вы не укажете его, код будет всегда бежать.

Update:

Это:

if(second) 
{ 
return here(); 
} 
else 
{ 
return here(); 
} 

И это:

if(second) 
{ 
return here(); 
} 
return here(); 

бы быть такой же, как это:

return here(); 

Почему? Потому что вы делаете то же самое, независимо от того, что оценивает second, поэтому проверка излишняя.

+0

Технически вы правы, но это немного вводит в заблуждение из-за комментария // код else без него –

+0

@David Archer - я был в середине редактирования ... см. Обновленный ответ. – Oded

+0

скажите, пожалуйста, если я только вернусь, не делаю никаких действий. – 2010-07-23 08:07:37

0

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

0

В первом случае, то часть только выполняется, если вторая переменная является ложным. Во втором случае часть, в которой оставлено else, всегда выполняется (учитывая, что firstcheck в обоих случаях истинна).

1

Два набора кода семантически похожи. То есть они будут выполнять то же самое во время выполнения. Однако, если вы будете использовать ту или иную форму, это зависит от ситуации. Ваш код должен выразить ваше намерение в дополнение к необходимой семантике.

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

if (withdrawAmmount < accountBalance) 
{ 
    return Deduct(); 
} 
else 
{ 
    return ArrangeCredit(); 
} 

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

if (parameter == null) 
{ 
    return NothingToDo(); 
} 

return PerformActions(); 

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

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

0

Вашего код имеет слишком много заявлений возвратных, что я чувствую, как повторяющийся, например

if(firstchek) 
{ 
    if(second) 
    { 
    return here(); 
    } 
    else 
    { 
    return here(); 
    } 
} 

выше, равно

if(firstchek) 
{   
    return here();   
} 

, потому что здесь() такое же вызов функции. И второй пример

if(firstcheck)  
    {  
     if(second)  
     {  
     return here();  
     }  
      return here();  
     // else code without else  
    }  
    // code without else  
    // else code is here  
     return here(); 

равно

if(firstcheck)  
{  
    return here();  
} 
return here(); 

В первом примере, если есть некоторое заявление после того, как на примере и верхний уровень, если условие не выполнено, то операторы следующим будут выполнены примером

if(firstchek) 
    { 
     if(second) 
     { 
     return here(); 
     } 
     else 
     { 
     return here(); 
     } 
    } 

CallMyCellNo(); 

CallMyCellNo() будет вызываться, если условие верхнего уровня, если условие не выполнено.

Во втором примере вы возвращаетесь сюда() после инструкции toplevel if, поэтому независимо от возвращаемого значения условия if выполнение функции прекращается.

Смежные вопросы