Єдине твердження, якщо блок - дужки чи ні? [зачинено]


59

Що краще / загальніше прийнято?

Це:

if(condition)
{
  statement;
}

Або:

if(condition)
  statement;

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


2
Але ви відкриваєте дужку в неправильному положенні. Стільки певного.
Крістіан Манн

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

2
Оскільки ви не вказали мову ... А що statement if condition;?
Дейв Шерохман

@Christian - хороший. Це було б інше питання, окреме від цього, ні?
Zannjaminderson

@Ingo - хороший момент.
Zannjaminderson

Відповіді:


131

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

if(condition) 
//      statement;
otherStatement;

Або додавання коду поспіхом:

if(condition) 
    statement;
    otherStatement;

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

if(condition) statement;

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


35
Хороший момент про те, щоб все розмістити в одну лінію
Ніл Ейткен

7
@artjomka: Якщо заява довга і має проходити по своїй лінії, тоді я використовую дужки для читабельності. Справа в тому, що ви хочете найкоротший, найменш синтаксично галасливий конструкт, який є однозначним для людини, яка читає її швидко, а не перевіряє її.
dimimcha

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

10
Пробіл @TMN безкоштовний, монітори великі, а ваш мозок вчиться розпізнавати форму, яка допомагає вам розбирати код.
Мерф

5
@Murph: пробіли безкоштовні? Я, мабуть, пропустив це. На моєму екрані він займає дійсно багато місця. Набагато більше 50% фактично. Що в моїй книзі здається великим марнотратством. Особисто я люблю максимізувати вміст на квадратний сантиметр у коді.
Конрад Рудольф

44

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

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


20
Чи справді люди бачили, як це відбувається? Я не думаю, що я ніколи цього не бачив за 10 років програмування. Можливо, я просто надто прихистився. :)
Девід

9
Я б хотів сказати "ні", але, на жаль, я це бачив.
Ніл Ейткен

13
Ви завжди використовуєте дужки, щоб ніколи не забувати використовувати дужки - це так просто.
Мерф

12
+1 до @Murph. З тієї ж причини я використовую свої поворотники, коли нікого немає - і на парковках!
Dan Ray

7
Ця хороша практика допомагає запобігти помилкам під час злиття від гілки до магістралі або через гілки.
JBRWilkinson

27

Я вважаю за краще версію без дужок, де це можливо.

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

(Поблизу) порожні рядки - це марно

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

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

Однак, я вважаю, що витрачаю вертикальний простір. Сучасні монітори фактично мають достатньо горизонтального простору. Але вертикальний простір все ще дуже і дуже обмежений (якщо ви не використовуєте монітор, повернутий вертикально, що не так вже й рідко). Цей обмежений вертикальний простір є проблемою: загальновизнано, що окремі методи повинні бути якомога короткішими, а відповідні дужки (або інші роздільники блоків) повинні бути не більше висоти екрана в різниці, щоб ви могли бачити весь блок без прокручування.

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

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

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

Пропуск брекетів може не нашкодити

Є лише один аргумент проти пропускання дужок: хтось згодом додасть ще одне твердження до відповідного блоку і забуде додати дужки, тим самим ненароком змінивши семантику коду.

Це дійсно було б великою справою.

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

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

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

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


1 Ця проблема іноді вирішується, якщо все - включаючи брекети - розміщувати на одній лінії:

if (condition)
{ do_something(); }

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


6
Пропускання брекетів шкодить читабельності та може легко викликати проблеми при зміні коду.
Джош К

15
@Josh: перша претензія є смішною, як показують такі мови, як Python (підкріпіть її доказами, якщо ви думаєте інакше). Друга відповіла моїй відповіді. Чи є у вас докази, що підтверджують це? Інакше ваш коментар - це ознака того, що ви насправді не прочитали мого тексту. Будь ласка, зробіть це перед тим, як критикувати це.
Конрад Рудольф

