Как вы используете пустые строки в вашем коде?


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несколько раз выполнить работу (войны форматирования не Это не приведет к повышению производительности, поэтому я бы не стал полностью удалять комментарии и пробелы, но я предпочел бы против них по большей части).
Инамати

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

5

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


4
Я тоже часто пишу аппаратные средства, затем печатаю их. Это намного дешевле.
Тим Пост

5
Dos Equis шутка?
Paperjam

@Tim На самом деле, это не так смешно: 3D-печать ;) (И ... будьте добры, мы здесь не все носители английского языка :).
takeshin

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глобальные переменные, через которые методы обмениваются данными? Ик!
TMN

2

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

Брекеты, которые я использую, чтобы сказать, что они могут быть функциями.

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

    code()
    code()
}

2

Одно время я свободно разбрасывал пустые строки по всему коду. В настоящее время я склонен быть более щадящим. Я думаю , что это часть того , что Стив Yegge говорил здесь :

Надеюсь, сцена, которую я нарисовал до сих пор, поможет вам понять, почему иногда вы смотрите на код и просто сразу его ненавидите. Если вы 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 ++ Coding Standard рекомендует НЕ объявлять объект без его инициализации, что исключает такое использование: /
Matthieu M.

@Matthieu M: ОК, затем замените ДЕКЛАРАЦИИ на ИНИЦИАЛИЗАТОРЫ. Но я никогда не хочу видеть ИНИЦИАЛИЗАТОРОВ в середине блока. Если это необходимо, то для этого требуется меньшая область действия, поэтому ему нужен закрытый метод / функция.
Хайлем

0

Пустое пространство чрезвычайно ценно.

Вот в чем дело ... ботаники, которые пишут сложный код вроде E = MC 2 , отлично демонстрируют свои навыки программирования.

Теперь давайте прыгнем вперед на шесть месяцев, и сейчас 2 часа ночи, и система, на которую не смотрели шесть месяцев, сломалась на самой линии E = MC 2 . Это почти невозможно отладить ... все волнуются.

Предположим, что код был похож на это ...

See Dick
See Jane
See Dick and Jan

Если это 2:00 утра и код не работает. Быстрый взгляд покажет, что третья строка должна была быть

See Dick and Jane

Проблема решена.

Итог ... используйте пробел.


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

@ Джейсон - Хороший вопрос плохой выбор слов. 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;
}

(Не заставляй меня начинать ставить скобку '{' в той же строке, что и 'for' ... это мешугха).


2
ДА. Я хочу видеть всю вашу функцию на одном экране. Не ставьте открывающую фигурную скобку на ее собственной линии. Вот для чего отступ.
KevBurnsJr

Весь смысл фигурной скобки в отдельной строке заключается в четком определении блоков кода. Добавление строки кода после скобки разрушает единственную причину, по которой эта религия держится! Вы также можете поместить его в ту же строку, что и «для».
Гэри Уиллоуби

0

Да. Для удобства чтения. Иногда я даже вставляю пустые строки в код, который не написал. Мне легче понять код, когда они имеют логическую группировку через пустые строки - как вы можете «быстро читать» через него.


0

Мы должны использовать пустые строки между кодовыми блоками, как мы делаем, когда пишем письмо.

Например, между функциями или внутри функции, когда мы заканчиваем цикл ...

Люди будут благодарить вас за чистый код, если им нужно будет поддерживать его;)


0

Мы используем пробелы, рекомендованные Microsoft StyleCop. Помимо читабельности и согласованности, я обнаружил, что (вместе с небольшими размерами классов) правильно выстроенный код значительно облегчает управление слияниями, когда разные люди в команде работают над одними и теми же областями.

Я не уверен, что это только мое воображение, но инструменты сравнения лучше распознают, где начинается и заканчивается эквивалентный код при объединении, когда он аккуратно разложен. Хорошо выложенный код - радость слияния. Хорошо, это была ложь - но, по крайней мере, боль держится на приемлемом уровне.


0

Никогда не пустая строка, не во всем файле. Это не значит, что в коде нет разрывов:

 code;
 //
 morecode;

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.