Как правильно форматировать код?

Когда я пишу код, я пытаюсь сгруппировать строки схожего кода вместе, затем оставляю пустую строку и пишу другой блок.

Я считаю, что это способствует аккуратности и удобочитаемости кода.

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

Один из моих учителей снизил оценку одного из моих заданий, потому что я логически расставил свой код. Он сказал: «Когда тебе приходится читать код весь день в реальном мире, ты не ставишь этот межстрочный интервал и будешь благодарить меня». Конечно, я никогда этого не делал и никогда не буду благодарить его.

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

Это, вероятно, более распространено в языках типов VB, чем в языках типов C, но применяется та же концепция.

На ум приходят два вопроса:

  • Где в коде оставить пустую строку?
  • Насколько велик межстрочный интервал?

person user72491    schedule 12.03.2009    source источник
comment
Он был ослом (ПОЧЕМУ он учит) ?? wtf?   -  person Romain Linsolas    schedule 12.03.2009
comment
Хе-хе. Опечатка, но я оставлю это только потому, что. Вы знаете поговорку: «Те, кто не умеет учить». Яда, яда, яда   -  person user72491    schedule 12.03.2009
comment
... и плохо продуманный ... это на самом деле хороший момент - разделение на логические группы означает, что вы рассматриваете каждую часть кода индивидуально, а не как какой-то гигантский метод   -  person nailitdown    schedule 12.03.2009
comment
Отредактировано: удален совершенно не относящийся к делу комментарий о рассматриваемом учителе. Задавая вопрос, пожалуйста, придерживайтесь фактов.   -  person Carl Seleborg    schedule 12.03.2009
comment
Разве это не должно быть вики сообщества?   -  person David Thornley    schedule 12.03.2009


Ответы (22)


Я следую рекомендациям Microsoft для C #.

Изменить: стандарт для C # - Дон не бороться с IDE. Если вы нажмете CTRL K+D, IDE автоматически вставит пустые строки между разделами кода.

Чтобы понять это, если вы посмотрите пример кода C # на MSDN или в любом другом месте, обычно между каждой логически размещенной группой есть пустая строка. Таким образом, будет пустая строка после всех ваших переменных-членов, пустая строка после каждого метода и т. Д.

В ответ на комментарии, выражающие шок и ужас по поводу того, что я использую IDE для программирования на C #:


НАСТОЯЩИЕ ПРОГРАММАТОРЫ

person George Stocker    schedule 12.03.2009
comment
Кроме того, если вы идете с тем, что видите, вам нужно будет использовать их дурацкие правила отступов HTML ... - person leppie; 12.03.2009
comment
Любая спецификация, которая определяет, где можно, а где нельзя ставить пробелы, для меня большой минус (за исключением разметки документации API, где согласованность является ключевым моментом). Пробелы или их отсутствие не увеличивают и не уменьшают понятность кода. Рекомендации должны касаться понятности кода. - person Skizz; 12.03.2009
comment
@Skizz, FAIL! Конечно, это снижает удобство использования, если у вас меньше читабельности. - person Filip Ekberg; 12.03.2009
comment
Я не думаю, что Ctrl + K + D добавляет интервал между логическими блоками кода в методе, о чем, как мне кажется, и идет речь. - person Peter Lillevold; 12.03.2009
comment
@ Питер Лиллевольд: Автор неясен. Так что я должен интерпретировать. Мой ответ заключается в том, что IDE сообщает нам, где мы должны размещать пустые строки, а где нет, мы не должны. - person George Stocker; 12.03.2009
comment
@Gortok: можно ли писать код без IDE? Вы, кажется, очень на это полагаетесь. - person leppie; 12.03.2009
comment
@Gortok: твоя интерпретация в порядке. Я хотел сказать, что в дополнение к форматированию CtrlKD (которое я использую постоянно), группировка строк кода с однострочными пробелами в телах методов - отличный способ повысить удобочитаемость. Если бы CtrlKD мог это сделать, я бы классифицировал его как A.I. :) - person Peter Lillevold; 12.03.2009
comment
leppie: Если вам дают средство, облегчающее вашу жизнь, всегда ли вы вместо этого выбираете курс самобичевания? - person TheTXI; 12.03.2009
comment
@leppie: Было бы жестоко писать код на C # без него. Если я пишу Perl, мне не нужно использовать IDE. Если я пишу HTML, у меня нет причин использовать IDE, если я использую PHP, у меня нет причин использовать IDE. Я мог бы продолжать, но ответ таков: используйте среду IDE, где язык, по сути, это диктует. - person George Stocker; 12.03.2009
comment
@leppie: Я знаю, что пишу весь свой код в блокноте, потому что я такой же uber1337, как и ты! - person GEOCHET; 12.03.2009
comment
@leppie: Есть смысл кодировать без IDE? Например, если бы вы были на миссии в глубине Сибири и вам нужно было очень быстро написать код ASP.NET, потому что Чарли был у вас на хвосте, и вы использовали свою последнюю IDE, чтобы взорвать цель миссии, я думаю, вы могли бы сделать это в VIM. - person belgariontheking; 12.03.2009
comment
@Peter Lillevold: Единственный раз, когда мне не нравится Ctrl + K + D, я использую его там, где этого не сделали другие программисты, и если вы посмотрите на Diff в Clearcase, это будет выглядеть так, как будто вся страница кода была изменена , когда на самом деле он был просто отформатирован. - person George Stocker; 12.03.2009
comment
Я начинаю верить, что каждый ответ SO развивается до тех пор, пока он не будет включать в себя комикс xkcd. ;-) - person John MacIntyre; 12.03.2009
comment
@Jon MacIntyre: мы говорим об этом в IRC, и теперь я решил включить комикс XKCD в каждое редактирование, которое я могу внести в вопрос или ответ (свой или кого-то еще). - person George Stocker; 12.03.2009
comment
Крысы! Я думал, что буду первым, кто придумает это ... думал, они назовут это «законом Джона» ... теперь это было бы круто. ;-) - person John MacIntyre; 12.03.2009
comment
Верно. Я пытался получить один. - person George Stocker; 12.03.2009
comment
Я все еще жду своего закона о том, что количество ссылок на пони в потоке неизбежно приближается к бесконечности. - person TheTXI; 12.03.2009

