Чи повинні фігурні брекети з’являтися на власній лінії? [зачинено]


273

Повинні бути фігурні брекети на власній лінії чи ні? Що ви думаєте про це?

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

чи має бути

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

або навіть

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

Будьте конструктивні! Поясніть, чому поділіться досвідом, підкріпіть це фактами та посиланнями.


104
Я вважаю, що "== true" більше відволікає, ніж вибір розміщення брекетів.
Дан Дайер

11
@Dan: Я думаю, що завжди вираження умовного виразу дуже допомагає в чіткості.
Wizard79

4
Єдиною причиною цього було б, якщо ваш IDE / редактор не підтримує відповідність розпізнавання фігурних дужок.
leeand00

4
@ leeand00: деякі з нас все-таки роздруковують складний / незнайомий код для того, щоб вивчити / анотувати його. Хоча гарний принтер пом'якшує більшість проблем.
Shog9

2
сумно питання закрите. Через деякий час використання синтаксису на основі відступів я перейшов до (можливо, дивної) іншої структури брекетів. Як і ваша перша, але закриваюча дужка в останньому рядку блоку. (після кодового рядка)
cnd

Відповіді:


88

Ще коли я був студентом, я накладав фігурні дужки на один рядок, щоб було менше рядків, і код надрукувався на меншій кількості сторінок. Дивлячись на один символ дужки, надрукований як єдине в рядку, це дратує. (навколишнє середовище, витрата паперу)

Але при кодуванні великих додатків, дозволяючи деяким рядкам із лише дужками в них доступні, враховуючи відчуття «групування», яке воно дає.

Який би стиль ви не вибрали, будьте послідовні, щоб він не став накладним для вашого мозку для обробки декількох стилів у відповідних фрагментах коду . У різних сценаріях (як вище) я б сказав, що нормально використовувати різні стилі, простіше переключити контекст на високому рівні.


6
З іншого боку, дужка на новій лінійці - ANSI STANDARD, K&R - ні. Але краса в стандартах полягає в тому, що існує так багато різних (див. Також uncyclopedia.wikia.com/wiki/AAAAAAAAA ! У енциклопедії).
Четвер

"Є менше рядків" У мене є простори Терабайт і багато пікселів. Чому я повинен дбати про використання більшої кількості ліній?
12431234123412341234123

1
@ 12431234123412341234123: Я думаю, що це означає, тому що деякі люди друкують код для перегляду коду. І кожен не зовсім необхідний новий рядок витрачається на папір, або км² лісового маси витрачається в масштабі. Однак, якщо ви не роздрукуєте його (я, звичайно, ні), ANSI набагато краще, ніж K&R. Крім того, кожен, хто має намір друкувати, мабуть, повинен використовувати автоматизований форматор коду - тому це має бути питанням інструментарію, а не стилю кодування.
Четверть

247

Ніколи не слід робити 3-й метод.

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

Напишіть свій код для інших людей.


113
Я б хотів, щоб я знав, звідки походить ця маленька мудрість. Тому що писати свій код людям, які не будуть намагатися його читати, це настільки ж безглуздо, як ви можете отримати ...
Shog9

69
Другий програміст може додавати власні дужки, коли щось додає. Він не дурний, і в конвенції про кодування, яка заохочує опускати дужки для простих речей, як це, він буде знати, щоб подивитися.
Кен Блум

25
Додаткові брекети не є обов'язковими. Є кілька гірших дизайнерських рішень, які були прийняті на С і передані його нащадкам. Те, що воно живе мовою, як недавно, як C #, викликає у мене гнів.
Адам Кросленд

28
Не має значення, наскільки ви розумні або як вбудований стандарт кодування навколо однорядкових пропущених фігур: якщо ви хочете вирішити проблему або помилку, ви, ймовірно, пропустите, що кучері були опущені. А для загальної загальної 2 секунди роботи, чи справді так погано бути явним?
Йорданія

11
Є одна перевага стилю №3, якого вам все не вистачає: ви отримуєте більше коду на екрані одразу.
Лорен Печтел

203

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

Однак, важливо бути послідовними . Тому я сказав, давайте перекинемо монету і перейдемо до написання коду.

Я бачив, як програмісти чинили опір таким змін. Закінчуй з цим! Я багато разів перемикався в кар’єрі. Я навіть використовую різні стилі в своєму C #, ніж в моєму PowerShell.

Кілька років тому я працював над командою (~ 20 розробників), яка вирішила попросити інформацію, а потім прийняти рішення, а потім застосувати це по всій базі коду. У нас був би тиждень, щоб вирішити.

Багато стогонів і прикольних очей. Багато "мені подобається мій шлях, тому що це краще", але жодної речовини.

Коли ми вивчали точніші питання, хтось запитував, як вирішити цю проблему в стилі brace-on-the-line:

