Является ли плохой практикой использовать оценку короткого замыкания вместо предложения if? [Дубликат]

    

У этого вопроса уже есть ответ:

    

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

MyDesktopFolderPath := AddBackslash(ExpandConstant('{commondesktop}')) +
                         'My Folder';
if not DirExists(MyDesktopFolderPath) then
begin
  ForceDirectories(MyDesktopFolderPath); //Create full path
end;
if DirExists(MyDesktopFolderPath) then
begin
  //Perform other actions

Вместо этого я мог бы использовать (использовать?) оценку короткого замыкания, чтобы сделать ее более компактной:

MyDesktopFolderPath := AddBackslash(ExpandConstant('{commondesktop}')) +
                        'My Folder';
IsMyDesktopFolderExisting := DirExists(MyDesktopFolderPath) or
                               ForceDirectories(MyDesktopFolderPath);
if IsMyDesktopFolderExisting then
begin
  //Perform other actions

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

Изменить: Как указано Secure, код не является полностью эквивалентным, но тема обсуждения по-прежнему относится к другим случаям.

6 голосов | спросил thoiz_vd 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 18 Sep 2011 22:07:55 +0400 2011, 22:07:55

5 ответов


12

«Хорошая практика» - НЕТ. Поскольку ваши сверстники могут быть не такими умными, как вы. Но да, в некоторых языках (я бы смею сказать, Perl), Это обычная идиома. Но «эксплуатация» оценки короткого замыкания - если бы она считалась хорошей практикой,

  1. Это конечно показалось бы обычной идиомой в таком месте, как источник ядра Linux (эти ребята клянутся написать самый чистый код на земле).
  2. Если .. Теперь ... Теперь с этим закончится.

Итак, мое предложение, держите его простым, даже если это означает еще несколько нажатий клавиш. Однако только наблюдение и личное мнение.

ответил yati sagade 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 18 Sep 2011 22:57:57 +0400 2011, 22:57:57
9

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

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

ответил unholysampler 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 18 Sep 2011 22:56:09 +0400 2011, 22:56:09
6

Это нормально для меня; это очень распространенная идиома на многих языках: sh, C ++, Perl, Lisp, Ruby и т. д.

Я бы не добавил комментарий; комментарий ничего не добавит к коду.

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

ответил kevin cline 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 19 Sep 2011 04:37:43 +0400 2011, 04:37:43
1

Это код Delphi-Pascal - установка boolean с использованием «или» может считаться обфускацией, но я не думаю, что у любого внимательного опытного разработчика возникнут какие-либо проблемы - я использую эту конструкцию очень часто, и я никогда не была жалоба.

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

В стороне, если я правильно понимаю ваш код, во втором примере «если IsMyDesktopFolderExisting then» не требуется: в этой точке условие всегда верно.

Также: первый пример: «если DirExists (MyDesktopFolderPath)» все, что вам нужно здесь, это «else» - boolean является двоичным: это либо true, либо false. - если это не то, что должно происходить здесь, этот код нуждается в рефакторинге.

ответил Vector 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 19 Sep 2011 00:19:55 +0400 2011, 00:19:55
0

Если вы думаете, что кто-то может быть смущен конструкцией, есть два решения:

  1. Напишите комментарий, объясняющий, что вы сделали.
  2. Напишите его в менее запутанной манере.

Если вы обнаружите, что вам нужно делать # 1 чаще, чем хотите, попробуйте # 2.

ответил Matthew Flynn 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 18 Sep 2011 23:24:53 +0400 2011, 23:24:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132