Короче говоря, вы должны пойти с той версией, которая проще всего читать и обслуживать.
В несколько более старых случаях я знаю, что выход из цикла считался no-no (наравне с оператором goto). Предполагалось, что петли будут разбиты на состояние цикла и больше нигде. Таким образом, петля while была бы способ пойти.
(Это, вероятно, отрыв от сборки, где петли в основном представляют собой блок кода с инструкцией перехода от начала к началу-if-true в конце. Множество операторов условного перехода в блоке делают это чрезвычайно трудно отлаживать, поэтому их следует избегать и объединить в один в конце.)
Я чувствую, что эта идея, похоже, сегодня немного меняется, особенно с петлями foreach и управляемым миром; теперь это действительно вопрос стиля. Прерывание находки для циклов, возможно, стало приемлемым для многих, но, конечно же, сохранить пуристов. Обратите внимание, что я все же избежал бы использовать break in while-loop, поскольку это может запутать условие цикла и сделать его запутанным.
Если вы позволите мне использовать цикл Еогеасп, я считаю ниже код, чтобы быть много легче читать, чем его брат, а петли:
bool isBaxterInMilwaukee;
foreach (var item in myArray)
{
if (item.name == "baxter" && item.location == "milwaukee")
{
isBaxterInMilwaukee = true;
barkTwice();
break;
}
}
Однако, как логика растет по сложности, вы можете рассмотреть замечательный комментарий рядом с заявлением break
, чтобы он не был похоронен и его трудно было найти.
Можно утверждать, что вся эта вещь должна быть переработана в свою собственную функцию, которая не break
на нашли, но на самом деле return
s результат (не стесняйтесь использовать для цикла версии, а):
bool isBaxterInMilwaukee(Array myArray)
{
foreach (var item in myArray)
{
if (item.name == "baxter" && item.location == "milwaukee")
{
barkTwice();
return true;
}
}
return false;
}
Как Esko Luontola отметил, что, вероятно, будет лучше, чтобы переместить вызов barkTwice()
вне этой функции в качестве побочного эффекта не видно из имени функции, ни связано с нахождением Бакстер в каждом конкретном случае. (Или добавьте булево значение BarkTwiceIfFound
и измените строку, чтобы прочитать if(BarkTwiceIfFound) barkTwice();
сделать побочный эффект ясного.)
Для записи, вы можете также сделать проверку флага в течение петли без перерыва, но я чувствую, что это на самом деле вредит читаемости, потому что вы не ожидаете дополнительное условие в определении для цикла:
var i:int;
var isBaxterInMilwaukee:Boolean;
for (i = 0; !isBaxterInMilwaukee && i < arrayLen; i++)
{
if (myArray[i]["name"] == "baxter"
&& myArray[i]["location"] == "milwaukee")
{
isBaxterInMilwaukee = true;
barkTwice();
}
}
вы также можете моделировать автоинкрементные механику с While-цикл. Мне не нравится это по нескольким причинам - вы должны инициализировать i
, чтобы быть меньше, чем ваше реальное начальное значение, и в зависимости от того, как ваш компилятор закорочивает логику состояния цикла, ваше значение i
при выходе из цикла может варьироваться. Тем не менее, это возможно и для некоторых людей, это может улучшить читаемость:
var i:int = -1;
var isBaxterInMilwaukee:Boolean;
while (!isBaxterInMilwaukee && ++i < arrayLen)
{
if (myArray[i]["name"] == "baxter"
&& myArray[i]["location"] == "milwaukee")
{
isBaxterInMilwaukee = true;
barkTwice();
}
}
У вас есть перерыв; в обоих – TheTXI
Я не думаю, что вы имеете в виду, что вы должны быть в вашем цикле while. –
Я никогда не использовал ActionScript, но часть «i == arrayLen» в состоянии while выглядит неправильно.Разве это не должно быть «i
unwind