20 февраля 2012 г.

Приоритеты в тестировании

Иной раз так хочется добавить в код приложения такие строки:
if IsAbsolutelyImpossibleParameters then
    MessageBox(Handle, PChar('Дорого́й, как же ты меня достал!..'),
      PChar('Тестировщику'), MB_ICONINFORMATION);
Господа тестировщики, проверяйте, пожалуйста, основную функциональность, а не пытайтесь уронить при помощи белиберды в качестве входных параметров. Хотя бы в первую очередь.

16 февраля 2012 г.

Минимальные размеры формы

Очень часто встает вопрос: нужно ли задавать минимальные размеры формы, такие, когда формой ещё можно пользоваться?

Моё мнение: нет, не нужно.

Поясню. В разработке под Windows законодателем мод следует считать Microsoft. И потому, что Windows — их детище, и потому, что они выпускают самые популярные приложения под эту операционную систему, и потому, что они выпускают очень популярные средства разработки. В общем, причин масса.

Так вот, если лень изучать документацию, лазать по сайтам MSDN, смотреть гайды, то есть простой способ. Запускаем Word, к примеру, и изменяем размер окошка до минимального:



Я тоже считаю, что пользователь не настолько туп, что не знает, до какого размера он хочет уменьшить окошко, и растеряется, если уменьшит его слишком сильно. А ещё меня бесят программисты, которые считают возможным что-то мне как пользователю указывать и как-то ограничивать.

Ещё один немаловажный момент состоит в том, что ограничить технически сложнее, чем не вмешиваться. На примере той же формы: программист всё замечательно, с дотошностью до пикселя выверил размеры, выпустил приложение. А у пользователя: а) другая версия Windows; б) другая тема; в) другой размер шрифтов.

Хотите поддерживать все эти случаи? Флаг вам в руки.

Всегда обнуляйте записи

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

Всегда обнуляйте. Точка.

Сделать это очень просто, используйте либо функцию FillChar, либо ZeroMemory. Я использую второй вариант, поскольку первый вызывает неоднозначные ассоциации. Тем не менее, рассмотрим оба варианта.

FillChar:
FillChar(Rec, SizeOf(Rec), 0);
ZeroMemory:
ZeroMemory(@Rec, SizeOf(Rec));

Оба варианта выполняют одно и то же, обнуляют участок памяти.

Теперь расскажу, почему так важно это делать. При объявлении локального идентификатора типа запись не производится его автоматическая инициализация, поля заполнены мусором (за исключением управляемых). В подавляющем большинстве случаев это абсолютно неважно, так как либо ни на что не влияет, либо программистом производится полная инициализация записи перед её использованием. Зато иногда…

Не так давно я напоролся на то, что в Windows XP стабильно генерировалась ошибка доступа к памяти (Access violation), хотя в Windows 7 всё замечательно работало. Причина банальна: я не обнулил запись перед вызовом API-функции SHBrowseForFolder. В семерке это не сказалось, в XP стало фатальным.