Почему разработчики на C # открывают новые скобки? [закрыто]

44

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

public void MyFunction(string myArgument)
{
     //do stuff
}

if(myBoolean == true)
{
    //do something
}
else
{
    //do something else
}

Меня всегда удивляло, насколько это расточительно, особенно в выражениях if / else. И я знаю, что в более поздних версиях C # существуют альтернативы, такие как:

if(myBoolean == true)
    //do something on one line of code

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

Затем я вернулся к созданию JavaScript после долгого отсутствия. На моей памяти разработчики JavaScript делали то же самое, что и curly-brace-newline, но со всеми новыми модными библиотеками и прочим, большинство разработчиков ставят открывающую скобку после объявления:

function MyJavaScriptFunction() {
    //do something
}

В этом вы можете увидеть смысл, потому что, поскольку использование JavaScript и указателей на функции стало популярным в JavaScript, оно экономит много места и делает вещи более читабельными. Поэтому я удивился, почему в C # это не считается готовым делом. Фактически, если вы попробуете описанную выше конструкцию в Visual Studio 2013, она фактически отформатирует ее для вас, поместив открывающую скобку в новую строку!

Теперь я только что увидел этот вопрос на Code Review SE: https://codereview.stackexchange.com/questions/48035/questions-responses-let-me-tell-you-about-you, в котором я узнал, что в Java Язык, с которым я не слишком хорошо знаком, считается неукоснительным открывать свои фигурные скобки сразу после объявления в современном стиле JavaScript.

Я всегда понимал, что C # был изначально смоделирован после Java и придерживался многих из тех же самых стандартов базового кодирования. Но в данном случае, похоже, нет. Поэтому я предполагаю, что должна быть веская причина: в чем причина? Почему разработчики C # (и Visual Studio) применяют открывающие фигурные скобки на новой строке?

Боб Твей
источник
30
Конвенция это просто так.
Одед
19
Visual Studio ничего не применяет, стиль кода настраивается. Что-то должно быть по умолчанию. По умолчанию «лучше» - байкшединг самого высокого порядка.
Фоши
23
Скобка в конце строки - это древний стандарт K & R C. Керниган и Ричи изобрели язык Си, когда на компьютерных дисплеях было только 25 строк (23, если добавить заголовок и строки состояния). Это уже не так, верно? Важна последовательность в проекте. Там являются также научные исследования , показывающие , что скобка на отдельной строке ( с отступом на том же уровне, что и код, на самом деле) улучшает код понимания , несмотря на то , что люди думают , что они думают о эстетике.
Крейг,
10
Кстати, C # всегда поддерживал оценку одной строки кода после условного. На самом деле, это единственное, что он делает, даже сейчас. Помещение кода в фигурные скобки после выражения ветвления просто превращает эту инструкцию в goto (компилятор создает область видимости, используя инструкции jmp). C ++, Java, C # и JavaScript все более или менее основаны на C, по большей части с теми же базовыми правилами синтаксического анализа. Так что в этом смысле C # не «основан на Java».
Крейг,
10
Как примечание стороны, if(myBoolean == true)имеет мало смысла для меня. Пока мы на это, пока нет if ((myBoolean == true) == true)?? Просто if (myBoolean)и этого достаточно. Извините, моя любимая мозоль.
Конрад Моравский

Ответы:

67

Скобка в конце строки - это древний стандарт K & R C из книги Брайана Кернигана и Денниса Ричи « Язык программирования C» , который они опубликовали в 1978 году после совместного изобретения операционной системы UNIX и языка программирования C (я думаю, что C был в основном разработано Ричи), в AT & T.

Раньше были пламенные войны за «единый истинный стиль скобок».

