Чи погана практика використовувати if-оператор без фігурних дужок? [зачинено]


130

Я бачив такий код:

if(statement)
    do this;
else
    do this;

Однак я вважаю, що це читабельніше:

if(statement){
    do this;
}else{
    do this;
}

Оскільки обидва методи спрацьовують, чи це просто питання переваги, яке слід використовувати чи який спосіб було б рекомендовано іншим?



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

Відповіді:


212

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

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

EDIT: Нед вказує на це у коментарях, але тут варто посилатися і на мене. Це не лише деякі гіпотетичні фігни із слонової кістки: https://www.imperialviolet.org/2014/02/22/applebug.html


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

12
Або ви можете використовувати мову, яка не використовує дужки для блоків коду ...
Tor Valamo

10
@ lins314159 - Ні, я маю на увазі як пітон. Тому що я шовіністичний у цьому плані.
Tor Valamo

17
Подальші помилки докази можуть (і не статися): imperialviolet.org/2014/02/22/applebug.html
Ned

8
Стверджувати, що помилка SSL є аргументом на користь брекетів, неоднозначно. Це не так, якби розробник мав намір написати, if (…) { goto L; goto L; }але забув брекети. Цілком збігається, що `` if (...) {goto L; goto L; } `трапляється не помилка безпеки, оскільки це все-таки помилка (просто не така, яка має наслідки для безпеки). На іншому прикладі все може йти у зворотному напрямку, і безчесний код може бути випадково безпечним. На третьому прикладі безроздільний код спочатку буде відсутній помилками, і розробник вводить помилку друку, додаючи дужки.
Паскаль Куок

112

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

if(one)
    if(two)
        foo();
    else
        bar();

Від цього:

if(one)
    if(two)
        foo();
else
    bar();

8
Це набагато серйозніша проблема, ніж зазначена у верхній відповіді (додавання другого твердження).

3
Дійсно, ця відповідь насправді змусила мене від цинічного читання цих відповідей бути м'яко заклопотаними, я, можливо, фактично зробив цю помилку.
omikes

2
Якщо хтось цікавився, як я, яким способом C насправді інтерпретує це, тест, який я робив з GCC, інтерпретує цей код в першу чергу. tpcg.io/NIYeqx
хорта

2
"неоднозначність" - неправильний термін. Немає двозначності в тому, як аналізатор побачить це: elseприв'язується жадібно до найближчого, найпотаємнішого if. Проблема виникає там, коли C або подібні мови кодуються людьми, які цього не знають, не думають про це або ще не мали достатньої кількості кави - тому вони пишуть код, який, на їхню думку, зробить одне, але Spec мови каже, що аналізатор повинен зробити щось інше, що може бути дуже різним. І так, це ще один твердий аргумент на користь того, щоб завжди включати дужки, навіть якщо граматика вважає їх теоретично «непотрібними».
підкреслюй_d

35

Моя загальна схема полягає в тому, що якщо вона відповідає одному рядку, я зроблю:

if(true) do_something();

Якщо є інше застереження, або якщо код, на якому я хочу виконати, trueмає значну довжину, дужкою весь шлях:

if(true) {
    do_something_and_pass_arguments_to_it(argument1, argument2, argument3);
}

if(false) {
    do_something();
} else {
    do_something_else();
}

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


4
Хоча, як це легко написати if(true){ do_something(); }, навіщо ризикувати, коли інший програміст введе серйозну помилку в дорозі (пошукайте загальну програму відключення коду ssl від Apple, "goto fail").
Крейг

9
Жодна кількість дужок не звільнить обслуговуючого персоналу від використання його мозку. Я підтримую ідею "немає дужок, якщо вона вписується в один рядок", тому що, ну, для мене така, якщо це лише версія терміналу, якщо оператору, де не потрібно нічого робити в частині "після:" потрійний. І навіщо хто-небудь вводити дужки в тернар, якщо ?
Michal M

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

10

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

Мені подобається цей:

if (statement)
{
    // comment to denote in words the case
    do this;
    // keep this block simple, if more than 10-15 lines needed, I add a function for it
}
else
{
    do this;
}

5
Це суто суб'єктивне питання стилю, мені особисто не подобається надмірність ліній, що стосуються лише дужок. Але ей.
Мачу

14
Я підтримую цей стиль. Більшість людей читають код зліва направо, і це робить його очі прив’язаними до лівого краю екрану. Це допомагає візуально відокремити і витягнути код у логічні блоки кроків.
mloskot

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

4
Мені завжди легше "сканувати" код, коли дужки знаходяться на окремих рядках. Це стосується всього; класи, методи, if- і while-заяви та ін. Ніколи не сподобалось, що перша дужка на тій же лінії ...
Свиш

2
Пробіл дешевий, особливо коли у вас є IDE-складка, здатна скласти.
Moo

10

"Правило", якого я дотримуюся, таке:

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

if($test)
{
    doSomething();
}

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

Якщо оператор "якщо" тестує, щоб перестати щось робити (управління потоком IE в циклі або функції), використовуйте один рядок.

if($test) continue;
if($test) break;
if($test) return;

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


8

Встановлення брекетів з першого моменту повинно допомогти вам не налагоджувати це:

if (statement)
     do this;
else
     do this;
     do that;

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

2
Тож матиме IDE, який виправить відступ, коли ви натиснете ;:)
Сем Харвелл

6

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

if (someFlag) {
 someVar= 'someVal1';
} else {
 someVar= 'someVal2';
}

Набагато приємніше виглядає так:

someVar= someFlag ? 'someVal1' : 'someVal2';

Але використовуйте потрійний оператор лише в тому випадку, якщо ви абсолютно впевнені, що нічого іншого не потрібно робити в блоках if / else!



2

З мого досвіду, єдина (дуже) незначна перевага першої форми - читабельність коду, друга форма додає "шум".

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

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

Одне з найважливіших правил, яке слід пам’ятати при написанні коду, - послідовність. Кожен рядок коду має бути написаний однаково, незалежно від того, хто його написав. Будьте суворі, не дозволяє помилкам "траплятися";)

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

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


2

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

if(statement)
{
    do this;
}
else
{
    do this;
}

Однак я думаю, що найкраще рішення цієї проблеми - в Python. У блоковій структурі на основі пробілів у вас немає двох різних методів створення оператора if: у вас є лише один:

if statement:
    do this
else:
    do this

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


Я сам думаю, як Python поводиться із заявами if-else дуже некрасиво, але знову ж таки, я не програміст Python (поки що)
helpermethod

1

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

Не працює:

якщо (заява) зробити це; і це; ще роблять це;


1

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

Приклад:

if (argument == null)
    throw new ArgumentNullException("argument");

if (argument < 0)
    return false;

Інакше я використовую другий стиль.


1

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

if( statement ) {

    // let's do this

} else {

    // well that sucks

}

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


0

Я погоджуюсь з більшістю відповідей у ​​тому, що краще бути чітким у своєму коді та використовувати дужки. Особисто я би прийняв набір стандартів кодування і забезпечив би, щоб усі в команді їх знали та відповідали. Де я працюю, ми використовуємо стандарти кодування, опубліковані IDesign.net для проектів .NET.


0

Я вважаю за краще поставити фігурну дужку. Але іноді допомагає потрійний оператор.

Замість :

int x = 0;
if (condition) {
    x = 30;
} else {
    x = 10;
}

Слід просто зробити: int x = condition ? 30 : 20;

Також уявіть собі випадок:

if (condition)
    x = 30;
else if (condition1)
    x = 10;
else if (condition2)
    x = 20;

Було б набагато краще, якби ви вклали фігурну дужку.

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