2016-02-15 4 views
0

Я читал in this Q&A, что, как правило, следует избегать утверждений в циклах continue. Правило стоит придерживаться кода ниже? Если да, то каков был бы лучший способ реорганизовать его, чтобы избавиться от них?Должен ли я избавиться от операторов продолжения

for (property in formInput) { 
     if (!formInput.hasOwnProperty(property) || property === "Id") { 
      continue; 
     } 
     if (property.slice(-3) === "_Id") { 
      setMagicSuggestFromFormInput(property); 
      continue; 
     } 
     if (property.slice(-3) === "_bl" && formInput[property] === true) { 
      $("#" + property).prop("checked", true); 
      continue; 
     } 
     $("#" + property).val(formInput[property]); 
    } 

Edit: Если вы думаете, что цикл должен быть переработан, к тому же с указанием о том, как это можно сделать, не могли бы вы сказать мне, почему вы считаете предложил рефакторинга лучший выбор дизайна?

+0

Личный выбор ... откровенно говоря, я бы предпочел, чтобы выражения 'continue' содержали глубоко вложенный код. –

+0

Возможный дубликат [Почему в JavaScript есть недопустимые утверждения?] (Http://stackoverflow.com/questions/11728757/why-are-continue-statements-bad-in-javascript) – kamilk

+0

Этот вопрос, по сути, исходя из. Просьба о передовой практике или неявных правилах будет порождать очень упрямые ответы, лишенные технической объективности. Этот вопрос, вероятно, будет закрыт. Для получения дополнительной информации см. [Помощь/по теме]. Также обратите внимание, что попытка получить «лучший выбор дизайна» является чрезвычайно широкой и основанной на мнениях. –

ответ

0

Ваш код:

for (property in formInput) { 
    if (!formInput.hasOwnProperty(property) || property === "Id") { 
     continue; 
    } 
    if (property.slice(-3) === "_Id") { 
     setMagicSuggestFromFormInput(property); 
     continue; 
    } 
    if (property.slice(-3) === "_bl" && formInput[property] === true) { 
     $("#" + property).prop("checked", true); 
     continue; 
    } 
    $("#" + property).val(formInput[property]); 
} 

Является эквивалентом:

for (property in formInput) { 
    if (property.slice(-3) === "_Id") { 
     setMagicSuggestFromFormInput(property); 
    } else if (property.slice(-3) === "_bl" && formInput[property] === true) { 
     $("#" + property).prop("checked", true); 
    } else if (formInput.hasOwnProperty(property) && property !== "Id") { 
     $("#" + property).val(formInput[property]); 
    } 
} 

Какой бы предпочтительным способом, как это правильно используя if/then/else и проще рассуждать с логически.

+0

Хорошо, я думаю, это идет [с этим сообщением, почему еще если это хорошо] (http://stackoverflow.com/questions/9169249/why-we-use-if-else-if-instead-of-multiple-if -блок-если-тело-это-возвратного стат) – chrumck

0

Почему бы вам не попробовать «еще если»?

Ввод

$("#" + property).val(formInput[property]); 

внутри еще заявление гарантирует, что он не будет работать, когда один из другого, если заявления выполняются. Вы должны сделать остальные утверждения if else if.

+0

Да, я рассмотрел возможность использования нескольких других, если, но, как упоминалось в комментарии к другому ответу, я не вижу причины дизайна для этого, что бы было преимущества этого? – chrumck

0

Когда вы используете break/continue в цикле или блоке в начале, они действуют как предварительное условие, которое является хорошим дизайном и помогает понять блок легко. Если вы используете continue или break в середине блока с некоторым кодом, он действует как скрытая ловушка и трудно понять, что плохо.

Вы можете проверить эту ссылку для более подробного обсуждения вокруг перерыва/продолжить https://softwareengineering.stackexchange.com/questions/58237/are-break-and-continue-bad-programming-practices

вы могли бы попробовать что-то подобное с вложенным, если еще блок вместо этого.

for (property in formInput) { 
    if (formInput.hasOwnProperty(property) && property !== "Id") { 
    var propVal = property.slice(-3); 
    if (propVal === "_Id") { 
     setMagicSuggestFromFormInput(property); 
    } else if (propVal === "_bl" && formInput[property]) { 
     $("#" + property).prop("checked", true); 
    } else { 
     $("#" + property).val(formInput[property]); 
    } 
    } 
} 
0

Если не хотите использовать продолжать заявления, то вы можете идти по пути вложенного кода:

for (property in formInput) { 
    if (formInput.hasOwnProperty(property) && property !== "Id") { 
     if (property.slice(-3) === "_Id") { 
      setMagicSuggestFromFormInput(property); 
     } 
     else if (property.slice(-3) === "_bl" && formInput[property] === true) { 
      $("#" + property).prop("checked", true); 
     } 
     else{ 
      $("#" + property).val(formInput[property]); 
     } 
    } 
} 

Я действительно, как ответы на связанном Q & продуманным. Это инструмент, и вы должны использовать его, когда это необходимо.

0

Вы можете вложить условные проверки и инвертировать условия.

for (property in formInput) { 
    if (formInput.hasOwnProperty(property) && !property === "Id") 
     if (property.slice(-3) === "_Id") { 
      setMagicSuggestFromFormInput(property); 
     else if (property.slice(-3) === "_bl" && formInput[property] === true) 
      $("#" + property).prop("checked", true); 
     else 
      $("#" + property).val(formInput[property]); 
    } 
} 
+0

Хорошо, но мне кажется непонятным, почему добавление двух уровней гнездования лучше, чем продолжение. Какова была бы настоящая цель добавить эту сложность ради удаления «продолжить»? – chrumck

+0

Это упрощает обслуживание и добавление позже. Легче видеть намерение и читать при использовании if-else. Разумеется, нет никакой разницы. –

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