Ричи изобрел язык Си, а Керниган написал первый урок, когда на компьютерных дисплеях отображалось всего несколько строк текста. Фактически, разработка UNICS (позже UNIX) началась на DEC PDP-7, который использовал пишущую машинку, принтер и бумажную ленту для пользовательского интерфейса. UNIX и C были закончены на PDP-11 с 24-строчными текстовыми терминалами. Так что вертикальное пространство действительно было на высоте. У всех нас сегодня немного лучшие дисплеи и принтеры с более высоким разрешением, верно? Я имею в виду, я не знаю о вас, но у меня есть три (3) 24 "1080p дисплеи прямо сейчас передо мной. :-)

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

Что действительно важно, так это согласованность во всем проекте или, по крайней мере, в данном файле исходного кода.

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

if( true )
    {
    // do some stuff
    }

Кстати, C # всегда поддерживал оценку одной команды после выражения ветвления. На самом деле, это единственное, что он делает, даже сейчас. Помещение кода в фигурные скобки после выражения ветвления просто превращает эту команду в команду goto (компилятор создает область видимости, используя инструкции jmp). C ++, Java, C # и JavaScript все более или менее основаны на C, по большей части с теми же базовыми правилами синтаксического анализа. Так что в этом смысле C # не «основан на Java».

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

РЕДАКТИРОВАТЬ : просто посмотрите на ошибку Apple, чтобы goto failувидеть прекрасный пример этой проблемы, которая имела очень серьезные последствия в реальном мире.

if( true )
    doSomething();

становится ...

if( true )
    doSomething();
    doSomethingElse();

В этом случае doSomethingElse()выполняется каждый раз, независимо от результата теста, но, поскольку он имеет отступ на том же уровне, что и doSomething()оператор, его легко пропустить. Это на самом деле не спорно; изучает это. Это большой источник ошибок, добавленных в исходный код во время обслуживания.

Тем не менее, я признаю, что синтаксис закрытия JavaScript выглядит немного глупо с фигурными скобками на своих линиях ... эстетически. :-)

Craig
источник
13
Часть о блоках в условных выражениях немного вводит в заблуждение. В C условное выражение всегда имеет один оператор, но блок (он же составной оператор) является своего рода оператором . C # следует этому прецеденту. В любом случае, условная оценка всегда подразумевает какую-то условную команду перехода или перехода из-за линейного характера всех общих наборов команд. Условное без блока качественно не отличается от условного с блоком (за исключением области видимости).
Амон
3
@ Крэйг, помните, это было в Bell Labs, когда Bell Labs была уполномочена «делать интересные вещи», которые не обязательно были практичными для чего-либо. Поместите умных людей в здание, попросите их провести интересное исследование, убрать их из того, что они делают, не «интересно», и, что забавно, интересная штука (например, транзисторы и Unix) имеет тенденцию появляться. У DARPA была такая же направленность, с самого начала, и они финансировали ОЧЕНЬ хорошую работу во имя фундаментальных исследований.
Джон Р. Штром
3
@Craig: В старые времена Pascal / Delphi я обычно избегал этого для однострочных блоков, так как Pascal использует beginи endвместо фигурных скобок, что делает такие ошибки очень трудно пропустить, и это также более строгое в отношении размещения точек с запятой - но тратить 4 дня в прошлом году отладка проблемы во встроенном C, которая в итоге была вызвана чьей-то нехваткой скобок ..... Я думаю, что должна быть опция компилятора, которая делает скобки обязательными для операторов управления!
Марк К Коуэн
12
Пожалуйста, предоставьте ссылки для "... научных исследований, показывающих, что скобка на своей линии ...". Без по крайней мере двух ссылок (иначе это будет учеба , а не учеба ), это просто случайный выстрел в воздух.
ErikE
2
@Craig, не могли бы вы дать некоторые подсказки, как найти те исследования, которые вы упомянули?
Гжегож Адам Ковальски
30

Разработчики на C # делают это потому, что это настройка по умолчанию для автоформатера Visual Studio. Хотя этот параметр можно изменить, большинство людей этого не делают, и поэтому все разработчики в команде должны согласиться с большинством.

Что касается того, почему это по умолчанию в Visual Studio, я не знаю.