void MyFunction(
    int parameterOne,
    int parameterTwo) {
    int localOne,
    int localTwo
}

Зауважте, що не відразу очевидно, де закінчується список параметрів, і починається тіло. Порівняти з:

void MyFunction(
    int parameterOne,
    int parameterTwo) 
{
    int localOne,
    int localTwo
}

Ми прочитали, як люди в усьому світі вирішили цю проблему, і виявили схему додавання порожнього рядка після відкритого дужки:

void MyFunction(
    int parameterOne,
    int parameterTwo) {

    int localOne,
    int localTwo
}

Якщо ви збираєтеся зробити візуальну перерву, ви також можете зробити це за допомогою дужки. Тоді ваші зорові перерви теж стають послідовними.

Редагувати : дві варіанти рішення "додаткової порожньої лінії" при використанні K&R:

1 / Введіть аргументи функції на відміну від тіла функції

2 / Помістіть перший аргумент у той самий рядок із назвою функції та вирівняйте подальші аргументи у нових рядках до цього першого аргументу

Приклади:

1 /

void MyFunction(
        int parameterOne,
        int parameterTwo) {
    int localOne,
    int localTwo
}

2 /

void MyFunction(int parameterOne,
                int parameterTwo) {
    int localOne,
    int localTwo
}

/ Редагувати

Я все ще стверджую, що послідовність є важливішою, ніж інші міркування, але якщо у нас немає встановленого прецеденту , то шлях до наступного рядка - це шлях.


33
FYI, мені може здатися розумною людиною, але я насправді горіх. Для простих однолінійних блоків я не буду використовувати ні дужки, ні нові рядки, роблячи "if (foo) bar ()" один рядок. Я прагну зробити свій код досить простим, щоб це не було проблемою.
Джей Базузі

38
Прийшов сюди, щоб опублікувати саме це. Тони людей, які тримають вступну дужку на одній лінії, слідують за нею з порожнім рядком (особливо на початку занять і методів), оскільки в іншому випадку важко відокремити заголовок класу / методу від тіла. Що ж, якщо ви все одно будете використовувати додаткову лінію, ви можете також поставити дужку туди і отримати додаткову користь відступу, щоб це було легше помітити.
Євген Брікман

27
Я не бачив порожнього рядка - я більше знайомий з подвійним відступом параметрів для MyFunction (), коли вони відхиляються на інший рядок.
Арман

34
Розбиття параметрів на декілька ліній, як це божевільно.
Фоско

10
Аргумент "параметр функції" - це червона оселедець. Очевидно, що аргументи повинні бути подвійними. Немає жодної проблеми відрізнити його від наведеного нижче коду.
Девід Онгаро

99

Основними правилами є:

  1. Дотримуйтесь існуючого стандарту кодування проекту.
  2. Якщо немає стандарту кодування, і ви редагуєте наявну базу коду, що належить комусь іншому, - будьте узгоджені зі стилем існуючого коду, незалежно від того, наскільки вам це подобається / не подобається.
  3. Якщо ви працюєте над проектом «екологічного поля» - обговоріть з іншими членами команди та прийдіть до консенсусу щодо формального чи неофіційного стандарту кодування.
  4. Якщо ви працюєте над проектом «зеленого поля» як єдиний розробник - вирішите власний розум і будьте безжально послідовними.

Навіть якщо у вас немає ніяких зовнішніх обмежень, найкраще шукати існуючий (широко використовуваний) стандарт кодування або настанову стилю, і спробувати це дотримуватися. Якщо ви закатаєте свій власний стиль, є хороший шанс, що через кілька років вам доведеться пошкодувати про це.

Нарешті, стиль, який реалізовується / реалізується за допомогою наявних шашок стилів та форматів коду, є кращим, ніж той, який потрібно "застосувати" вручну.


10
Ця відповідь заслуговує на більше голосів.
AShelly

1
послідовність є ключовою
MediaVince

70

Перевага першого методу полягає в тому, що він більш вертикально компактний, тому ви можете розмістити більше коду на екрані, і саме тому я віддаю перевагу цьому. Єдиний аргумент, який я чув на користь другого методу, полягає в тому, що це полегшує парне відкривання та закривання дужок, але більшість IDE мають для цього комбінацію клавіш, і це фактично помилкове твердження - замість того, щоб з'єднувати відкривальну дужку до закриття В дужці ви можете з’єднати дужку, що закривається, на вираз "початок блоку" (якщо, інакше, для, поки) на тому ж рівні відступу, тож так само просто визначити, де починається блок.

Я не бачу причин витрачати цілий рядок лише на дужку, коли попереднє для / while / if конструкція вже візуально вказує на початок блоку.

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