8
+1 за ваші думки, але я вважаю, що ваша позиція є самозакоханою. Ви говорите: "покажіть мені важкі дані, зібрані з наукових експериментів, показавши, що це справді є проблемою на практиці", і все ж таки відмовляєтеся від анекдотичного досвіду (власного), щоб відстоювати свою позицію. Ви кажете: "в моєму досвіді ... в моєму десятилітньому досвіді ... я вважаю це неправдоподібним ..." тощо. Чи можете ви показати жорсткі дані, зібрані з наукових експериментів, що підтверджують ваше твердження: "Пропуск брекетів не шкодить"? Особистий досвід прекрасний, коли ви підтримуєте думку, але не вимагайте більше "доказів", ніж ви готові надати.
bedwyr

3
@bedwyr: Однак є якісна різниця. По-перше, я даю зрозуміти, що мене насправді переконують дані, і я так само чітко даю зрозуміти, що моя - це лише гіпотеза, а не підкріплена даними. По-друге, я висловив (принаймні для мене) правдоподібний аргумент для своєї віри в те, що вимога є помилковою та чому її потрібно підтвердити. Що призводить мене до третього: тягар тут є на опозиції доводити свою претензію, а не на тому, щоб я спростував це. І крім проблеми з правдоподібністю, я показав один незв'язаний фактичний аргумент, що підтримує мій стиль кодування.
Конрад Рудольф

4
@Konrad - python не відображається інакше, оскільки відступ є значним, а значить, дужки неявні. Хороші яскраві програмісти, які є тут, напевно, не будуть часто помилятися, якщо взагалі (через багато років я, мабуть, бачив проблему лише кілька разів), але є багато досить менш хороших програмісти, які роблять нерозумні речі, що є однією з причин того, що потрібні в першу чергу стандарти кодування. (І тому, що терміни і стрес можуть зробити найкраще з нас менш хорошим.)
Мерф

19

Я йду з другим. Це більш лаконічно і менш багатослівно.

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


11
абсолютно! зрештою, якщо код було важко записати, його також важко буде підтримувати! ;-)
Стівен А. Лоу

3
@Steven Якщо ви забудете брекети, я думаю, тут є інші проблеми.
TheLQ

більше succint == менш багатослівний
UncleZeiv

5
@SnOrfus: дещо саркастичний, оскільки додаткові 2 символи є тривіальними накладними та запобігають дуже поширеній помилці технічного обслуговування. Ваш пробіг може бути різним ;-)
Стівен А. Лоу

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

16

Я використовую наступне (консенсус тут):

if (condition) {
    any_number_of_statements;
}

Також можливі:

if(condition) single_compact_statement;

Не дуже добре, особливо на мовах, що відповідають C / C ++:

if(condition) 
    single_compact_statement;

(Тут немає вибору в Python ;-)


У Perl ви використовуєте:

$C = $A**3 if $A != $B;

або

$C = $A**3 unless $A == $B;

(Це не псевдокод ;-)


1
Мої думки точно. Якщо одне твердження виглядає добре в одному рядку після ifпункту, я не використовую дужки. Для будь-якого іншого ifоператора (або будь-якого оператора, який використовує кілька рядків), я завжди використовую дужки. Зокрема, якщо є elseпункт, у кожному випадку завжди є дужки.
eswald

9
Я ніколи не бачив, щоб хтось плутав perl з псевдокодом раніше. Випадкові символи так, псевдокод - ні.
Джо D

3
Цікаво, чи хтось зробив генератор програм Perl, просто підключивши / dev / random до перекладача Perl ...
Крістіан Манн

Мені тут подобається рубіновий підхід. Він пропонує Perl стиль однорядковий <statement> if <condition>або багаторядковий блок стиль if <condition>/ <do something>/ end(рубін уникає брекетів, тому тут відкриває дужка мається на увазі ifі кінець дужка замінюються дослівним end). Він навіть не пропонує дивного багаторядкового, але насправді просто-єдиного рядка if.
Бен Лі

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

