Як ви використовуєте порожні рядки у своєму коді?


31

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

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

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

Наприклад:

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

Загалом, у мене рідко є більше 4/5 рядків, згрупованих разом, що означає дуже рідкий код.

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

Наприклад:

for (int i = 0; i < 10; ++i)
{
    if (i % 3 == 0) continue;

    array[i] += 2;
}

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

Отже, як ви фактично використовуєте (чи ні) порожні рядки в коді?


6
if (i % 3 != 0) { <newline here> array[i] += 2; <newline here> }, але я бачу вашу думку :)
Мерлін Морган-Грехем

Ці типи питань не є конструктивними . Є лише стільки разів, що ви можете перефразовувати лише дві доступні відповіді "так" і "ні".

1
Краще питання було б, як і чому ви використовуєте порожні рядки? Я використовую порожні рядки точно так само, як і ви, з тією ж мотивацією.
Домінік МакДоннелл

1
@Mark, @takeshin: вибачте, забув "як" у ключовому слові. Очевидно, що ми всі ними користуємось, я намагався побачити, як це використовували люди там (розділяючи класи, якщо / ще і т. Д.), Але, схоже, я отримав дуже загальні відповіді: p
Матьє. М.

3
for (int i = 0; i < 10; i += 3) { <newline here> array[i] += 2; <newline here> }але я бачу вашу думку :)
Берін Лорич

Відповіді:


87

Завжди

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

Наприклад, із кодексу Стіва Макконнелла, другого видання, про тему "Макет і стиль":

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


12
Я чую, як хтось сказав "але тоді ви повинні витягнути метод!". Абзац призначений для того, коли для вилучення методу не достатньо підстав.
Френк Ширар

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

2
Я згоден на 100%. Пробіл корисний, коли він використовується для навмисного розділення коду на логічні фрагменти. Однак пробіл заради пробілу так само поганий, як і пробіл. Один колишній колега любив ставити один або кілька порожніх рядків після майже кожного рядка фактичного коду. Я витратив смішну кількість часу на "рефакторинг", який включав удари по Backspace кілька тисяч разів, щоб видалити марні порожні рядки.
Майк Спрос

Я додав деякі дані, щоб підтвердити вашу позицію. Дивіться: meta.programmers.stackexchange.com/questions/1109/…
Джефф Етвуд

2
Ці дані нічого не говорять про порожні рядки, лише про відступи ..
Blorgbeard


13

Я це роблю, але переконуюсь, що це документую, додаючи

(This line intentionally left blank.)

на лінії


1
Білі лінії з коментарями можуть звернути увагу на код
JulioC

1
Це багато коментарів, які говорять "Цей рядок навмисно залишений порожнім" ... Чи не можна вважати, що якщо рядок порожній, це навмисно, інакше він не пройшов би перегляд коду?
альтернатива

43
Можливо, це лише я, але я припустив, що ОП жартує ...
JSB

7
Як довго ви працюєте в IBM?
Гійом

12

Так, але я не зловживаю цим.

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

//Prot.   Return type                    Name                 Arg1        Arg2
//=====   ============================== ==================== =========== ========

private   int                            AMethodWithALongName(string s,   object o)
{
    ...
}

private   IDictionary<MyLongObject, int> SomethingCrazy      (string s)
{
    ...
}

protected void                           Foo                 (string str, object o)
{
    ...
}

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


1
Виглядає як щось, що було б використано в початковому курсі коледжу, щоб керувати деякими поняттями. Чи реально це було використано в професійному середовищі?
rjzii

1
@Rob: Він використовувався у виробничому коді великої системи, але без заголовка коментарів та мав достатньо великі органи методів, щоб вирівнювання мене спантеличило, оскільки я не міг бачити інших підписів методу у цьому файлі. Коли я згорнув тіла методів, я зміг побачити "причину" для пробілу.
Аллон Гуралнек

Це може працювати в заголовку або файлі інтерфейсу
Ming-Tang

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

@Mike, у середній школі ми використовували книгу програмування Java (не пам'ятаю заголовок), яка мудро радила ніколи не використовувати горизонтальний інтервал, як це, просто тому, що це закінчує витрачати велику кількість часу, коли ви повинні робити такі перерахунки.
Метью Флашен

5

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

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


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

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

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

5

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


4
Я часто теж пишу апаратне забезпечення, а потім друкую його. Це набагато дешевше.
Тім Пост

5
Чи жартує Екіс?
Paperjam

@Tim Насправді це не так смішно: 3D-друк ;) (І… добре, ми тут не всі носії англійської мови :).
приймає