Я думаю, что делаю что-то подобное, но жестких правил нет. Мне нравится, когда код размещается в «абзацах» сгруппированной / связанной логики.

Код без лишних пробелов читать ужасно.

person leppie    schedule 12.03.2009

Похоже, я разделяю строчки кода, похожего на вас.

Но это неуместное личное предпочтение, и у каждого будет свой «правильный способ» сделать это. ИМХО, самое главное - это адаптировать стиль среды, в которую вы входите.

Кроме того, вы найдете такой код в «реальном мире» ... но похоже, что у вас более высокие устремления. ;-)

РЕДАКТИРОВАТЬ: ... не более высокие устремления, чем «реальный мир», но более высокие, чем посредственное дерьмо, обычное в «реальном мире». ... однако, если у вас есть более высокие стремления, чем в «реальном мире», вы можете обратиться к профессионалу. ;-)

person John MacIntyre    schedule 12.03.2009

Мое практическое правило:

Поместите одну пустую строку между блоками кода, которые можно описать одним комментарием.

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

person Joel    schedule 12.03.2009

Поскольку у нас нет примера вашего личного представления о «логическом» межстрочном интервале, мы не можем точно сказать, заслуживали ли вы понижения рейтинга.

Я стараюсь группировать похожие утверждения или шаги в последовательности вместе перед интервалом (например, объявления переменных, циклы и т. Д.)

person TheTXI    schedule 12.03.2009

В основном то же самое, что говорят все. В COBOL были очень разные правила относительно того, что такое предложение и абзац. Думаю, в глубине души я следую за ними. Если у вас большой оператор IF, вы не ставите точку до самого конца гнезда. Точно так же я помещаю пустую строку после моего последнего} // end if

И да, я помещаю // end if, // end for, // end method stuff туда. Некоторым из более вокальных людей, которых я знаю, это не нравится, но мне это нравится. Они говорят, что вы не должны делать свои if-выражения огромными и что вы, вероятно, неправильно кодируете, если вам НУЖНЫ элементы // end if, а мне НЕ НУЖНО это, но я считаю, что это облегчает чтение. Называйте меня старомодным, ОКР, как угодно.

person belgariontheking    schedule 12.03.2009

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

Похоже, ваш учитель в основном придурок. Как говорится, «те, кто может, делайте; те, кто не может, на StackOverflow учат». ;)

person John Feminella    schedule 12.03.2009
comment
Думаю, вы попали в точку: одна пустая строка, не более. - person leppie; 12.03.2009

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

person Andy    schedule 12.03.2009

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

person Tundey    schedule 12.03.2009

Ваш учитель, вероятно, был наполовину прав в том, что в реальном мире у вас не будет межстрочного интервала. Конечно, в кодовых базах Big Ball of Mud, с которыми я сталкивался, вам повезло, если у вас есть пробел, не говоря уже о комментариях к объяснению.

Помимо того, что 73-летний программист, который написал большую часть этого Big Ball of Mud, все еще работает там, и его объяснение состоит в том, что двоичные файлы должны быть как можно меньше, я не стал проверять, соответствуют ли компиляторы от 20 до 30 лет назад были настолько неэффективными, что не могли удалить пробелы, но я несколько скептически отношусь к этому.

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

