Страницы

среда, 14 августа 2013 г.

Непопулярные браузеры заставляют нас писать "хороший" код.

Да простят меня фанаты норвежского браузера, Opera нельзя назвать популярным. Да и хлопот от него не меньше, чем от IE например. "У общества без цветовой дифференциации штанов нет будущего", тут не поспоришь, но не до такой же степени. Короче сказ о том, как я искал баг в клиентском скрипте.

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

Вычислить в каком месте кода косяк - дело техники, речь не об этом. Гораздо любопытнее суть косяка.
Для создания условий максимально приближенных к боевым предлагаю вот такой код:
<script>
 // здесь прилетает строка, которую нужно разбить в массив
 var arr = '2013-08-10'.split('-');
 // как известно в JavaScript нумерация месяцев даты начинается с 0, 
 // поэтому далее необходимо из arr[1] вычесть 1
 // честно говоря когда писал этот код сразу написал arr[1] -= 1 - отработало как надо, 
 // но в реальном коде было приблизительно так:
 arr[1] = parseInt(arr[1]) - 1; 
 // собираем дату
 var dt = new Date(arr[0], arr[1], arr[2]);
 // далее продолжение кода
 console.log(dt); // лирическое отступление для наглядности
</script>

Открываем страницу в Chrome, переходим в консоль (Ctrl+Shift+I), обращаем внимание на дату.

Открываем ту же самую страницу в Opera, переходим в консоль (Ctrl+Shift+I), по идее дата должна совпадать.

Вот он этот коварный тип гражданской наружности :).

В реальных условиях процесс вычисления бага "гораздо интереснее": расставляем бряки и по ходу выполнения кода проверяем значения переменных. Для этого:
- в окне Chrome DevTools переходим на вкладку Sources:

- в окне Opera Dragonfly переходим на вкладку Скрипты:

А теперь внимание, вопрос: а где же бага? На первый взгляд все ровно. Кто не догадался - обратите внимание на комментарии в коде.

Мораль. Сказано в писании: глава 15 стих 1.2.2 - parseInt (string , radix). Опциональных аргументов нет - не поленись, добавь основание: parseInt(arr[1], 10).

p.s. Заголовок поста - резюме программиста, который работает за соседним столом - Дима, привет :) !