Каковы ваши советы по отслеживанию и предотвращению ошибок в циклах? - PullRequest
2 голосов
/ 18 июня 2009

Я только что нашел ... ОПЯТЬ ... ошибка в реальном времени, как показано ниже

for (int i = 0; i < length; i++)
{ //...Lots of code 
    for (int j = 0; i < length; j++)
    {
        //...Lots of code 
    }
}

Вы заметили прямо перед собой внутреннее я, которое ДОЛЖНО БЫТЬ j? Я тоже. Так что теперь я буду использовать:

for (int i = 0; i < length; i++)
{
    for (int i1 = 0; i1 < length; i1++)
    {
    }
}

Какие у вас советы по внутренним и внешним циклам while и for?

Редактировать: Спасибо за ценные ответы. При этом краткое изложение предлагаемых советов:

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

Возможно, вы захотите проверить сводку по LBushkin для следующих

  • по возможности использовать foreach и итераторы
  • инициализировать переменные непосредственно перед вводом циклов
  • Заставить каждый цикл выполнять только одну функцию. Избегайте смешивания обязанностей в одном цикле
  • Когда возможно, делайте ваши петли достаточно короткими, чтобы просматривать все сразу

Ответы [ 12 ]

0 голосов
/ 18 июня 2009

Попробуйте использовать более декларативные конструкции цикла. Например, если вам не нужны индексы (эти i s и j s) и ваша среда программирования позволяет это сделать, вы можете использовать конструкцию foreach для перебора коллекции.

0 голосов
/ 18 июня 2009

Я использую 'ii' и 'jj' для счетчиков переходных циклов, если они мне действительно нужны - их легче искать, чем 'i' и 'j', а также легче заметить в примерах, подобных приведенному выше. Чтобы пойти лучше, вы можете использовать настоящее имя переменной. Если вы зацикливаетесь на строке, вы можете назвать ее CharacterIndex или что-то в этом роде. Он больше печатает, но документирует сам себя и экономит время на отладку непонятных проблем позже.

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

Наконец, если это возможно, желательно покончить с циклом полностью: Boost :: Foreach - это один из способов сделать это в C ++, хотя я обычно предпочитаю использовать такие языки, как Python, которые изначально позволяют прямой итерация содержимого контейнера без необходимости увеличения значения индекса или итератора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...