11

Я використовую метод брекетів - з усіх наведених вище причин плюс ще одна.

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

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


10

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


3
Саме так! Ми не винні, що він / вона не знає синтаксису.
kirk.burleson

3
Поганий приклад. Хороший - машина з неправильно встановленими педалями - газ замість гальма. Це ваша машина, тому ви нікого не хвилюєте. У цьому проблема, що вони не знають про ваше унікальне розташування педалей. Ви в цьому випадку хороший автомобільний інженер?
yegor256

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

8

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

Якщо вам потрібно додати код до ifблоку, вам не потрібно запам’ятовувати / шукати дужки. Коли майбутні програмісти читають код, дужки завжди однозначні.

З іншого боку, ReSharper автоматично додасть дужки для лінивих програмістів у Visual Studio, і я припускаю, що є додатки для інших IDE, які також будуть робити це.


3
Я категорично не купую претензію на читаність. Python є однією з найбільш читаних мов, і це не потребує розмежувачів. Це твердження просто не відповідає дійсності. Я також не купую претензію на ремонтопридатність, оскільки вона поки що недоведена і все ще неодноразово переробляється. Але в цьому випадку мене насправді дуже цікавлять емпіричні докази. Це те, що дуже легко можна було б дізнатись у дослідженні та врегулювати раз і назавжди.
Конрад Рудольф

Оскільки Python використовує відступ замість роздільників, то це неявне порівняння.
Мерф

@Konrad - емпіричні докази: Коли я був новим програмістом, я особисто додав код до блоку un-braced if, не розуміючи, що попередній програміст не переймався дужками. Я особисто бачив, як інші люди роблять це на власні очі. Зрозуміло, я лише раз бачив, що комусь потрібна допомога, щоб знайти проблему після запуску коду, але це стосувалося поганих навичок тестування.
шимок

@shimink: так що ваші спостереження в основному підтримують моє твердження, що ця проблема є несуттєвою? До речі, особисті спостереження є анекдотами, вони не вважаються емпіричними доказами.
Конрад Рудольф

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

7

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

"Не змушуйте мене думати" не стосується лише інтерфейсів користувача, ви ;-)


4
Раніше я це робив, але мене переміг аргумент, що програмісти повинні знати мову, і їх треба змусити думати.
kirk.burleson

2
Я вважаю це загальною ввічливістю ... до мого майбутнього "я".
Стівен А. Лоу

5

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

На це я кажу "не використовуйте макроси". Я також кажу: "правильно вставте проклятий код". З огляду на те, як кожен текстовий редактор / IDE, використовуваний для програмування, робить відступ автоматично, це робити не повинно. Коли пишуть код в Emacs, я б використовував автовідступ для ідентифікації, якщо я написав щось не так у попередньому рядку. Щоразу, коли Emacs починає викручувати відступи, я зазвичай знаю, що я щось зробив не так.

На практиці я закінчую, дотримуючись будь-якої конвенції кодування, яка була поставлена ​​перед мною. Але ці мене дратують (і роблять мене набагато щасливішим, коли я кодую в Python, і вся ця дужка катастрофи минула):

if (condition) {
    statement;
} // stupid extra brace looks ugly

Тоді

if (condition) // the brackets have now just become noise
{ statement; } // also can't see the indentation, harder to read

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


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

4

Я використовую дворядкову версію без дужок (2 клас), але не для економії місця.