1
@takeshin Я нікому не забавлявся, і натякав на 3D-друк. Хоча так, коментар мався на увазі жартома, я думаю, що ви можете неправильно трактувати наміри :) Також факт, що @Paperjam прокоментував прямо під жарт про друк - це ... ну .. безцінне :)
Tim Post

Я не пишу програмне забезпечення, але провідний.
mlvljr

5

Я все для того, щоб зробити код максимально зрозумілим, і пробіл часто є корисним інструментом для цього. Але не будемо забувати рефакторинг:

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

Оскільки у вас є кілька пов’язаних членів, вони є кандидатом у новий клас.

  • якщо мені потрібно написати коментар, я зазвичай ставлю порожній рядок перед коментарем

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

  • в методі я роблю один абзац за крок процесу

Чому б не зробити один метод для кожного "абзацу"?

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


5

Так. Це полегшує візуальне сканування файлу. Крім усього іншого, стає зрозумілішим, до якого рядка йде коментар.

Some code here
// Which line does this comment go with?
More code here

// It's pretty clear which line this comment goes with
More code here

Still more code here

4

Я використовую порожні рядки скупо і послідовно, і послідовно важливіше, ніж щадно. Однак:

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

Більшість із них не є страшно суперечливими; що може бути далі. Зауважу, що позначення K&R з відкритими дужками в кінці рядка гнітюче часто супроводжується порожнім рядком. Мені особисто не подобаються дужки в кінці рядка і змішування цього з порожнім рядком після дужки робить дурниці позначень (IMNSHO). Розмістіть відкриту дужку на наступному рядку самостійно, і у вас здебільшого порожній рядок (і, IMNSHO, більш читабельний код). Якщо вам потрібно скористатися дужкою K&R в кінці рядка, не витрачайте на вертикальне простір економію сторонніми порожніми лініями.

// I don't like this
if (something == anotherthing) {
    print ...
    update ...
}

// I much prefer this
if (something == anotherthing)
{
    print ...
    update ...
}

// I loathe this - not least for its inconsistent spacing
if (something == anotherthing) {

    print ...
    update ...
}

// I loathe this too, for its absurd waste of vertical space
if (something == anotherthing) {

    print ...
    update ...

}

3

Напишіть те, що є найбільш розбірливим і найменш дивним.

function validEmail($addr) {
    $regex = "/.../";   
    return preg_match($regex, $addr);
}

Для цієї функції не потрібно 12 рядків коментарів док.

Насправді це не потребує жодних коментарів.

Або порожні рядки.

Вони б зашкодили її суті.


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

3

Всередині функції? Рідко

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

Для мене пусті рядки всередині функції - одна з найбільш неправильних «найкращих практик».


2

Часто

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

Хороший пробіл

{
    int x = computeX();
    x += ADJUSTMENT_FACTOR_X;

    int y = computeY();
    y += ADJUSTMENT_FACTORY_Y;

    setPosition(x, y);
}

Поганий пробіл

{
    //Open a connection
    String serverAddress = lookupAddress();
    Connection connection = openConnection(serverAddress);
    connection.login(user, password);


    //Go get stuff from the server
    item1 = connection.get(1);
    item2 = connection.get(2);

    //Close connection
    connection.close();

    //log data
    log(item1);
    log(item2);

    //Update client
    gui.updateView(item1, item2);        
}    

проти

{
    Connection connection = openConnection();
    updateData(connection);
    closeConnection(connection);
    logUpdate();
    updateGui();
}

проти

{
     updateDataFromServer();
     logUpdate();
     updateGui();
}

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

1
я не бачу, чому погано погано, ні чому ви написали VS

5
Жоден з цих зауважень не потрібні , так чи інакше, і чому в світі б один екстракт connection.close()дляcloseConnection(connection)
альтернатива

Блок коду з коментарем краще, ніж вилучений метод, якщо блоки короткі і нечисленні. Методи вилучення не є безкоштовними; вона має вартість локального коду.
Крейг Гідні

А ти просто робиш item1і item2глобальні змінні, через які спілкуються методи? Ick!
TMN

2

Я не тільки використовую пробіли, я використовую брекети для ясності.

Дужки, які я використовую, щоб сказати, це потенційно можуть бути функціями.

code
{
    code
    code
    code
    code
}
{
    code
    code=code
    code
    code

    code()
    code()
}

2

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

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

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

...

