Чому 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 раніше робили таку ж кучеряву-брекет-нову лінію, але з усіма фантазійними новими бібліотеками та іншими речами більшість розробників ставлять початкову дужку після декларації:

function MyJavaScriptFunction() {
    //do something
}

Ви можете бачити сенс у цьому, адже оскільки використання закритих та функціональних покажчиків стало популярним у 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
Конвенція - це просто те.
Oded

19
Visual Studio нічого не примушує, стиль коду налаштовується. Щось має бути за замовчуванням. За замовчуванням "краще" - це велосипедисти найвищого порядку.
Phoshi

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".

Підводячи підсумок, це є трохи релігійної / полум'ї війни питання. Але є дослідження, в яких чітко видно, що впорядкування коду в блоки покращує розуміння людини . Компілятор не міг менше піклуватися. Але це також пов’язано з причиною, чому я ніколи не кладу рядок коду після гілки без дужок - мені занадто просто мені чи іншому програмісту пізніше потрапляти в інший рядок коду та ковзати про те, що він не буде виконати в одному контексті з рядком прямо до або після нього.

EDIT : Просто перегляньте помилку Applegoto fail для ідеального прикладу цієї точної проблеми, яка мала дуже серйозні наслідки в реальному світі.

if( true )
    doSomething();

стає ...

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

У цьому випадку doSomethingElse()виконується кожен раз, незалежно від результату тесту, але, оскільки він відведений до того ж рівня, що й doSomething()твердження, його легко пропустити. Це насправді не сперечається; дослідження це підтверджують. Це велике джерело помилок, введених у вихідний код під час обслуговування.

Я все-таки визнаю, що синтаксис закриття JavaScript виглядає трохи нерозумно з дужками на власних лініях ... естетично. :-)


13
Частина про блоки в умовних умовах трохи вводить в оману. У С умовному завжди є одне твердження, але блок (він же складений вислів) є своєрідним твердженням . C # випливає з цього прецеденту. У будь-якому разі, умовне оцінювання завжди має на увазі якусь умовну інструкцію гото чи розгалуження через лінійну природу всіх загальних наборів інструкцій. Умовне без блоку якісно не відрізняється від умовного з блоком (за винятком масштабування).
амон

3
@Craig, пам’ятайте, це було в лабораторії 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, я не знаю.


15
Це за замовчуванням у Visual Studio, тому що це був загальновизнаний стиль кодування на Microsoft, який повертався назад, і насправді для принаймні деяких команд у Microsoft стиль був не лише дужками на власних лініях, але і дужками на власних лініях і з відступом Тож це варіант і в Visual Studio (я особисто віддаю перевагу).
Крейг


5
@PreferenceBean Хм. Особисто мені не подобається стиль K&R, тому що дужки просто губляться від шуму на кінцях рядків, і текст мені здається незграбним, що не є просто естетичним уподобанням, а фактично впливає на читабельність / розуміння. Мені подобається вертикальний пробіл. Це було дещо інакше на 12-дюймових моніторах з 24 рядками тексту назад у старі часи, коли вертикальний простір був дорогоцінним.
Крейг,

10
@Craig: Це не привід для відступу брекетів: P
Гонки легкості з Монікою

2
@Craig Щоб зробити службовців Microsoft нещасними?
Mateen Ulhaq

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 був трохи божевільним з моменту його появи.
Крейг

@Craig Python вентилятор тут, намагаючись щось зробити в JavaScript. Дивлячись на іншу відповідь та вашу редакцію щодо goto failвикористання відступу для контролю потоку програми - це те, що люди, природно, хочуть зробити, тож ви бачите, що виконується. Якщо це з відступом неправильно, звичайна робота не працює. Додаткова робота над розумінням програми і вище розуміння програми - необхідність розшифрувати, що означають ці брекети, чи відображають вони дійсно відступ. Відступ є надмірним для дужок, тож чому програмісти використовують його, якщо дужки корисні? Глибоке гніздування незрозуміло будь-якою мовою. Jus 'sayin'.
Neil_UK

14

Конвенція, яку ви асоціюєте з Java, - це стиль K&R, або "Один справжній стиль дужки", і спочатку походить від C. Цей стиль відступу сторінки з поважного файлу "Жаргон" показує, наскільки давна відмінність.

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


Я маю враження, що в ці дні OTBS (один справжній стиль дужки) також передбачає, що ніколи не залишати дужки після контрольних заяв, навіть для окремих рядків коду. Дивіться помилку Apple goto fail.
Крейг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.