12
Ні ... Я кажу, чому зменшувати кількість коду, який може вміститись на екрані, роблячи щось, що не додає ясності коду?
EpsilonVector

6
Коли я починав кодувати, мені сподобалася кожна дужка у своїй лінійці, тепер я віддаю перевагу першому методу
NimChimpsky,

57
Існує величезна кількість досліджень, що проходять аж до раннього періоду Steam (Вайнберг, "Психологія комп’ютерного програмування"), що показує, що розуміння програміста падає ДРАМАТИЧНО, коли кількість коду, який потрібно переглянути, більше, ніж може відображатись за один раз (тобто, одна екранна, одна сторінка принтера). Це явище стверджує, що СТРУКТУРНО розглядати вертикальний простір як цінний ресурс, який не слід марно витрачати, і тому перший спосіб є кращим.
John R. Strohm

10
LOL @ "витрачає цілу лінію". О БОЖЕ МІЙ! Не це!! = P
Нік Спріцер

6
@Julio У коледжі я сильно віддав перевагу методу 1, і не витримав читати метод 2. Після роботи в компанії, яка використовує C #, де стандарт є методом 2, мені також подобається це. Зараз я можу читати або використовувати будь-яке; ні один мене не турбує. Люди, які мають різку протилежну реакцію на ту чи іншу, зазвичай реагують на щось, що їм незнайоме.
KChaloux

46

я віддаю перевагу

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

над

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

адже рядок you.postAnswer();набагато простіше читати та знаходити на перший погляд. По-друге, вона поєднується з лінією над нею ( you.hasAnswer()), завдяки чому мої очі повинні більше зосереджуватися, щоб її прочитати.


7
Це справедливо, поки програма не перевищить висоту екрана. ;)
weberc2

13
@ weberc2 Я думаю, що коли ваша програма перевищує висоту екрану, два рядки менше не сильно зміниться.
Mageek

13
10 років тому я погодився б про простір екрану. Сьогодні я використовую екран 1920 * 1200. Він відповідає великій кількості коду, більше ніж мій мозок може обробити одразу. Перший метод дозволяє мені відступити назад і побачити різні області відкривання / закриття без необхідності її читати.
LightStriker

3
Я ніколи не міг зрозуміти, чому я віддав перевагу цьому методу, але саме для цього.
Деклан МакКенна

2
@Mageek Це запізніло, але це не 2 рядки, це 2 рядки для кожної області. Це O (N), а не O (1). Я насправді не відчуваю цього сильно; важливіше вибрати стиль, який робить довгі списки параметрів читабельними.
weberc2

38

Я віддаю перевагу першому методу. Підтяжки зовсім не варто окремої лінії.

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

Є мови (Python, Haskell, Ruby), які взагалі в порядку без дужок. Це лише підтверджує, що брекети - це сміття, і вони не повинні заслуговувати на них рядки, коли це можливо:

if (you.hasAnswer()){
    you.postAnswer();
}else{
    you.doSomething();
}

7
Я не знаю про Haskell чи Ruby, але Python чутливий до пробілів, тому для позначення блоків не потрібні дужки або інші роздільники. Дужки - це не просто синтаксичний шум; вони служать фактичній меті.
Роберт Харві

14
@Robert, In C ви повинні робити як пробіли, так і дужки. У Python ви повинні робити лише пробіли. Який краще?
П Швед

5
@Pavel, в C 'вам не потрібно робити пробіли.
Кен Блум

7
Програми @KenBloom C без пробілів неможливо прочитати. Тож ви все одно повинні їх робити.
П Швед

6
Незалежно від того, брекети є гарною ідеєю чи ні, саме існування мов, які їх не використовують, не здається аргументом за чи проти. Це лише припускає, що можна мати мову без них, не те, що це гарна чи погана мовна конструкція.
Джейсон

37

Використовуйте Python і повністю убік аргументуйте.


17
+1SyntaxError: not a chance
Сет

6
Це просто не варіант для величезної, переважної більшості проектів. Крім того, відступ для групування має частину проблем.
Брайан Оуклі

@Bryan, я розумію, що це не дуже практично. Я просто подумав, що це точка зору, яка повинна бути там, сильнішою, ніж просто коментар. І я ніколи не стикався з проблемами, викликаними відступом, який ви маєте на увазі, ймовірно, тому, що я не змішую вкладки та пробіли.
Марк Викуп

Використовуйте Go і убік аргументу повністю (плюс статичне введення тексту, швидкість та компілятор!) :)
weberc2

4
Потім занадто багато разів натискайте пробіл і дивіться, як компілятор / перекладач сміється над вами. Це не відбудеться у більшості брекет-мов.
Фарап

27

Положення фігурних брекетів повинно бути

метадані

