Последний элемент в цикле заслуживают отдельной обработки?

19
задан Community 23 May 2017 в 12:08
поделиться

12 ответов

@xtofl,

я соглашаюсь с Вашим беспокойством.

Миллион раз я встретился с подобной проблемой.

Или разработчик добавляет специальную обработку для первого или для последнего элемента.

В большинстве случаев это стоит только к циклу от startIdx + 1 или к endIdx - 1 элемент или даже разделило один длинный цикл на несколько более коротких циклов.

В очень редкие случаи не возможно разделить цикл.

, По-моему редкий вещи должны быть обработаны за пределами цикла, когда это возможно.

6
ответ дан 30 November 2019 в 02:22
поделиться

Какой работает лучше?

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

ой, конечно, Вы не цикличное выполнение дважды... В этом случае два цикла предпочтительны. Однако я поддерживаю, что основное соображение должно быть производительностью. Нет никакой потребности подвергнуться условному выражению в цикле (N времена), если можно разделить работу простым управлением границами цикла (однажды).

1
ответ дан 30 November 2019 в 02:22
поделиться

В последнем отрывке Вы отправили, Вы повторяете, что код для//.... наполняет.

Это понимает хранение 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 количества сравнений. Таким образом, это сводится к тому, хотите ли Вы, чтобы Ваш код выглядел аккуратным, или Вы хотите сохранить некоторые циклы ЦП. Вызов является Вашим.

5
ответ дан 30 November 2019 в 02:22
поделиться

Особый случай должен быть сделан вне цикла, если это только, чтобы быть выполненным однажды.

Однако может быть индекс или некоторая другая переменная (переменные), которые просто легче держать цикл внутри из-за обзора. Может также быть контекстная причина хранения всех операций на datastructure вместе в управляющей структуре цикла, хотя я думаю, что это - слабый аргумент самостоятельно.

0
ответ дан 30 November 2019 в 02:22
поделиться

Конечно, специально случающиеся вещи в цикле, который может быть вытащен, глупы. Я не копировал бы do_stuff также хотя; я или поместил его в функцию или макрос, таким образом, я не делаю кода вставки копии.

1
ответ дан 30 November 2019 в 02:22
поделиться

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

5
ответ дан 30 November 2019 в 02:22
поделиться

Другая вещь, которую я очень не хочу видеть, шаблон для случая :

for (i=0; i<5; i++)
{
  switch(i)
  {
    case 0:
      // something
      break;
    case 1:
      // something else
      break;
    // etc...
  }
}

я видел это в реальном коде.

1
ответ дан 30 November 2019 в 02:22
поделиться

Я думаю, что Вам закрепили его полностью. Большинство людей попадает в прерывание включения условных переходов в циклах, когда они могли сделать их снаружи: который является просто быстрее .

, Например:

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> циклы должны быть сохранены максимально простыми и краткими.

3
ответ дан 30 November 2019 в 02:22
поделиться

Его примерно использование его согласно потребности и удобству. Там не как таково никакие упоминания для обработки элементов одинаково и нет, конечно, никакого вреда, бьющего функции, которые обеспечивает язык.

0
ответ дан 30 November 2019 в 02:22
поделиться

Я знаю, что видел это, когда люди пытались присоединиться к элементам массива в строку запятой-seperated:

for(i=0;i<elements.size;i++) {
   if (i>0) {
     string += ','
   }
   string += elements[i]
}

у Вас или есть то выражение if там, или необходимо копировать строку + = строка снова в конце.

очевидное решение в этом случае

string = elements.join(',')

, Но метод соединения делает тот же цикл внутренне. И существует не всегда метод, чтобы сделать то, что Вы хотите.

10
ответ дан 30 November 2019 в 02:22
поделиться

Я думаю, что Вы правы относительно цикла, бывшего предназначенного для контакта со всеми элементами одинаково. К сожалению, иногда существуют особые случаи, хотя и с ними нужно иметь дело с внутренней частью конструкция цикла через если операторы.

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

2
ответ дан 30 November 2019 в 02:22
поделиться

Я не думаю, что на этот вопрос должен ответить принцип (например, "в цикле, рассматривать каждый элемент одинаково"). Вместо этого можно посмотреть на два фактора, чтобы оценить, если реализация хороша или плоха:

  1. эффективность Во время выполнения - скомпилированный код работает быстро, или это быстрее сделало бы его по-другому?
  2. Надежность кода - для другого разработчика) действительно ли легко (понять то, что происходит здесь?

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

, Если это быстрее и меньше четко, или медленнее но более читаемо, узнают, какой из вопросов факторов больше в Вашем конкретном случае, и затем решают, как циклично выполниться (или не циклично выполняться).

20
ответ дан 30 November 2019 в 02:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: