Вам нравятся языки, которые позволяют вам поставить «тогда» перед «если»? - PullRequest
9 голосов
/ 30 апреля 2010

Сегодня я читал мой код на C # и нашел следующую строку:

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

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

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

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

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

return 3 if (x > y);

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

Что вы думаете о конструкции «тогда перед if»? Существует ли он на выбранном вами языке? Вы часто используете это? Извлечет ли это пользу из C #?

Ответы [ 15 ]

14 голосов
/ 30 апреля 2010

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

using System.Windows.Controls.Primitives;

...

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

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

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

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

10 голосов
/ 30 апреля 2010

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

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

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

9 голосов
/ 30 апреля 2010

Да. Это читается лучше. 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 голосов
/ 30 апреля 2010

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

{
   doSomething();
   doSomethingElse();

   // 50 lines...

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

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

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

4 голосов
/ 30 апреля 2010

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

if (x > y) return 3;
3 голосов
/ 30 апреля 2010

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

return 3 if (x > y);

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

return 3 unless y <= x

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

1 голос
/ 21 июня 2010

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

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

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

1 голос
/ 30 апреля 2010

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

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

using System.Windows.Controls.Primitives;

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

if (!isContainersGenerated) return;
//alternatively

return if (!isContainersGenerated);
1 голос
/ 30 апреля 2010

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

0 голосов
/ 26 декабря 2010

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

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

index = bla.find 'a'
вернуть, если индекс -1

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

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

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

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

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