Конфігурується в IDE програмістом. Таким чином, ці дотепні дужки у всьому коді, незалежно від автора, виглядають однаково.


7
Повністю згоден. Це презентація, а не дані.
Петруза

Проблема полягає в тому, що якщо ви дозволите кожному встановити своє, речі дуже швидко заплутуються, коли виконуються комісії.
Енді

1
@Andy: Саме в цьому справа, IDE змінить те, як вони виглядають, але лише в IDE! Дійсне джерело не буде торкатися. Для контролю версій можна додати гачки, які перекладають будь-які параметри фігурних брекетів у звичайну ситуацію, так що всі перевіряють код однаково.
klaar

@klaar Кожен сучасний IDE, який я використав, змінить вкладки на пробіли та перемістить дужки до їх власної лінії або в кінці рядка "відкриття"; Я не впевнений, чому ви вважаєте, чому джерело не торкається в цих випадках, і це причина мого коментаря. Зазвичай вона змінюється IDE залежно від налаштувань розробників, а це означає, що під час фіксації я побачу багато змін, які є лише шумом, коли брекети переміщуються до своєї власної лінії, таким чином приховуючи АКТУАЛЬНУ зміну, яку хтось зробив.
Енді

@Andy: Чи не існує можливості використовувати гачки, які перетворюють ці невідповідності щодо пробілу та дужок у єдиний стандартний фіксатор, щоб обійти шумову проблему, яку ви описали? Так чи інакше, належна система версій повинна вийти за межі дрібницьких речей, таких як пробіли чи інші безглузді речі.
клаар

19

Це залежить.

Якщо я кодую в Javascript або jQuery, я використовую першу форму:

jQuery(function($) { 
    if ($ instanceOf jQuery) { 
        alert("$ is the jQuery object!"); 
    } 
}); 

Але якщо я кодую в C #, я використовую другу форму, тому що це канонічний спосіб зробити це в C #.

public int CalculateAge(DateTime birthDate, DateTime now) 
{ 
    int age = now.Year - birthDate.Year; 
    if (now.Month < birthDate.Month 
        || (now.Month == birthDate.Month && now.Day < birthDate.Day)) 
        age--; 
    return age; 
} 

Зауважте, що ваш приклад можна написати

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

в C #.


1
Він може бути написаний на багатьох подібних мовах, тому що блок-оператор - це твердження. Додавання! :-)
Тамара Війсман

2
Відповідно до "Рамкових рекомендацій щодо дизайну", "канонічним способом" є розміщення вступної дужки на одній лінії (тобто першої форми). Просто кажу ...
Уве Хонекамп

3
@Uwe: Можливо. Але Microsoft застосувала підхід "узгоджених дужок" для всіх своїх прикладів MSDN C #, і він використовується в Visual Studio, тому ...
Роберт Харві

@Uwe: Це книга Кваліна, і вона жахливо названа так, що є набагато більше, ніж це. FDG на MSDN про це нічого не говорить. Крім того, мені цікаво, чому в Настановах щодо дизайну рамок сказано щось про практику кодування C # ?
Р. Мартіньо Фернандес

3
Справді, слід поставити фігурні дужки на одному рядку в Javascript. Ви можете викликати помилки, якщо фігурні дужки знаходяться на власній лінії. Наприклад, дивіться encosia.com/…
Джозеф Хансен

18

Я вважаю за краще перший, тому що мені важче бачити помилку в цьому прикладі.

if (value > maximum);
{
    dosomething();
}

ніж це в цьому прикладі

if (value > maximum); {
    dosomething();
}

The ; {Виглядає більш неправильно для мене , ніж лінії , що закінчується , ;так що я , швидше за все , щоб помітити це.


11
Ви робите хороший аргумент, але особисто це мені колись траплялося один раз у моїх 5-річних програмах. Я не міг зрозуміти, чому його не виконують, опублікував це на SO і хтось швидко вказав на мене напівкрапкою. Однак щоразу, коли скорочується використання цього рядка менше, мені важче читати.
JD Isaacks

6
"; {" Схожий на якусь підморгуюче бурхливе обличчя або, можливо, людина з вусами.
Гленатрон

+1 Відмінний приклад у відповідь: дуже тонка помилка, легко не помічається. Думка спровокувала теж на макеті, що показує це.
therobyouknow

10
Звичайно, будь-який гідний IDE позначить порожню контрольну заяву, і будь-який гідний компілятор видасть попередження.
Данк

@Dunk Єдиний недолік у вашому аргументі (з яким я енергійно погоджуюся) полягає в тому, що сьогодні так багато людей використовують інтерпретовані мови (JavaScript, PHP тощо), що багато "програмістів" не знають компілятора з подвійного латте.
Крейг

15

Я вважаю за краще незначний варіант 1)

