Стоит ли усилий, чтобы иметь функцию, которая возвращает инверсию другой функции? - PullRequest
5 голосов
/ 23 апреля 2009

Я недавно добавил функцию HasValue во внутреннюю библиотеку JavaScript:

function HasValue(item) {
    return (item !== undefined && item !== null);
}

А во время беседы с коллегой нам пришла в голову идея добавить еще одну функцию, которая в основном была бы обратной: возможно HasNoValue или IsNothing Если бы мы в конечном итоге сделали это, у нас было бы:

function HasNoValue(item) {
    return (item === undefined || item === null);
}
function HasValue(item) {
    return !HasNoValue(item);
}

Однако мы не уверены, является ли более читабельным наличие обоих или HasValue. Что является более читабельным / предпочтительным?

A:

if (HasValue(x) && !HasValue(y))

B

if (HasValue(x) && HasNoValue(y))

Ответы [ 7 ]

20 голосов
/ 23 апреля 2009

Я предпочитаю от А до Б. "!" это идиома программирования, которая должна быть понятна всем.

12 голосов
/ 23 апреля 2009

Если !HasValue(y) и HasNoValue(y) гарантированно будут логически эквивалентны во всем диапазоне ввода y, то я бы очень предпочел !HasValue(y).

Я бы не хотел даже иметь функцию с именем HasNoValue(y), потому что неизбежно кто-то напишет !HasNoValue(y).

8 голосов
/ 23 апреля 2009

Я голосую «А» , безусловно .

Дополнительное бремя обслуживания, связанное с выполнением этой функции для каждой и любой логической функции возврата, не стоит этого по сравнению с понятным и вполне читаемым «!», И фактически я считаю, что «B» на самом деле меньше читабельно, так как так легко пропустить "Нет" в середине названия.

2 голосов
/ 23 апреля 2009

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

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

1 голос
/ 23 апреля 2009

Просто для того, чтобы иметь меньше строк кода и поскольку ваша функция возвращает логическое значение, я бы сказал, что нужно использовать метод A. Если вам нужно беспокоиться о читабельности, вы всегда можете попробовать:

if ( HasValue(x) && !(HasValue(y)) )
0 голосов
/ 23 апреля 2009

Я бы придерживался варианта А, но это только я.

0 голосов
/ 23 апреля 2009

Я бы сказал, вариант А более понятен, вы точно знаете, что это значит.

...