Вам нравятся языки, которые позволяют вам поставить "then" перед "if"?

Я читал код С# сегодня и нашел эту строку:

if (ProgenyList.ItemContainerGenerator.Status != System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated) return;

Обратите внимание, что вы можете без прокрутки указать, что это оператор "if", который работает с ItemContainerGenerator.Status, но вы не можете легко сказать, что если предложение "if" оценивается как "true", метод вернется в этот момент.

Реально я должен был перенести оператор "return" в строку сам по себе, но это заставило меня задуматься о языках, которые сначала разрешают "затем" часть заявления. Если разрешено С#, строка может выглядеть так:

return if (ProgenyList.ItemContainerGenerator.Status != System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated);

Это может быть немного "аргументированным", но мне интересно, что люди думают об этой конструкции. Это может привести к тому, что строки станут более читаемыми, но это также может быть катастрофическим. Представьте себе этот код:

return 3 if (x > y);

Логически мы можем вернуться только тогда, когда x > y, потому что там нет "else", но часть меня смотрит на это и думает: "мы все еще возвращаемся, если x <= y? Если да, то что мы возвращаем?"

Что вы думаете о конструкции "then before the if"? Он существует на вашем языке выбора? Вы часто используете его? Может ли С# извлечь из этого выгоду?

Ответ 1

Давайте немного переформатируем и посмотрим:

using System.Windows.Controls.Primitives;

...

if (ProgenyList.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
{
    return;
}

Теперь, как трудно видеть оператор возврата? Разумеется, в SO вам все равно нужно прокрутить, чтобы увидеть все условие, но в среде IDE вам не придется... частично из-за того, что вы не пытаетесь поставить условие и результат на одну и ту же строку и к директиве using.

Преимущество существующего синтаксиса С# заключается в том, что текстовый порядок отражает порядок выполнения - если вы хотите знать, что произойдет, вы прочитаете код сверху вниз.

Лично я не поклонник "return if..." - я бы предпочел переформатировать код для удобочитаемости, чем изменить порядок.

Ответ 2

Мне не нравится двусмысленность, которую это приглашает. Рассмотрим следующий код:

doSomething(x)
if (x > y);
doSomethingElse(y);

Что он делает? Да, компилятор мог понять это, но это выглядело бы довольно запутанным для программиста.

Ответ 3

Да. Он читает лучше. Ruby имеет это как часть своего синтаксиса: термин модификаторы оператора

irb(main):001:0> puts "Yay Ruby!" if 2 == 2
Yay Ruby!
=> nil
irb(main):002:0> puts "Yay Ruby!" if 2 == 3
=> nil

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

Ответ 4

Это выглядит уродливо для меня. Существующий синтаксис намного лучше.

if (x > y) return 3;

Ответ 5

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

{
   doSomething();
   doSomethingElse();

   // 50 lines...

   lastThink();
} if (a < b);

Но даже просто разрешая его только в операторах return, вероятно, скользкий наклон. Люди будут спрашивать: "return x if (a); разрешено, так почему бы не что-то вроде doSomething() if (a);?" и тогда вы на своем пути вниз по склону:)

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

Ответ 6

Я не вижу проблем с

return 3 if (x > y);

Это, вероятно, беспокоит вас, потому что вы не привыкли к синтаксису. Также приятно быть в состоянии сказать

return 3 unless y <= x

Это хороший синтаксис, но я не думаю, что ему нужен С#.

Ответ 7

Я думаю, что Ларри Уолл был очень умен, когда помещал эту функцию в Perl. Идея состоит в том, что вы хотите поставить самую важную часть в начале, где ее легко увидеть. Если у вас короткий оператор (т.е. Не составной оператор), вы можете поставить его перед if/while/etc. Если у вас длинный (т.е. Составной) оператор, он переходит в фигурные скобки после условия.

Ответ 8

Лично мне нравятся языки, которые позволяют мне выбирать.

Тем не менее, если вы реорганизуете и переформатируете, то, вероятно, не имеет значения, какой стиль вы используете, потому что они будут одинаково читабельны:

using System.Windows.Controls.Primitives;

...
var isContainersGenerated = 
    ProgenyList.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated;

if (!isContainersGenerated) return;
//alternatively

return if (!isContainersGenerated);

Ответ 9

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

return (x > y) ? 3 : null;

иначе не существует смысла использовать императивные конструкции вроде

return 3 if (x > y);
return 4 if (x = y);
return 5 if (x < y);

imho Это странно, потому что я понятия не имею, где его использовать...

Ответ 10

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

Например, если вы читаете "doSomething (x)", вы думаете "хорошо, так что это вызывает doSomething (x)", но затем вы читаете "if" после него и должны понимать, что предыдущий вызов обусловлен оператор if.

Когда "if" сначала вы сразу знаете, что следующий код может произойти и может обрабатывать его как таковой.

Мы стремимся читать последовательно, поэтому чтение и движение в вашем уме "может случиться" намного проще, чем чтение, а затем осознание того, что вы только что прочитали, нужно пересмотреть и что вам нужно оценить все, чтобы увидеть, в рамках вашего нового оператора if.

Ответ 11

Оба Perl и Ruby имеют это, и он отлично работает. Лично у меня все в порядке с такой же функциональностью, которую вы хотите бросить на меня. Чем больше вариантов я должен написать свой код, тем лучше общее качество, не так ли? "Правильный инструмент для работы" и все такое.

Реально, однако, это своего рода спорный момент, так как довольно поздно для такого фундаментального дополнения в жизненном цикле С#. Мы находимся в точке, где любое незначительное изменение синтаксиса потребует много работы для реализации из-за размера кода компилятора и его синтаксического анализа синтаксического алгоритма. Чтобы новое дополнение было даже рассмотрено, это должно было бы принести довольно много функциональности, и это просто (не так) другой способ сказать одно и то же.

Ответ 12

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

Ответ 13

Это, как и многие вещи, действительно имеет смысл, когда вы используете его в ограниченном контексте (один лайнер) и не имеет абсолютно никакого смысла, если вы используете его где-нибудь еще.

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

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

Ответ 14

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

Я использую что-то вроде этого (в coffeescript):

index = bla.find 'a'
return, если индекс равен -1

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

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

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

Иногда вам нужно позволить все пообщаться и по-настоящему пересмотреть, что на самом деле является лучшим способом сделать что-то.

Ответ 15

Он считал грамматически неправильным поставить ответ перед вопросом, почему он будет отличаться от кода?