if (you.hasAnswer()) {
    you.postAnswer();
} // note the break here
else {
    you.doSomething();
}

Чому?

  • Я думаю завжди накладання брекетів на власну лінію зменшує читабельність. Я можу помістити лише певну кількість вихідного коду на своєму екрані. Стиль дужок 2) робить алгоритми важкої форми з великою кількістю вкладених циклів та умовних умов болісно довгими.

  • Однак я хочу elseпочати з нової лінії, тому що ifіelse належать разом, візуально. Якщо перед дужкою є дужка, elseпомітити те, що належить, набагато складніше.

  • 3) дискваліфікує себе. Всі ми знаємо, що поганого може статися, якщо ви не виставите дужки і забудете про це.


1
Я бачив цього навколо, де я працюю. Це цікаво.
Алмо

1
Мені також більше подобається цей стиль, оскільки він дозволяє мені ставити коментар над elseрядком, коли це потрібно, та / або вставляти порожній рядок між блоком if-блоком та блоком else, щоб зробити речі менш схожими. Стиль дужок №2 не робить нічого, крім дистанціювання дій від умов. З урахуванням сказаного, мій улюблений, безумовно, не є
дужним

4
Якщо максимізація кількості рядків коду на екрані важлива, тоді просто займіться новими рядками. Ви зможете отримати багато рядків на одному екрані. Я вважаю за краще нічого не змушувати робити паузу і думати під час читання, тобто. моє визначення більш читабельне. За допомогою брекетів мій розум їх ігнорує. Без дужок мій розум повинен призупинити і вирівняти контрольні блоки. Не довга пауза, але пауза нічим не менша.
Данк

1
Так, якщо і інші належать разом, АЛЕ так і {і}, і як} є на окремому рядку, {також повинен бути на окремому рядку. "Я можу помістити лише певну кількість вихідного коду на своєму екрані". І саме тому, сказати 3) було б "дискваліфікувати себе" - це зовсім не варіант. Після десятиліття роботи з 3) я не забув додавати дужки при додаванні нового рядка коду ніколи, і я не знаю когось, хто коли-небудь мав. Якщо мені доведеться коригувати код для людей, які не вміють читати належним чином, де це закінчується? Перестати використовувати певні мовні функції, оскільки деякі читачі кодів можуть не розуміти їх?
Кайзерлуді

10

Я десь читав, що автори якоїсь книги хочуть, щоб їх код був відформатований так:

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

Але обмеження місця у видавця означало, що вони повинні використовувати це:

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

Зараз я не знаю, чи це правда (оскільки я вже не можу її знайти), але останній стиль дуже поширений у книгах.

На особистому рівні я віддаю перевагу дужкам в окремому рядку як:

а) вони вказують на нову область застосування
;


... Другий варіант також полегшує обидві точки (лише з відступом, що відповідає меті комбінації дужок / відступів). :)
weberc2

10

Ах, єдиний справжній стиль дужки .

У ній є все необхідне для Святого шляху - навіть пророк (Річард «мій шлях або шосе» Столман).

Хлопець настільки помилявся з приводу стількох речей, але GNU спотонована, коли мова йде про брекети.


[Оновлення] Я побачив світло, і тепер поклоняюся Алману


9
Я не бачу сенсу стилю GNU, окрім того, що він моделює lisp-код. Здається, багато роботи за малу користь.
Роберт Харві

Я не знаю нікого, хто використовує стиль GNU. 1TBS весь шлях.
Черга Jé

Ви не можете зробити гірше двох рівнів відступу в блоці, за винятком стилю lisp, звичайно, це само собою зрозуміло.
ergosys

4
+1 для посилання на стилі брекетів. Це показує, що незалежно від вашого стилю, багато чудових людей не згодні з вами.
Флоріан Ф

@RobertHarvey Немає зайвої роботи, якщо вона є, ви не використовуєте правильний інструмент для написання коду або конфігурації барвника правильно. Перевага набагато більш читабельного коду, ви бачите кожну помилку в дужці дуже швидко, і ви можете легко читати лише код з ігнорувати субблоки.
12431234123412341234123

9

Другий приклад, я дуже великий у читанні. Я не витримую дивлення на те, чи блокується інший спосіб = (


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

5
@ weberc2, чи можете ви надати DOI для цих наукових робіт?
Гжегож Адам Ковальський

9

Проста відповідь: що простіше налагодити?

// Case 1:
void dummyFunction() {
  for (i = 0; i != 10; ++i) {
    if (i <= 10)
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there";
  }
} // COMPILER ERROR HERE


// Case 2:
void dummyFunction()
{
  for (i = 0; i != 10; ++i)

    if (i <= 10)
    {
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there\n";
  }
} // COMPILER ERROR HERE

У якому випадку ви поставили діагноз спочатку?

Мене мало хвилюють особисті вподобання (є багато інших стилів, включаючи білого і ін.), І мені мало все одно ... до тих пір, поки це не заважає моїй здатності читати код і налагоджувати його.

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


1
Вони обидва так само просто налагоджують, головним чином, оскільки це короткий блок коду. Відступ послідовно полегшує візуалізацію фактичних блоків коду.
Htbaa

@Htbaa: дійсно :) То чому б це турбувати?
Матьє М.