Как всегда, лучший тест с такого рода проблемами читабельности - это взять какой-нибудь сложный фрагмент кода, который вы написали и не просматривали более года, и посмотреть, сможете ли вы быстро понять его. Если вы сможете, то ваш код будет лучше, чем то, что вы увидите в реальном мире!

person sipsorcery    schedule 12.03.2009
comment
Похоже, что 73-летний старик а) не знает, как работают компиляторы, и б) не обращает внимания на то, что преждевременная оптимизация является корнем всех злых принципов. - person Juliet; 12.03.2009
comment
Когда я писал BASIC на своем TRS-80, интерпретатор практически не выполнял предварительную обработку, поэтому пробелы снижали производительность. Буквально в каждой системе, которую я использовал с тех пор, была какая-то предварительная обработка, поэтому пробелы не замедляют выполнение и не увеличивают размер исполняемого файла. - person David Thornley; 12.03.2009

Я считаю код статьей. Вы когда-нибудь пытались прочитать 2 страницы статьи, в которой нет абзаца или межстрочного интервала?

Я согласен с вами, отсутствие межстрочных интервалов между логическими группами просто безумие.

person dr. evil    schedule 12.03.2009

Один из моих учителей снизил оценку одного из моих заданий, потому что я логически расставил свой код. Он сказал: «Когда в реальном мире тебе нужно читать код весь день, у тебя не будет такого межстрочного интервала, и ты будешь меня благодарить».

Если вы не разделяете блоки 5 или 10 строками пробелов (что сведет кого-нибудь с ума), ваш инструктор - просто задница.

Стандарты кодирования не высечены на камне, и, конечно же, они не одинаковы для всех магазинов программного обеспечения. У всех компаний разные стандарты кодирования. Как бы то ни было, некоторые стандарты кодирования в моей компании прямо заявляют, что «визуально разделяют логически связанные блоки кода с помощью одной пустой строки».

Хотя мы должны стремиться не писать методы длиной в 200 строк, все наши короткие методы по-прежнему часто содержат более одного элемента потока управления, и мы должны понимать, что вертикальные пробелы так же важны, как и горизонтальные пробелы для удобочитаемости. Вы можете удовлетворить принципу «единый метод, единственная цель», даже если вы поместите пустую строку между циклом for и оператором if в одном и том же методе.


[Edit to add] И еще несколько комментариев:

1) Очень самонадеянно, что несколько человек в этом потоке предполагают, что OP пишет 200-строчные методы или что существует необходимая корреляция между добавлением пустых строк и написанием неаккуратных методов.

2) Как бы то ни было, инструктор OP совершенно ошибается, предполагая, что его стандарты кодирования одинаковы везде. Однако вы должны относиться к курсу программирования как к собственному маленькому магазину программного обеспечения со своими собственными стандартами, поэтому ваш код должен быть написан в соответствии с этими стандартами.

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

person Juliet    schedule 12.03.2009

Я только что работал над кодом, идущим в противоположном направлении; каждый оператор отделяется от следующего пустой строкой. Авторам также понравилось использовать четыре строки комментария с выравниванием по правому краю в столбце 60 вместо однострочного комментария с отступом на уровне кода. Его трудно читать, и его утомительно исправлять. Еще одна особенность кода (код C), разрыв из предыдущего случая «прикрепляется» к регистру следующего, но после регистра есть пустая строка, отделяющая его от кода. Крик!

Пустые строки вокруг блоков кода - это хорошо. Не иметь слишком большого количества блоков кода в одной функции - это хорошо. Пустые строки вокруг каждой строчки кода неприятны. Слишком много или слишком мало хорошего - это плохо.

person Jonathan Leffler    schedule 12.03.2009
comment
Мои мысли в точности. У нас есть код, написанный (бывшим) программистом, который полностью соответствует вашему описанию, и пустая строка между каждой строкой кода действительно раздражает и никому не помогает. - person Mike Spross; 27.04.2009

У нас есть стандарт кодирования, который гласит, что мы не должны помещать более одной пустой строки в строку. Все остальное - на усмотрение разработчика. На практике мы поступаем так, как вы говорите - пытаемся сгруппировать логически связанные строки в группы и изолировать их пустыми строками.

person sharptooth    schedule 12.03.2009

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

Я думаю, что ваш код сталкивается с такой проблемой.

Как правило, метод с более чем 100 строками слишком велик и слишком сложен, и его необходимо реорганизовать.

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

person Romain Linsolas    schedule 12.03.2009
comment
Цикломатическая сложность не принимает во внимание большие тупые операторы case-type, которые иногда бывают полезны. У них высокий ЦК, но их легко понять. - person David Thornley; 12.03.2009

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

