Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Самые интересные или сложные ошибки. Железобетонный код. (https://javascript.ru/forum/offtopic/56807-samye-interesnye-ili-slozhnye-oshibki-zhelezobetonnyjj-kod.html)

Gozar 05.07.2015 09:19

Самые интересные или сложные ошибки. Железобетонный код.
 
Предлагаю писать в эту тему самые интересные ошибки, с которыми вам довелось столкнуться.
Самое важное в теме описать как вы допустили эту ошибку, а не её тип. Пишите подробности и т.д.

И начну пожалуй с себя.

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

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

Логика скрипта для меня была очень сложная, скрипт работал с временными отрезками и приходилось думать в настоящем прошедшем и будущем одновременно со "сдвигами" в прошлое (когда подсчет идет до определенной даты в прошлом, а сдвиг считается от настоящего или будущего времени). Отладка тоже давалась нелегко, т.к. по всему скрипту нужно было проставить console.log(), прежде чем понять что и куда идет. Ну да суть не в console...

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

После десятков, а может и сотен раз просмотра кода, я наконец нашёл это треклятое место, где была ошибка. Она очень простая и заключалась в ошибке логики.

if (условие1 && условие2) {
//тут расчёт один
}
else {
//тут другой рассчет
}

//Исправить оказалось очень легко:

//выглядит не так красиво и компактно, как в первом варианте, но зато правильно
if (условие1) {
  if (условие2) {
    //тут расчёт один
  }
}
else {
  //тут другой рассчет
}


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

Я думаю в простом коде я бы на такие грабли не наступил, но из-за того, что приходилось много информации держать в голове, такие простые грабли ударили меня особенно сильно :)

Пишем железобетонный код.

Для себя я вывел следующее, не бояться добавить некрасивую вложенность, главное безошибочность.

Пишите свои интересные ошибки и то, как вы их находили и какие выводы после этого делали :)

рони 05.07.2015 09:53

Gozar,
может не очень иннтересная ошибка - но продержалась 5 лет пока Aetae незаметил
Цитата:

Сообщение от Aetae
рони, кстати твой вариант по ссылке создаёт массив массивов.)

ошибка была в том что вырезая с помщью splice один элемент неучёл что splice возвращает массив.
было
arr[i]=m.splice(n,1)

а нужно
arr[i]=m.splice(n,1)[0]

весь код функция формирования массива с уникальными данными с заданной длиной и диапазоном

Deff 05.07.2015 13:14

Давно было, но как то напоролся на такую долгорешаемую ошибку.
Одновременная работа c localStorage на нескольких страницах сайта, вызывает необходимость в дополнительных ячейках флагов занятости/свободности и их тестировании ибо периодически возникали конфликты одновременного обращения, и если заполняется несколько ячеек, бывало что кусок из массива с одной страницы перемежался элементами массива с другой. Естественно для всех страниц использовался общий буфер, ( т.к. размер Storage ограничен ~ 5Mb)
/В данном случае массивы на разных страницах подгружались аяксом/


Часовой пояс GMT +3, время: 06:30.