@MatthieuM. Перший блок має для мене більше сенсу, тому що нові рядки (у другому блоці) між підписом функції, твердженням for і твердженням if вважають, що вони не пов'язані, але явно вони не є. Пусті рядки - це відокремлення неспоріднених бітів коду; код, близький до інших рядків коду, означає, що вони насправді пов'язані. Це, звичайно, все "іммо", але я задумався, у чому полягає ваша думка. РЕДАКТУВАННЯ: також будь-яка належна IDE помітить відсутні дужки та видасть помилки при інтерпретації коду.
klaar

7

Не те, що хтось помітить, але саме тому брекети належать до тієї ж лінії , що і умовні (за винятком дуже довгих умов, але це крайній випадок):

У C це допустима конструкція:

поки (правда);
{
    char c;
    getchar (); // Зачекайте на введення
}

Швидкий! Що робить цей код? Якщо ви відповіли "нескінченна петля з проханням про введення", ви помиляєтесь! Він навіть не потрапляє на вхід. Це потрапляє while(true). Зауважте цю крапку з комою в кінці. Ця закономірність насправді частіше зустрічається, що здається, що має бути; C вимагає, щоб ви оголосили свої змінні на початку блоку, саме тому було запущено нову.

Рядок коду - це думка. Підтяжки - це частина думки, що містить умовний або цикл. Тому вони належать до однієї лінії.


Це, безумовно, найкращий аргумент для стилю K&R, який я бачив, решта - це смішно з сучасними системами IDE з підтримкою складання коду. Це стосується лише мов стилю C, які підтримують ;блок підтримки . Ось чому я зневажаю систему блокування, яка IMHO застаріла, і мова Go доводить це. Я бачив цю проблему багато разів, хоча не за цим сценарієм. Зазвичай буває там, де вони мають намір щось додати до заяви і забути.
Джеремі

5

Мені подобається перший метод. Здається, акуратніше ІМО, і це компактніше, що мені подобається.

EDIT: Ах, третя. Мені подобається той найкращий, коли це можливо, оскільки він ще менший / охайніший.


5

Ви можете це написати:

you.hasAnswer() ? you.postAnswer() : you.doSomething();

Відповісти на запитання; Раніше я віддав перевагу фігурним брекетам в їх власній лінії, але, щоб не думати про помилки в автоматичній вставці крапки з комою в браузери, я почав використовувати єгипетський стиль для JavaScript. І при кодуванні Java в затемнення я не мав інтересу в боротьбі (або налаштування) стилю брекетів за замовчуванням, тому я і в цьому випадку пішов з єгипетським. Зараз я добре з обома.


використовуватись таким чином postAnswer()і doSomething()повинен повертати значення для потрійного оператора, що часто не буває: вони можуть дуже добре повернути недійсні (немає значення). а також (принаймні в c #) результат ?:має бути віднесений до деякої змінної
ASh

4

Майже всі відповіді тут говорять про певну зміну на тему "Що б ти не робив, дотримуйся одного чи двох".

Тож я на мить подумав про це і повинен був визнати, що просто не вважаю це таким важливим. Хтось може чесно сказати мені, що важко слідувати наступному?

int foo(int a, Bar b) {
    int c = 0;
    while(a != c)
    {
        if(b.value[a] == c) {
            c = CONST_A;
        }
        c++;
    }
    return c;
}

Я не впевнений ні в кого іншого ... але у мене абсолютно нульові проблеми, ментально перемикаючись між стилями. Мені знадобилося кілька моментів, щоб зрозуміти, що зробив код, але це результат, коли я просто випадковим чином набрав C-подібний синтаксис. :)

На мою не дуже скромну думку, відкриття брекетів майже не має значення для читабельності коду. Вище перелічено декілька кутових випадків, коли один чи інший стиль має значення, але здебільшого розумне використання порожніх рядків очищує це.

FWIW, наші стилі кодування на роботі використовують дещо більш структуровану форму 1 та модифіковану форму 3. (C ++)

            // blank line is required here
if (x) {
            //This blank line is required
   y = z;
}
            // blank line is required here too, unless this line is only another '}'

if (x) y = z; //allowed

if (x)
    y = z;  // forbidden

Мені цікаво, якщо ті, хто сильно вважає за краще формуляр 2, знайдуть цю версію форми 1 краще, просто тому, що порожня лінія дає сильнішу зорову відокремленість.