Програміст з високою толерантністю до стиснення насправді перешкоджає екранізації розповідей. Чому? Тому що для розуміння кодової бази потрібно вміти запакувати якомога більше її в голову. Якщо це складний алгоритм, ветеран-програміст хоче бачити всю річ на екрані, що означає зменшення кількості порожніх рядків та вбудованих коментарів - особливо коментарів, які просто повторюють, що робить код. Це абсолютно протилежне тому, що хоче програміст n00b. n00bs хочуть зосередити увагу на одному висловлюванні чи виразі одночасно, переміщуючи весь код навколо нього з поля зору, щоб вони могли сконцентруватися і плакати вголос.

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


2

Професор Емерітус дав дві великі поради

  1. Пробіл безкоштовний
  2. Не використовуйте скоби, які висуваються назад передньою стороною паперу, інакше я вас зірву.

1

Мої правила:

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

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

  3. Визначення методу: додайте рядок

  4. Визначення модуля / класу: додайте два рядки


1

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

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

В імперативному коді я групую завдання, які виконують одне згуртоване завдання; у декларативному коді я групую код, який описує одне злагоджене висловлення ідеї.

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


1

Порожні рядки - це, на мою думку, обов'язково. Я використовую їх для розділення різних логічних блоків коду. Робить код читабельним. Читаний код - хороший код;)

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

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


1

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

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

як правило, в peusdo-коді:

def function(arg1, argn, ...)
    INITIALIZERS

    CODE
    BLOCK_START
        INITIALIZERS

        CODE
    BLOCK_END
    CODE
end

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


Це виглядає як C-ish, мій стандарт кодування C ++ рекомендує НЕ оголошувати об’єкт без ініціалізації, що виключає це використання: /
Matthieu M.

@Matthieu M: Гаразд, тоді замініть ДЕКЛАРАЦІЇ ІНІЦІАЛІЗАТОРАМИ. Але я ніколи не хочу бачити INITIALIZERS посеред блоку. Якщо це потрібно, то це те, що вимагає меншої області застосування, тому йому потрібен приватний метод / функція.
хайлем

0

Білий простір надзвичайно цінний.

Ось угода ... ботаніки, які пишуть складний код на зразок E = MC 2 , чудово демонструють свої навички програмування.

Тепер давайте стрибаємо на півроку, і це 2:00 ранку, і система, яку не дивилися протягом шести місяців, зламалася на самій лінії E = MC 2 . Налагодити це майже неможливо ... всі вигадують.

Припустимо, код виглядав приблизно так ...

See Dick
See Jane
See Dick and Jan

Якщо це 2:00 ранку, і код порушено. Швидкий погляд покаже вам, що третя лінія мала бути

See Dick and Jane

Проблема вирішена.

Підсумок ... використовуйте пробіл.


1
Ем ... жоден із цих прикладів насправді не підтримує вашу думку. Особисто я вважаю, що E = MC2 читабельніше, ніж E = MC 2 (підсумок полягав у використанні пробілів, правда?). О, і якщо ви ще не в середній школі, я впевнений, що ви можете придумати кращий спосіб посилатися на людей, з якими ви не згодні, ніж на "дурнів".
Джейсон Бейкер

@Jason - Гарний момент поганий вибір слів. E = MC2 набагато легше читати, це було не те, що я намагався перейти. Це більше схоже на те, що ви говорили на своєму веб-сайті YAGNI та SYNDI. jasonmbaker.com/tag/programming
Майкл Райлі - AKA Gunny

0

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


0

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


0

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


0

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

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

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


0

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

for (int i; i < 10; ++i)
{  if (i % 3 == 0) continue;

   array[i] += 2;
}

(Не запускайте мене починати ставити дужку "{" на тій же лінії, що і "за" ... це мешугга).


2
ТАК. Я хочу бачити всю вашу функцію на одному екрані. Не ставте вступну фігурну дужку на власну лінію. Ось для чого відступ.
KevBurnsJr

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

0

Так. Для читабельності. Іноді я навіть кладу порожні рядки в код, який я не писав. Мені легше зрозуміти код, коли у них є логічне групування через порожні рядки - наприклад, ти можеш "швидко читати" через нього.


0

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

Наприклад, між функціями або всередині функції, коли ми закінчуємо цикл ...

Люди будуть вдячні вам за чистий код, якщо їм доведеться його обслуговувати;)


0

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

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


0

Ніколи пустий рядок не у всьому файлі. Це не означає, що в коді немає перерв:

 code;
 //
 morecode;

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

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