/* This section preps the widgets for display */
block 
of some 
code

/* This section passes the widgets to the display handler */
and 
so 
on

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

person Jeremy French    schedule 12.03.2009

1) Я согласен с вами насчет межстрочного интервала

2) В моем офисе очень часто не хватает межстрочного интервала, потому что «таким образом вы можете увидеть больше кода на одной странице». Еще они помещают несколько операторов в одну строку, а более (ИМХО) используют?: ... Ненавижу.

3) Я не согласен с фразой «Вот почему он учитель». как (бывший) учитель, я должен сказать, что я бы снизил оценку людей за то, что они НЕ помещали пробелы между разделами, прежде чем я сниму баллы за размещение пробелов. Я тоже не думаю. Я хочу сказать, что то, что он осел, ортогонален тому, что он учитель. (РЕДАКТИРОВАТЬ: этот раздел был отредактирован из оригинала, но я оставляю его здесь, чтобы сохранить правило 3 ...)

Не злословите учителей!

person Brian Postow    schedule 12.03.2009

Я знаю, что это старый вопрос, но я споткнулся о нем, ища что-то еще, и сделал наблюдение: посмотрите на существующие ответы. Обычно они короткие, но содержат пустые строки.

Вот что такое абзацы. Как и в письменной форме, линии - это быстрый и наглядный способ разделения понятий. Это не означает, что каждый абзац выше должен быть разбит на отдельный ответ; это не значит, что каждый «параграф» кода должен быть разбит на отдельный метод.

Это глупая жалоба. Если бы еще можно было поговорить с этим профессором, я бы объяснил, что означает «стена текста».

person spinn    schedule 15.09.2011

На мой взгляд, добавление пустого места в код - это намек на то, что вам следует разделить функцию на более мелкие части. Очистка кода путем добавления пробелов предпочтительнее, чем список неразделенных строк длиной в милю. Лучше очистить код, отделив более мелкие функции.

person Magnar    schedule 12.03.2009
comment
Хм ... Значит, добавление пустой строки до и после объявления переменных в начале функции означает, что они должны быть в новой функции? Я так не думаю. - person user72491; 12.03.2009
comment
Я не согласен с этим. Если функция / метод становится слишком длинным, включая пустые строки, это запах. Пропуск пустых строк, чтобы втиснуть больше в вертикальное пространство, также является запахом. - person slim; 12.03.2009
comment
Единая цель - лучшее руководство, чем пустые строки, но это чертовски хороший намек, когда вы добавляете одну для логического разделения функций. :) - person Lazarus; 12.03.2009
comment
Возвращая это к 0, хотя я не полностью согласен с комментарием, я думаю, что есть хоть какое-то чувство правды, и не думаю, что оно заслуживает -1. - person Daniel Sloof; 12.03.2009
comment
@treant: если вы объявляете так много переменных в начале своей функции, что чувствуете необходимость их отделить, это еще один намек на то, что ваши функции слишком велики. - person Magnar; 12.03.2009
comment
@Magnar снова я не согласен. У меня была бы пустая строка под объявлением одной переменной. - person slim; 12.03.2009
comment
+0: ​​ваш совет приемлем, но, как правило, бывает слишком много исключений. Два или более последовательных оператора потока управления в одном методе не обязательно нарушают принцип единого метода, единой цели и улучшают читаемость за счет визуального разделения между ними. - person Juliet; 12.03.2009

Я не собираюсь предлагать какие-либо подробности. Здесь и в других местах в сети есть много хороших предложений.

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

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

person CJM    schedule 12.03.2009

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

Вот метод, который я только что скопировал и вставил из проекта:

public static void Startup(bool startupUser)
{
    URI = "";
    AutoComplete = new AutoCompleteWrapper();
    SessionToken = Guid.Empty;
    ExternalDataSetLock = new object();

    ConfigDS.Init();
    CalendarDS.Init();
    CalendarDSBuilder.Init();

    if (startupUser && UserName != null)
    {
        string autoCompleteFilename = Path.Combine(UserFolder, "autocomplete.xml");
        AutoComplete.Load(autoCompleteFilename);
    }
}

Что здесь делают пустые строки? Они поясняют, что в этом методе используются три основных типа инициализации. Если я добавлю новое свойство, которое необходимо инициализировать при запуске, я знаю, где я собираюсь поместить строку, которая его инициализирует. Пустые строки также намекают на то, как я собираюсь реорганизовать эту функцию, если она увеличится вдвое.

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

Но милосердие, это еще не причина, чтобы их не использовать.

person Robert Rossney    schedule 12.03.2009

Я начал следовать рекомендациям Microsoft по дизайну, которые можно найти здесь:

Руководство по дизайну для Разработчики библиотеки классов

person Lazarus    schedule 12.03.2009