Последний элемент в цикле заслуживает отдельного обращения? - PullRequest
18 голосов
/ 01 октября 2008

При просмотре я иногда сталкиваюсь с таким циклом:

i = begin
while ( i != end ) {    
   // ... do stuff
   if ( i == end-1 (the one-but-last element) ) {
      ... do other stuff
   }
   increment i
}

Тогда я задаю вопрос: ты бы написал это?

i = begin
mid = ( end - begin ) / 2 // (the middle element)
while ( i != end ) {    
   // ... do stuff
   if ( i > mid ) {
      ... do other stuff
   }
   increment i
}

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

i = begin
mid = ( end - begin ) / 2 //(the middle element)
while ( i != mid ) {    
   // ... do stuff
   increment i
}

while ( i != end ) {
   // ... do stuff
   // ... do other stuff
   increment i
}

Теперь я даже увидел вопрос на SO о том, как правильно написать if -классу ... И мне стало грустно: что-то здесь не так.

Я не прав? Если так, что хорошего в загромождении тела цикла особыми случаями, о которых вы знаете заранее, во время кодирования?

Ответы [ 13 ]

1 голос
/ 01 октября 2008

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

0 голосов
/ 01 октября 2008

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

0 голосов
/ 01 октября 2008

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

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

...