Должны ли ярлыки, краткость и сообразительность регулярно пропускаться для ясности? - PullRequest
6 голосов
/ 21 ноября 2010

Этот вопрос пришел в голову после просмотра этого простого куска кода:

if (!x%y)
{
    // do something
}

Может быть, это влияние ранних книг на Си (K & R?), Но не всегда ли предпочтительны следующие, если не такие милые?

if (x%y != 0)
{
    // do something
}

Ответы [ 8 ]

7 голосов
/ 21 ноября 2010

Эта цитата отвечает на ваш вопрос.

"Отладка в два раза сложнее, чем писать код в первую очередь. Поэтому, если вы пишете код как можно умнееВы, по определению, недостаточно умны, чтобы его отладить. "- Брайан В. Керниган

5 голосов
/ 21 ноября 2010

Прежде всего, реквизиты для всех, кто замечает, что (!x%y) не эквивалентен (!(x%y)), но что более важно, ни один из них не эквивалентен:

if (x % y != 0)

, который имеет гораздо более приятную форму:

if (x % y)

Лично я стараюсь не писать ==0, когда его можно заменить на использование ! без введения чрезмерных скобок, и я абсолютно никогда не использую !=0, но это обсуждение, которое будетначать пламенные войны.: -)

5 голосов
/ 21 ноября 2010

Вы уверены в этом коде? !x%y означает (!x)%y, потому что ! связывается сильнее, чем %.

(По этой причине я бы предпочел x % y != 0.)

2 голосов
/ 21 ноября 2010

Хитрость должна быть пропущена. Это не умно ... или, что более важно, ремонтопригодно.

Ярлыки и краткость могут быть или не быть приемлемыми: мы все используем ярлыки, но есть почти «стандартные» ярлыки, потому что мы все это делаем. Никаких умных ярлыков, хотя

2 голосов
/ 21 ноября 2010

Предпочитаю ясность, а не краткость.Второй пример x % y != 0 более понятен.

Конечно, то, что составляет ясность, несколько субъективно, но я предпочитаю резервировать унарный оператор ! для логических переменных или функций, возвращающих логические значения.* Обычно я пытаюсь измерить ясность, когда пишу код, спрашивая себя: смогу ли я легко прочитать и понять эту строку, если 1) кто-то другой написал это или 2) мне пришлось читать ее снова 2 года спустя?.

1 голос
/ 21 ноября 2010

На самом деле, если вы хотите, чтобы ваш код самодокументировался (стиль Мартина Фаулера), вы можете использовать более подробное:

every_player_gets_equal_points = x%y;
if (!every_player_gets_equal_points) { //Some players get more: now base on completion time
1 голос
/ 21 ноября 2010

Ясность побеждает краткость каждый день, по моему мнению. Я иногда чувствую, что написание кода, такого как:

if(!(x = func(y)) && ++z == x)

... эквивалентно быстродействующим полосам на автомобиле. Это может быть быстро, но это не так. Я также не думаю, что использование непонятных имен переменных (например, в приведенном выше примере) для экономии при наборе текста является хорошей идеей.

Что тут лучше:

for(int x(0) x < managers.size(); ++x)
    managers[x]->initialise();

или

for(int mgr(0); mgr < managers.size(); ++mgr)
    managers[mgr]->initialise();

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

for(int mgr(0); mgr < managers.size(); ++mgr)
{
    for(int dependentMgr(0); dependentMgr < managers[mgr].dependents().size(); ++dependentMgr)
    {
        // init these first
    }
}

Очевидно, что речь идет не о том, использовать итераторы или нет, просто о том, должны ли мы использовать четкие имена или нет.

Когда я смотрю на фрагмент кода, который не видел раньше, имена переменных - это все. Я съеживаюсь, когда вижу tmp и tempt2 и vec2. Они ничего не значат.

Серьезно, люди, если вы беспокоитесь о количестве набираемой вами информации, получите IDE с автозаполнением или отправляйтесь выращивать цыплят на Фиджи:)

0 голосов
/ 21 ноября 2010

Первый фрагмент кода, который вы предоставляете, ...

if (!x%y)
{
    // do something
}

... не имеет смысла и поэтому, скорее всего, неверен, поскольку !x%y эквивалентно !x за исключением случаев y равно -1, 0 или 1, а в случае y равно 0 это неопределенное поведение (т. е. %y обычно бессмысленно).

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

И поэтому это прекрасно иллюстрирует, что ясность - хорошая идея.

Приветствия и hth.,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...