Я використовую цю форму, тому що я вважаю її більш зрозумілою, візуально привабливішою та простішою у друку. Я використовую цю форму лише в тому випадку, якщо ці умови виконані; тобто ifумова повинна добре вміщуватися в одному рядку, і відповідне висловлювання повинно добре вміщуватися в наступному рядку. Якщо це не так, я буду використовувати брекети для поліпшення читабельності.

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

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

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

    string GuardConditions(Plan planForWorldDomination)
    {
        if (planForWorldDomination == null)
            throw new ArgumentNullException("planForWorldDomination");

        if (!planForWorldDomination.IsComplete())
            return "Doh!";

        planForWorldDomination.Execute();
    }

    void ProcessingLogic()
    {
        OneBlankLineAbove();

        if (simpleCondition)
            simpleStatement();

        OneBlankLineBelow();
        OneBlankLineAbove();

        // optional comment on the line above an if statement
        if (simpleCondition)
            simpleStatement();

        OneBlankLineBelow();
    }

    void Assignment(string drive)
    {
        OneBlankLineAbove();

        string prompt;
        if (simpleCondition)
            prompt = "simple assignment";
        else
            prompt = null;

        OneBlankLineBelow();
    }

    string Return()
    {
        OneBlankLineAbove();

        if (simpleCondition)
            return "simple return";
        else
            return null;

        OneBlankLineBelow();
    }

3

Брекети. Завжди. Я їх прихильник, бо це надає коду певної послідовності. А також як писав @dsimcha - менше шансів на помилки при додаванні додаткових рядків коду.

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


1
Я ніколи не бачив, щоб хтось робив помилку, про яку ти говориш.
kirk.burleson

1
Я щойно зробив це вчора на комусь іншому фрагменті коду. :-) Мені просто цікаво, як буде виглядати висхідний потік, серед інших доповнень до коду, додаючи дужки на всі його, якщо так, тому що він справді здається з іншого боку, ніж я з цього приводу. :-) (заспокойся, жартую, відредагував саме те, що мені довелося ...)
Vedran Krivokuća

2

Особисто я йду з дужками.

Чому?

Добре, якщо хтось підійде і йому потрібно додати код до оператора if, то на 100% зрозуміло, де область.

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

Однак, якщо стиль проекту не обійдеться, дотримуйтесь цього.


1

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

if (x==5) Console.WriteLine("It's a five!");

Здогадайтесь, хтось не шанувальник стислості.
JohnFx

2
Стислість заради читабельності? Абсолютно ні. Це код, а не змагання з гольфу.
Джош К

3
Я вважаю, що читаність - це чудова причина для стислості, особисто. У будь-якому випадку: простір White-Space не враховується в моєму правилі з кодом про гольф.
JohnFx

Проблема в цьому полягає в тому, що вона піддається зловживанням
Конрад Фрікс

2
Тоді не зловживайте цим. Я не кажу, щоб використовувати його як стандарт кодування. Просто трапляється багато разів, коли у вас дійсно короткий умовний перегляд, а потім дійсно коротке одне твердження, і це працює добре. Наприклад, якщо (assert) log.write ("assert не вдалося");
JohnFx

1

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

If (cond) { statement; }

Цікаво, що я дійсно не бачу такого коду, але мені це подобається.
Томас Едінг

0

Я зазвичай використовую брекети, але бувають випадки, коли я цього не роблю.

object GetObject() {
    // calculate obj1
    if(obj1 != null)
        return obj1;

    // calculate obj2
    if(obj2 != null)
        return obj2;

    // calculate obj3
    if(obj3 != null)
        return obj3;

    return defaultObj;
}

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


Ви можете так само легко використовуватиreturn (obj != null) ? obj : "Error";
Josh K


У такому випадку я б використовував щось подібне Object returnObj = defaultObj; /* Three else-if's to change it to obj1/2/3 */ return returnObj;.
Джош К

@Josh, прочитайте stackoverflow.com/questions/36707 / ... . Перший коментар до першої відповіді: "Хоча наявність декількох точок виходу може вийти з рук, я, безумовно, думаю, що це краще, ніж розміщення всієї функції в блоці IF "
Зауважте, що самостійно - придумайте ім'я

0

Якщо в IDE доступне форматування коду, я не використовую дужки.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.