// codeart.ru / Главная / Нафига козе баян

Нафига козе баян

Автор: Evgeny Sergeev

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

for( var i = mass.length; i; )
{
i–;
// Тело цикла обрабатывающее массив mass

}

Что, собственно, меня не устраивает в таком “невинном” и вполне работающем листинге. А не устраивает непростительная, на мой взгляд, небрежность. Зачем разрывать условие цикла на две части, одну из которых вносить непосредственно в тело цикла? Чтобы рано или поздно, скопировав одну часть кода, получить трудно отлавливаемый баг? Или, чтобы еще больше запутать того, кто будет работать с программой после тебя? Более того, рефакторинг этого простого участка на практике может оказаться гораздо сложнее, чем кажется! Его можно переделать так:

for( var i = mass.length - 1; i; i–)
{
// Тело цикла
}

Казалось бы, так намного лучше. Но(!) внимательный программист обратит внимание, что, переписав цикл, мы потеряли один элемент, а именно mass[0]. В данном случае ошибка допущена сознательно, но где гарантия, что другой программист не сделает этого неосознанно? Поэтому, предлагаю писать понятно с самого начала, не стараясь экономить на спичках, в итоге все равно выйдет дороже.

Наилучшим мне видится такой вариант:

for( var i = mass.length - 1; i >= 0; i–)
{
// Тело цикла
}
  1. Написать i– внутри цикла for может только человек, не обученный программированию на уровне старшей школы 8)

    И еще одна частая ошибка: в циклах сравнивают переменную-счетчик с одним и тем же значением, которое при этом вычисляется каждый раз заново. Часто вижу такое: for($i=0; $i

  2. Блин, посчитали символ «меньше» за открытие тэга 8(

  3. Ага, боян :) Это — Improved Native For-Loop.

  4. lusever, извини, как раз таки то, что я написал в самом конце и есть “Improved Native For-Loop”, а то, что я привел в самом начале - есть порнография!

    Возможно, я неправильно понял твой коммент, но поясню, мне не понравился не обратный порядок обхода массива, он то как раз понятен, мне не понравился вынос i– в тело цикла!

  5. В точечной проверке конечного значения массива есть ещё одна засада. В данном случае она не срабатывает, но вообще таких вещей стоит избегать. Простите, я на Java напишу :) В примере:

    for( int i = MAX; i != MIN; i– ) { … }

    все будет хорошо, пока MAX не окажется меньше MIN. Лучше себя обезопасить и написать честное условие на переменную цикла:

    for( int i = MAX; i >= MIN; i– ) { … }

  6. Я обычно пишу

    for( var i = mass.length; i–; )

Leave a Reply

« Как я узнал, что такое WireShark Количество сайтов откомментированных с помощью SnappySnoop перевалило за 100 »