2010-04-30 2 views
10

Я читал через некоторые C# код шахты сегодня и нашел эту строку:Вам нравятся языки, которые позволяют вам поставить «then» перед «if»?

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

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

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

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

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

return 3 if (x > y); 

Логически можно возвращать только если х> у, потому что нет «другого», но часть меня смотрит на это и думает, «мы все еще возвращаются, если х < = у If? так, что мы возвращаемся? "

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

+5

Как насчет 'x = 3 if (a = b)' –

+1

Интересно, но чаще всего это не то, что «if» вызывает кодовый блок, а не простое действие. – UpTheCreek

+2

Да, может быть, это имеет смысл только в операторах return, где это немного менее двусмысленно. Взвешивайте с полным ответом, если хотите, @ кодека! Это CW, так что это не для репутации. –

ответ

4

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

if (x > y) return 3; 
+0

Это выглядит только уродливо, потому что вы к нему не привыкли. То же самое при изучении нового языка. Сначала грамматика странная, сбивающая с толку и просто неправильная. Однако вы привыкаете к этому и начинаете думать на этом языке, и это имеет больше смысла ... Японский - хороший пример: «Завтра красный автомобиль с люком в крыше хочет купить», это транслитерированное предложение. Глагол всегда (в значительной степени) - последнее, что вы говорите. Это означает, что вы устанавливаете части фразы в начале, предмете, объекте, а затем присоединяете их вместе в конце. Это совсем другое, все. То же, что и этот код – Armstrongest

+1

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

+0

это тоже правильно, и не путать, на английском языке сказать: «Я куплю красную машину, если у меня будет достаточно денег» против «Если у меня будет достаточно денег, я куплю красную машину». Предоставление программисту опции позволяет им уделять больше внимания тому, что важно. –

9

Да. Это читается лучше. Рубин имеет это как часть его синтаксиса - термин бытия «statement modifiers»

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

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

10

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

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

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

+3

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

+0

Где двусмысленность? Все, что вы сделали, вставляется новая строка. – liammclennan

+0

Я не вижу двусмысленности. Совершенно ясно, как это будет анализироваться. – Blindy

1

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

0

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

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

3

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

return 3 if (x > y); 

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

return 3 unless y <= x 

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

+0

Да, Ruby позволяет использовать ключевое слово if. «вернись» к успеху! если errorCount> 0' в отличие от 'return 'success' if errorCount <1' Можно утверждать, что первый оператор более ясен. – Armstrongest

15

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

using System.Windows.Controls.Primitives; 

... 

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

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

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

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

+1

Ну, с анонимными методами и выражениями lamdba, текстовый порядок не обязательно отражает порядок выполнения. –

+0

@ Senthil: Правда - но я думаю, что в этом случае выгоды перевешивают затраты. В этой ситуации я действительно не думаю, что это так. –

+0

Мне не нравится, что для выражения такой простой концепции требуется четыре строки кода. –

4

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

{ 
    doSomething(); 
    doSomethingElse(); 

    // 50 lines... 

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

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

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

+0

'doSomething() if (a);' отлично. Однако ваш пример ... вероятно, не может быть реализован. Он ограничивается только выражениями одного оператора. – Blindy

+3

C# не пытается использовать «один правильный путь». Я могу придумать, по крайней мере, 4 разных способа сделать условные выражения в C#, 2 совершенно разных синтаксиса LINQ, 4 разных способа повторения и т. Д. Что это за скользкий уклон, о котором вы говорите? – liammclennan

+1

выглядит как выражение 'do/while'. –

-1

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

+1

Правильно, но это не вопрос, прежде всего, он сначала ставит ДЕЙСТВИЕ. «Покупать яйца, если мы отсутствуем», не является грамматически неправильным. – Blindy

+1

Я оставлю здесь опровержение, если с тобой все в порядке. :) –

0

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

+0

Он просто привыкает к этому. Люди замечательно приспосабливаются. Посмотрите на Тагалог ... «На кай татай анги суси» транслитерируется «У Отца ключи» переведено «У отца есть ключи». «Я уверен, что спикеры Tagalog будут чувствовать себя как дома с возвратом x, если ' – Armstrongest

1

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

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

using System.Windows.Controls.Primitives; 

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

if (!isContainersGenerated) return; 
//alternatively 

return if (!isContainersGenerated); 
1

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

return (x > y) ? 3 : null; 

еще, как не существует никакого смысла с помощью императивных конструкций, как

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

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

1

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

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

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

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

0

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

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

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

0

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

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

индекс = bla.find 'а'
возвращения индекса -1

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

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

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

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

Смежные вопросы