20.10.2009

Нет отрицательной логике

Что общего у этого кусочка яваскрипта (время от времени встречаю такое в чужом коде):

function init(noLoginForm) {
    if (!noLoginForm) {
        ...
    }
}

и этого фрагмента формы (постоянно сталкиваюсь на сайтах):

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

function init(showLoginForm) {
    if (showLoginForm) {
        ...
    }
}

(Не вижу ничего плохого в том, чтобы по умолчанию чекбокс был зажженным.)

Кстати, думаю, именно по этой причине в Гугл Ридире чекбокс Mark as unread переделали в Mark as read.

7 комментариев:

Unknown комментирует...

Иногда отрицательная логика -- тупо экономия табов. К примеру(Вашему), в функции основной код должен быть выполнен только если noLoginForm будет true, поэтому сначала проверяем на false, и в конце этой проверки делаем return. а после проверки(за закрывающейся скобкой) пишем основой код. итого сыкономили один уровень индентейшена

Unknown комментирует...

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

Степан Резников комментирует...

Что мешает написать так?

function init(showLoginForm) {
if (!showLoginForm) {
return;
}
...
}

Степан Резников комментирует...

Ну и зачем вам этот неявный подписчик? Думаете он будет счастлив получать ненужную ему рассылку?

Пользователь тогда станет вас любить и ходить к вам на сайт и покупать у вас, когда вы ему сделали приятно и удобно, а не когда неявно втюхали рассылку.

Юра комментирует...

Я, конечно, не особо шарю в ДжС, но думал что писать нужно так:

function init(showLoginForm) {
if (showLoginForm) {
...делаем чета там
} else {
return;
}
...
}

Не?

Dzyanis Kuzmenka комментирует...

Мне кажется тут вопрос, в первую очередь, о том как предоставляют выбор пользователю. Использование всяческих "не" только путает человека. Где то я уже наталкивался на статью, что человек для себя подсознательно пропускает это отрицание, ему достаточно тяжело его воспринять.
Обычно, эти с трудом втюханные мне подписки раздражают каждую клетку моего тела до того, что хочется обложить владельцев ресурса чем только можно.
А вот во вторую очередь это относиться к коду, меня всегда бесила функция empty в PHP, приходиться писать так if(!epmty($value)).

dmitriy комментирует...

Всегда лучше писать так:
function(showLoginForm){
if (!showLoginForm){
return;
}
иначе
}

это убирает вложенность и лишние {}
а так же программисту проще читать код.

то же самое
for(var i = 0; i< length; i++){
if (!showLoginForm)
continue;
}