4
Як показує ваш приклад, відступ настільки важливий, як дужки для читаного коду. Насправді, деякі мови роблять відступ єдиним способом вкладати заяви!

1
Гаразд, я чесно вважаю вас непослідовним прикладом, який важко читати. НЕ ДУЖЕ важко, але важче, ніж якби це було послідовно.
Алмо

Я згоден з Альмо. Це не випадок "чи справді важко". Це справа "напевно важче", навіть якщо не важко. То чому б робити справи складнішими? У "іграшкових" прикладах люди, звичайно, мають невелику різницю. З мого досвіду, коли я успадковую неприємний код від когось іншого, і вони використовували метод 1, досить часто виникає необхідність продовжувати і перетворювати його на метод 2 лише для того, щоб мати можливість слідувати логіці. Через те, що це стає часто необхідним; він автоматично відповідає на питання, який метод краще і легше зрозуміти.
Данк

@Dunk: Я не можу зрозуміти код, який би помітно покращився, міняючи такі невідповідні деталі навколо.
jkerian

@ jkerian-Мабуть, ви не успадкували багато коду від інших, хто давно покинув проект або компанію. Я не можу зрозуміти, що не зіткнувся з такою ситуацією хтось із багаторічним досвідом. Але знову ж таки, ситуація у всіх людей різна. Крім того, якщо вам доведеться робити "офіційні" огляди коду, форматування має велике значення. Вміти читати код природно дуже важливо. Звичайно, я можу зробити паузу і подумати, щоб зіставити дужки, але це уповільнює процес. Один спосіб не вимагає пауз, а інші. Тому я не бачу, чому можна рекомендувати будь-який інший вибір.
Данк

4

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

Коли дужки починаються і закінчуються в одному стовпчику та на їхньому власному рядку, ви можете вибрати з поля або курсором на стовпці 0. Це, як правило, більше щедра область з вибором миші або менша кількість натискань клавіш із вибором клавіатури.

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


Старі таймери, як я, використовують три натискання клавіш для вибору блоку незалежно від місця проклятих дужок.
ergosys

2

Мені особисто подобається другий спосіб.

Однак спосіб, який я продемонструю, на мій погляд, найкращий, оскільки це призводить до найбільшої безпеки роботи! Студентка з мого університету попросила мене допомогти з його домашнім завданням, і ось як виглядав його код. Вся програма виглядала як один єдиний блок. Цікавим є те, що 95% помилок у програмі, яку він робив, виходили з невідповідних брекетів. Інші 5% були очевидні, коли брекети були зіставлені.

while(1){
i=0;
printf("Enter coded text:\n");
while((s=getchar())!='\n'){
         if(i%1==0){
            start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!");
exit(1);}
input=start;}
      input[i++]=s;}
start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!!!");
exit(1);}
input=start;
input[i]='\0';
                puts(input);

8
Поганий, поганий, я маю на увазі жахливий, жахливий приклад. Проблема не в брекетах! Це шалений відступ!
Р. Мартіньо Фернандес

@Martinho Fernandes Я думав, що розміщення дужок та відступів піде разом ...
AndrejaKo

2
не обов’язково ... зробіть належне відступ на вищезазначене, а потім випадковим чином перемкніть брекет-стилі, ви побачите, що це зрозуміло.
jkerian

Насправді, думка про це мотивувала мою власну відповідь на це питання.
jkerian

"95% помилок у програмі, які він робив, надходили з невідповідних дужок" - лише в інтерпретованих мовах, не компільованих.
Mawg

2

Мої особисті переваги - це перший метод, мабуть тому, що саме так я вперше вивчив PHP.

Для однорядкових ifвисловлювань я буду використовувати

if (you.hasAnswer()) you.postAnswer();

Якщо це не you.postAnswer();щось, а щось набагато довше, наприклад, you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);я, мабуть, повернуся до першого типу:

if (you.hasAnswer) {
    you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
}

Я ніколи не буду використовувати переривання рядків, і я ніколи не буду використовувати цей метод, якщо також є elseзаява.

if (you.hasAnswer()) you.postAnswer();
else you.doSomething()

це теоретична можливість, але не та, яку я коли-небудь використовував би. Це потрібно було б перетворити

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

2

Вони не повинні; Перший метод для мене.

Коли я дивлюся на другий, через невикористані рядки (ті, що мають лише дужки на ньому, окрім останньої дужки закриття), я відчуваю, що він порушує безперервність коду. Я не можу прочитати його так швидко, тому що мені потрібно звернути особливу увагу на порожні рядки, які зазвичай означають розділення в цілях коду чи щось подібне, але ні в якому разі "цей рядок належить фігурній дужці" (що лише повторює значення відступу).

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