Timwi
источник
15
Это стандарт по умолчанию в Visual Studio, потому что это был общепринятый стиль кодирования в Microsoft, идущий далеко назад, и на самом деле, по крайней мере, в некоторых командах Microsoft этот стиль заключался не только в скобках на своих линиях, но в скобках на своих собственных линиях и с отступом. Так что это вариант в Visual Studio (я лично предпочитаю это).
Крейг,
20
@Craig: Ewwwwwwwww
Легкость гонок с Моникой
5
@PreferenceBean Хм. Лично мне не нравится стиль K & R, потому что скобки просто теряются в шуме на концах строк, и текст кажется мне комковатым, что не просто эстетическое предпочтение, но реально влияет на читаемость / понимание. Мне нравится вертикальные пробелы. Это было немного по-другому на 12-дюймовых мониторах с 24 строками текста в старые времена, когда вертикальное пространство было драгоценным.
Крейг,
10
@Craig: Это не оправдывает отступы в скобках: P
гонки на легкость с Моникой
2
@Craig Чтобы сделать сотрудников Microsoft несчастным?
Матин Улхак
18

Как я и предполагал в этом ответе, здесь - https://softwareengineering.stackexchange.com/a/159081/29029 - я полагаю, что решение использовать готовность Аллмана могло быть признаком наследия Паскаля, учитывая, что Хейлсберг создал Delphi до того, как он разработал C # , То же, что и в случае Паскаля для имен методов.

Лично я верю в следование пословице "в Риме делай, как римляне". Я использую Allman's в C #, но K & R в Java. Я так привык к этому, что переключение конвенции в любом случае раздражает меня.

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

Конрад Моравский
источник
7
+1 за строку «мультиязычный разработчик». Я серьезно предпочитаю брекеты на собственных линиях и с отступом. Однако, работая, например, над проектами ASP.NET (MVC), я обнаружил, что мне нравится C # со «правильным» стилем и JavaScript со стилем «JavaScript». Это немного насмешливо, но, честно говоря, отчасти это то, что синтаксис закрытия JavaScript более привлекателен с фигурной скобкой в ​​конце строки. Так что я такой же раб эстетики, как и любой другой ...
Крейг,
PascalCase для имен методов был стандартом в Microsoft задолго до того, как Андерс Хейлсберг покинул Borland, чтобы стать выдающимся инженером-программистом в Microsoft.
Крейг
2
Интересно, что я использую Allman для всех языков с фигурными скобками. Однако меня все больше интересует, как может выглядеть преобразование отступов в блоки фигурных скобок перед обработкой в ​​Java. «Java-код» может быть очень чистым, когда я оберну вокруг него свой разум распознавания образов. Я думаю, что Python действительно может сделать это правильно: на самом деле нет веских причин для скобок в языке.
tgm1024
Использование пробелов для управления потоком программ - безумие. Python популярен в наши дни, но этот аспект Python был немного сумасшедшим с момента его появления.
Крейг
@Creig Python фанат здесь, пытаясь сделать что-то в JavaScript. Глядя на ваш другой ответ и ваши правки об goto failиспользовании отступа для управления потоком программ, люди естественным образом хотят делать то, что вы видите, и то, что выполняется. Если он с ошибкой с отступом, он просто не работает. Необходимость расшифровать, что означают эти фигурные скобки, отражают ли они отступы, является дополнительной работой сверх понимания программы. Отступы избыточны для фигурных скобок, так почему программисты используют их, если фигурные скобки полезны? Глубокое вложение неразборчиво на любом языке. Jus 'говорю'.
Neil_UK
14

Соглашение, которое вы связываете с Java, - это стиль K & R, или «Один истинный стиль фигурной скобки», и изначально происходит от C. Этот стиль отступа страницы из почтенного Jargon File показывает, сколько лет различию.

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

Джон Биккерс
источник
У меня сложилось впечатление, что в наши дни OTBS (один настоящий стиль фигурных скобок) также подразумевает, что никогда не следует оставлять фигурные скобки после операторов управления даже для отдельных строк кода. Посмотрите на ошибку Apple goto fail.
Крейг