@xtofl,
я соглашаюсь с Вашим беспокойством.
Миллион раз я встретился с подобной проблемой.
Или разработчик добавляет специальную обработку для первого или для последнего элемента.
В большинстве случаев это стоит только к циклу от startIdx + 1 или к endIdx - 1 элемент или даже разделило один длинный цикл на несколько более коротких циклов.
В очень редкие случаи не возможно разделить цикл.
, По-моему редкий вещи должны быть обработаны за пределами цикла, когда это возможно.
Какой работает лучше?
, Если бы количество объектов является очень большим затем, я всегда циклично выполнялся бы однажды, особенно если Вы собираетесь выполнить приблизительно операция на каждом объекте. Стоимость оценки условного выражения, вероятно, будет меньше, чем цикличное выполнение дважды.
ой, конечно, Вы не цикличное выполнение дважды... В этом случае два цикла предпочтительны. Однако я поддерживаю, что основное соображение должно быть производительностью. Нет никакой потребности подвергнуться условному выражению в цикле (N времена), если можно разделить работу простым управлением границами цикла (однажды).
В последнем отрывке Вы отправили, Вы повторяете, что код для//.... наполняет.
Это понимает хранение 2 циклов, когда у Вас есть совершенно другой набор операций на другом наборе индексов.
i = begin
mid = ( end - begin ) / 2 //(the middle element)
while ( i != mid ) {
// ... do stuff
increment i
}
while ( i != end ) {
// ... do other stuff
increment i
}
Это не имение место, Вы все еще хотели бы сохранить один единственный цикл. Однако факт остается, что Вы все еще сохраняете (конец - начинаются) / 2 количества сравнений. Таким образом, это сводится к тому, хотите ли Вы, чтобы Ваш код выглядел аккуратным, или Вы хотите сохранить некоторые циклы ЦП. Вызов является Вашим.
Особый случай должен быть сделан вне цикла, если это только, чтобы быть выполненным однажды.
Однако может быть индекс или некоторая другая переменная (переменные), которые просто легче держать цикл внутри из-за обзора. Может также быть контекстная причина хранения всех операций на datastructure вместе в управляющей структуре цикла, хотя я думаю, что это - слабый аргумент самостоятельно.
Конечно, специально случающиеся вещи в цикле, который может быть вытащен, глупы. Я не копировал бы do_stuff также хотя; я или поместил его в функцию или макрос, таким образом, я не делаю кода вставки копии.
Я пришел к пониманию, что, когда я вставил особые случаи для цикла, я обычно слишком умен для своей собственной пользы.
Другая вещь, которую я очень не хочу видеть, шаблон для случая :
for (i=0; i<5; i++)
{
switch(i)
{
case 0:
// something
break;
case 1:
// something else
break;
// etc...
}
}
я видел это в реальном коде.
Я думаю, что Вам закрепили его полностью. Большинство людей попадает в прерывание включения условных переходов в циклах, когда они могли сделать их снаружи: который является просто быстрее .
, Например:
if(items == null)
return null;
StringBuilder result = new StringBuilder();
if(items.Length != 0)
{
result.Append(items[0]); // Special case outside loop.
for(int i = 1; i < items.Length; i++) // Note: we start at element one.
{
result.Append(";");
result.Append(items[i]);
}
}
return result.ToString();
И средний случай Вы описали, просто противны . Вообразите, растет ли тот код и должен быть пересмотрен в различные методы.
, Если Вы не анализируете XML < grin> циклы должны быть сохранены максимально простыми и краткими.
Его примерно использование его согласно потребности и удобству. Там не как таково никакие упоминания для обработки элементов одинаково и нет, конечно, никакого вреда, бьющего функции, которые обеспечивает язык.
Я знаю, что видел это, когда люди пытались присоединиться к элементам массива в строку запятой-seperated:
for(i=0;i<elements.size;i++) {
if (i>0) {
string += ','
}
string += elements[i]
}
у Вас или есть то выражение if там, или необходимо копировать строку + = строка снова в конце.
очевидное решение в этом случае
string = elements.join(',')
, Но метод соединения делает тот же цикл внутренне. И существует не всегда метод, чтобы сделать то, что Вы хотите.
Я думаю, что Вы правы относительно цикла, бывшего предназначенного для контакта со всеми элементами одинаково. К сожалению, иногда существуют особые случаи, хотя и с ними нужно иметь дело с внутренней частью конструкция цикла через если операторы.
, Если существует много особых случаев, хотя необходимо, вероятно, думать о предложении некоторого способа иметь дело с двумя различными наборами элементов в отдельных конструкциях.
Я не думаю, что на этот вопрос должен ответить принцип (например, "в цикле, рассматривать каждый элемент одинаково"). Вместо этого можно посмотреть на два фактора, чтобы оценить, если реализация хороша или плоха:
, Если это быстрее и код более читаем путем выполнения всего в одном цикле, сделайте это тот путь. Если это медленнее и менее читаемо, сделайте это иначе.
, Если это быстрее и меньше четко, или медленнее но более читаемо, узнают, какой из вопросов факторов больше в Вашем конкретном случае, и затем решают, как циклично выполниться (или не циклично выполняться).