Плюс, як уже було сказано, це дозволяє помістити більше коду на екрані, що в іншому випадку є трохи контрпродуктивним.


2

Це залежить від платформи / мови / умов

На Java:

void someMethod() { 
     if (you.hasAnswer()) {
         you.postAnswer();
     } else {
       you.doSomething();
     }
}

В C #

void someMethod() 
{ 
     if (you.hasAnswer()) 
     {
         you.postAnswer();
     } 
     else 
     {
       you.doSomething();
     }
}

В:

void someMethod() 
{ 
     if (you_hasAnswer()) {
         you.postAnswer();
     } else {
       you_doSomething();
     }
}

Я ненавиджу, коли хлопці Java використовують свій стиль у коді C # і навпаки.


3
Стиль C завжди мене дратував. Будьте послідовними!
Крістіан Манн

1

Все, що я можу сказати, - це те, що якщо ви любитель методу №3, вас переслідують усі формати-коди IDE на землі.


1

Я використовую перший метод просто тому, що він більш компактний і дозволяє більше коду на екрані. Я сам ніколи не мав проблем зі спарюванням дужок (я завжди виписую їх разом із ifзаявою перед тим, як додати умову, і більшість середовищ дозволяють переходити до відповідних дужок).

Якщо ж потрібно парі дужок візуально, то я волів би другий метод. Однак це дозволяє одночасно менше коду, що вимагає прокрутки більше. І це, принаймні, для мене має більший вплив на код читання, ніж чітко вирівняні дужки. Я ненавиджу прокрутки. Потім, якщо вам потрібно прокрутити один ifвислів, він, швидше за все, занадто великий і потребує рефакторингу.

Але; найголовніше з усіх - послідовність. Використовуйте те чи інше - ніколи обом!


0

Коли я вперше навчався програмуванню в 12, я поставив дужки на наступному рядку, оскільки навчальні посібники з кодування Microsoft подібні. Я також розрізав 4-пробільні таблички TABS.

Через кілька років я дізнався Java та JavaScript, і побачив більше підтяжних кодів на одному рядку, тому я змінився. Я також почав відступати з 2-пробільних просторів.


5
+1, -1. Чому б ви НЕ відступили вкладками, оскільки будь-який редактор може регулювати довжину вкладки до своєї довільної довжини? В іншому випадку ви приводите багато нас, хто любить справжні відступи в 8, щоб проклинати ваш код.
Черга Jé

0

Існує 4-й варіант, який підтримує вирівнювання брекетів, але не витрачає місця:

if (you.hasAnswer())
{    you.postAnswer();
     i.readAnswer();
}
else
{   you.doSomething();
}

Єдина проблема полягає в тому, що більшість автоформаторів IDE задихаються від цього.


9
... як і більшість програмістів, які задушилися б від цього.
Черга Jé

4
Це здається жахливим. Подумайте над додатковими зусиллями, які вам доведеться пройти, якщо ви хочете вставити рядок у верхній частині або видалити верхню лінію. Ви не можете просто видалити рядок і рухатися далі, ви повинні пам’ятати, щоб знову вставити фігурну дужку.
Брайан Оуклі

хай це дивовижно! :) краще, ніж перший стиль!
nawfal

Мабуть, це навіть має назву. Horstman Syyle згадується в вікіпедії . Я працював з такою кодовою базою, це справді непогано використовувати.
AShelly

-1

Все залежить від вас, доки ви не працюєте над проектом, де менеджер проекту встановив деякі обмеження кодування або якісь стандарти, яких повинні дотримуватися всі програмісти, які працюють над цим проектом під час кодування.

Я особисто віддав перевагу 1-му методу.

Також я не отримав те, що ти хочеш показати третім методом?

Це не так? Наприклад, розгляньте ситуацію як ..

if (you.hasAnswer())
  you.postAnswer();
else
  you.doSomething();

А що робити, якщо хтось хоче додати ще кілька тверджень у блок if ?

У тому випадку, якщо ви використовуєте 3-й метод, компілятор видасть синтаксичну помилку.

if (you.hasAnswer())
   you.postAnswer1();
   you.postAnswer2();
else
   you.doSomething();

2
Ще гірше було б, якби хтось прийшов і зробив: якщо (you.hasAnswer ()) you.postAnswer (); ще ти.doSomething (); you.doSomethingElse (); - це рецепт тонких помилок, що око може легко ковзати, і компілятор не допоможе
FinnNk

@FinnNk: Саме так!
Chankey Pathak

2
Якщо хтось хоче додати ще одне твердження, він може поставити самі дужки. Будь-який програміст, вартий своєї солі, дійсно повинен вміти це зрозуміти.
Роберт Харві

Я хотів сказати, що його 3-й метод неправильний.
Chankey Pathak

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