Стиль отступа - Indentation style

В компьютерное программирование, стиль отступа это конвенция, регулирующая отступ из блоки кода для передачи структуры программы. В этой статье в основном рассматриваются языки свободной формы, Такие как C и его потомков, но может применяться (и часто применяется) к большинству других языки программирования (особенно в фигурные скобки семейство ), куда пробел в остальном не имеет значения. Стиль отступов - это только один аспект стиль программирования.

Отступы не требуются для большинства языков программирования, где они используются как вторичное обозначение. Скорее, отступы помогают лучше передать структуру программы читателям. В частности, он используется для уточнения связи между поток управления конструкции, такие как условия или циклы, и код, содержащийся внутри и вне них. Однако некоторые языки (например, Python и Оккам ) используйте отступ для определения структуры вместо фигурных скобок или ключевых слов; это называется вне игры. В таких языках отступ важен для компилятора или интерпретатора; это больше, чем просто вопрос ясности или стиля.

В этой статье используется термин скобки ссылаясь на скобки, а термин фигурные скобки относится к фигурным скобкам.

Размещение скобок в составных операторах

Основное различие между стилями отступа заключается в размещении фигурных скобок составного оператора ({...}), который часто следует за оператором управления (если, пока, за...). В таблице ниже показано это размещение стиля утверждений, обсуждаемого в этой статье; Другой случай - стиль объявления функции. Стиль размещения фигурных скобок в операторах может отличаться от стиля размещения фигурных скобок в определении функции. Для единообразия глубина отступа оставлена ​​постоянной на уровне 4 пробелов, независимо от предпочтительной глубины отступа для каждого стиля.

Размещение скобыСтили
пока (Икс == у){    что нибудь();    что-то другое();}
K&R, Allman
пока (Икс == у)  {    что нибудь ();    что-то другое ();  }
GNU
пока (Икс == у)    {    что нибудь();    что-то другое();    }
Whitesmiths
пока (Икс == у){   что нибудь();    что-то другое();}
Хорстманн
пока (Икс == у)  { что нибудь()  ; что-то другое()  ;  }
Haskell
пока (Икс == у){   что нибудь();    что-то другое(); }
Пико
пока (Икс == у) {    что нибудь();    что-то другое();    }
Ratliff
пока (Икс == у)  { что нибудь();    что-то другое(); }
Лисп
пока (Икс == у) {    что нибудь();    что-то другое();}
K&R вариант 1TBS

Табуляторы, пробелы и размер отступов

Отображаемая ширина вкладок может быть установлена ​​на произвольные значения в большинстве редакторов программирования, включая Блокнот ++ (MS-Windows), TextEdit (MacOS / X), Emacs (unix), vi (unix) и nano (unix). Кроме того, эти редакторы можно настроить для создания комбинации табуляции и пробелов или для преобразования между табуляцией и пробелами, чтобы соответствовать определенным схемам отступов. В unix ширину табуляции также можно установить в пейджеры, Такие как меньше, и конвертируется "на лету" фильтрами, такими как расширять /не раскрывать.

Unix редакторы по умолчанию размещают вкладки с интервалом в восемь столбцов, а Macintosh и MS-Windows по умолчанию для среды используется четыре столбца. Это различие вызывает несовпадение исходного кода, когда отступ, в котором сочетаются табуляции и пробелы, отображается в конфигурации, которая отображает табуляции иначе, чем в конфигурации автора.

Среди программистов продолжаются споры о выборе между жесткими табуляциями и пробелами. Многие ранние программисты использовали вкладка символы для отступа, для простоты набора и экономии на размере исходного файла. Некоторые программисты, например Джейми Завински, укажите, что использование пробелов вместо табуляции увеличивает кросс-платформенный переносимость.[1] Другие, например писатели WordPress стандарты кодирования утверждают обратное: жесткие вкладки повышают переносимость.[2] Обзор 400 000 лучших репозиториев на GitHub обнаружил, что пробелы встречаются чаще.[3]

Размер отступа обычно не зависит от стиля. Эксперимент, проведенный с кодом PASCAL в 1983 году, показал, что размер отступа существенно влияет на понятность. Оптимальными оказались отступы от 2 до 4 символов.[4] За Рубин, много сценарии оболочки языков, и некоторые формы HTML при форматировании обычно используется два пробела на уровень отступа.[нужна цитата ]

Инструменты

Существует множество инструментов для преобразования между стилями отступов, например отступ, программа включена во многие Unix-подобный операционные системы.

В Emacs, доступны различные команды для автоматического исправления проблем с отступами, включая нажатие Вкладка на заданной строке (в конфигурации по умолчанию). M-x indent-region может использоваться для правильного отступа больших участков кода. В зависимости от режима Emacs может также заменять ведущие пробелы отступа на нужное количество табуляций, за которыми следуют пробелы, что приводит к минимальному количеству символов для отступа каждой строки исходного текста.

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

Стили

K&R стиль

Стиль K&R (стиль Керниган и Ричи), который на хакерском жаргоне также называют «стилем единственной скобки».[5][6] (сокращенно 1TBS[7]), обычно используется в C, C ++, и другие языки программирования фигурных скобок. Это был стиль исходного ядра Unix, Керниган и Ричи книга Язык программирования C, а также Керниган и Plauger книга Элементы стиля программирования.

Следуя за K&R, каждая функция имеет открывающую скобку на следующей строке на том же уровне отступа, что и ее заголовок, операторы внутри фигурных скобок имеют отступ, а закрывающая скобка в конце находится на том же уровне отступа, что и заголовок функции. по собственной линии.

Однако блоки внутри функции имеют открывающие фигурные скобки в той же строке, что и соответствующие управляющие операторы; закрывающие фигурные скобки остаются в отдельной строке, если за ними не следует ключевое слово еще или же пока. Такие не-выровнен Подтяжки получили прозвище «египетские скобки» (или «египетские скобки») за их сходство с руками в некоторых причудливых позах древних египтян.[8][9][10]

int главный(int argc, char *argv[]){    ...    пока (Икс == у) {        что нибудь();        что-то другое();        если (some_error)            do_correct();        еще            continue_as_usual();    }    последнее();    ...}

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

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

В старых версиях языка C типы аргументов нужно было объявить в следующей строке (т.е. сразу после заголовка функции):

/ * Оригинальный стиль C до ISO без прототипов функций * /int главный(argc, argv)    int   argc;    char  *argv[];{    ...}

Вариант: 1ТБС (ОТБС)

Сторонники этого стиля иногда называют его «единственным истинным стилем скобок» (сокращенно 1TBS или OTBS[7]). Два основных отличия от стиля K&R заключаются в том, что открывающие фигурные скобки функций находятся в одной строке, разделенные пробелом, и что фигурные скобки не опускаются для управляющего оператора, имеющего только один оператор в его области действия.[11]

В этом стиле конструкции, которые позволяют вставлять новые строки кода, находятся в отдельных строках, а конструкции, запрещающие вставки, находятся в одной строке. Этот принцип усиливается путем закрепления всех if, else, while и т. Д., Включая однострочные условные выражения, так что вставка новой строки кода в любом месте всегда безопасна (т. Е. Такая вставка не приведет к несогласованию потока выполнения с отступ исходного кода).

Предлагаемые преимущества этого стиля заключаются в том, что для начальной скобки не требуется одна дополнительная линия; а конечная скобка совпадает с утверждением, которому она концептуально принадлежит. Одна из издержек этого стиля заключается в том, что конечной скобке блока нужна одна целая строка, которая может быть частично разрешена в блоках if / else и блоках do / while:

пустота чекотрицательный(Икс) {    если (Икс < 0) {        ставит("Отрицательный");    } еще {        неотрицательный(Икс);    }}

Есть много упоминаний о стиле One True Brace, но есть некоторая путаница относительно его истинной формы. Некоторые источники говорят, что это вариант, указанный выше,[11] в то время как другие отмечают, что это просто еще один термин "хакерского жаргона" для K&R.[5]

Вариант: ядро ​​Linux

Незначительным вариантом стиля K&R является стиль ядра linux, который широко используется в дереве исходных текстов Ядро Linux.[12] Линус Торвальдс настоятельно рекомендует всем участникам следовать ему. Стиль заимствует многие элементы от K&R:

Стиль ядра использует табуляция (с позициями табуляции каждые 8 ​​символов) для отступа. Открывающие фигурные скобки функции переходят в начало строки, следующей за заголовком функции. Все остальные открывающие фигурные скобки располагаются в той же строке, что и соответствующий оператор, и разделяются пробелом. Этикетки в выключатель Выровнены по ограничивающему блоку (отступы только один). Тело составного оператора с одним оператором (например, if, while и do-while) не обязательно должно заключаться в фигурные скобки. Если, однако, одна или несколько частей в если еще оператор требует фигурных скобок, тогда оба подзапуска должны быть заключены в фигурные скобки. Длина строки ограничена 80 символами.

Стиль ядра Linux определяет, что «если только одна ветвь условного оператора является одним оператором ... используйте фигурные скобки в обеих ветвях»:

int мощность(int Икс, int у){	int результат;	если (у < 0) {		результат = 0;	} еще {		результат = 1;		пока (у-- > 0)			результат *= Икс;	}	возвращаться результат;}

Вариант: обязательные подтяжки

Некоторые выступают за обязательные фигурные скобки для управляющих операторов только с одним оператором в своей области, то есть закрепление всех if, else, while и т. Д., Включая однострочные условные выражения, так что вставка новой строки кода в любом месте всегда безопасный (т.е. такая вставка не приведет к несоответствию потока выполнения с отступом исходного кода).

Стоимость этого стиля заключается в том, что для последнего блока требуется одна дополнительная полная строка (за исключением промежуточных блоков в конструкциях if / else if / else и блоках do / while).

Вариант: Java

Пока Ява иногда пишется в других стилях, значительная часть кода Java использует второстепенный вариант K&R стиль в котором открывающая скобка находится в одной строке не только для блоков внутри функции, но и для объявлений классов или методов. Этот стиль широко распространен в основном потому, что Sun Microsystems оригинальный руководства по стилю[13][14][15] использовали этот вариант K&R, и в результате большая часть стандартного исходного кода для Java API написано в этом стиле. Это также популярный стиль отступов для ActionScript и JavaScript, вместе с Стиль Allman.

Вариант: Страуструп

Стиль Страуструпа - это Бьярне Страуструп адаптация стиля K&R для C ++, используемого в его книгах, таких как Программирование: принципы и практика использования C ++ и Язык программирования C ++.[16]

В отличие от вариантов, описанных выше, Страуструп не использует «объятия еще». Таким образом, Страуструп напишет[16]

    если (Икс < 0) {        ставит("Отрицательный");        отрицательный(Икс);    }    еще {        ставит(«Неотрицательный»);        неотрицательный(Икс);    }

Страуструп расширяет стиль K&R для классов, записывая их следующим образом:

    учебный класс Вектор {    общественный:        Вектор(int s) :элем(новый двойной[s]), sz(s) { }   // создаем вектор        двойной& оператор[](int я) { возвращаться элем[я]; }   // доступ к элементу: индексирование        int размер() { возвращаться sz; }    частный:        двойной * элем;    // указатель на элементы        int sz;           // количество элементов    };

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

Stroustrup позволяет писать короткие функции в одну строку. Стиль Страуструпа - это именованный стиль отступа, доступный в редакторе. Emacs. Страуструп поддерживает макет стиля, производный от K&R, с помощью C ++, как указано в его современном Основные принципы C ++.[17]

Вариант: BSD KNF

Также называется Нормальная форма ядра, это форма большей части кода, используемого в Распространение программного обеспечения Беркли (BSD) операционные системы. Хотя в основном он предназначен для кода ядра, он также широко используется в пользовательское пространство код. По сути, это тщательно задокументированный вариант стиля K&R, который использовался в Bell Labs Version 6 и 7. Unix исходный код.[18]

Ядро SunOS и пользовательское пространство используют похожий стиль отступов.[18] Как и KNF, он также был основан на документах в стиле AT&T и иногда называется нормальной формой Билла Джоя.[19] Руководство SunOS было опубликовано в 1996 году; Кратко обсуждается ANSI C. Правильность отступа в списке исходных файлов может быть проверена cstyle программа написана Биллом Шенноном.[18][19][20]

В этом стиле жесткий табулятор (тс в vi ) хранится в восьми столбцах, в то время как программный табулятор часто определяется также как помощник (sw в vi) и устанавливается в четыре. Жесткие табуляторы используются для отступов блоков кода, в то время как мягкие табуляторы (четыре пробела) с дополнительным отступом используются для всех продолжающихся строк, которые должны быть разделены на несколько строк.

Более того, в вызовах функций не используется пробел перед круглыми скобками, хотя собственные операторы языка C, такие как если, пока, делать, выключатель и возвращаться делать (в случае, когда возвращаться используется с скобками). Функции, которые не объявляют никаких локальных переменных в блоке верхнего уровня, также должны оставлять пустую строку после открывающей скобки блока.

Вот несколько примеров:

пока (Икс == у) {        что нибудь();        что-то другое();}последнее();

 

если (данные != НОЛЬ && res > 0) {        если (JS_DefineProperty(сх, о, "данные",            STRING_TO_JSVAL(JS_NewStringCopyN(сх, данные, res)),            НОЛЬ, НОЛЬ, JSPROP_ENUMERATE) != 0) {                QUEUE_EXCEPTION("Внутренняя ошибка!");                идти к ошибаться;        }        PQfreemem(данные);} еще {        если (JS_DefineProperty(сх, о, "данные", OBJECT_TO_JSVAL(НОЛЬ),            НОЛЬ, НОЛЬ, JSPROP_ENUMERATE) != 0) {                QUEUE_EXCEPTION("Внутренняя ошибка!");                идти к ошибаться;        }}

 

статический JSBoolpgresult_constructor(АОконтекст *сх, JSObject *объект, uintN argc,    jsval *argv, jsval *rval){        QUEUE_EXCEPTION("Класс PGresult не может быть создан пользователем");        возвращаться (JS_FALSE);}

Стиль Allman

Стиль Allman назван в честь Эрик Оллман. Его также иногда называют BSD стиль поскольку Оллман написал множество утилит для BSD Unix (хотя это не следует путать с другим «стилем BSD KNF»; см. Выше).

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

пока (Икс == у){    что нибудь();    что-то другое();}последнее();

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

(* Пример стиля отступа кода Allman на Паскале *)процедура сделай что-нибудь(Икс, у: Целое число);начинать    пока Икс = у делать    начинать        что нибудь();        что-то другое();    конец;конец;

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

Например, синтаксически верно следующее:

// пока (x == y){    что нибудь();    что-то другое();}

Как это:

// for (int i = 0; i // пока (x == y)если (Икс == у){    что нибудь();    что-то другое();}

Даже так, с условной компиляцией:

    int c;#ifdef HAS_GETCH    пока ((c = получить()) != EOF)#еще    пока ((c = Getchar()) != EOF)#endif    {        сделай что-нибудь(c);    }

Вариант: Allman-8

Популярный вариант для использования в образовании,[нужна цитата ] Allman-8 использует вкладки с отступом в 8 пробелов и ограничение в 80 столбцов, как в варианте K&R ядра Linux. Этот стиль якобы помогает улучшить читаемость на проекторах. Кроме того, размер отступа и ограничение столбца помогают создать визуальную подсказку для выявления чрезмерной вложенности блоков кода. Эти преимущества в совокупности помогают новым разработчикам и учащимся неявно управлять сложностью кода.[нужна цитата ]

Стиль Уайтсмитс

Стиль Whitesmiths, также иногда называемый стилем Wishart, первоначально использовался в документации для первого коммерческого компилятора C, Whitesmiths Компилятор. Он также был популярен на заре Windows, поскольку использовался в трех влиятельных книгах по программированию Windows: Руководство программиста по Windows к Durant, Карлсон & Яо, Программирование Windows к Петцольд, и Методы программирования Windows 3.0 Power к Нортон И Яо.

Whitesmiths вместе с Allman, были наиболее распространенными стилями распорок, одинаково популярными в соответствии с Файл жаргона.[5]

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

пока (Икс == у)    {    что нибудь();    что-то другое();    }последнее();

Преимущества этого стиля аналогичны преимуществам Стиль Allman. Блоки четко отделены от управляющих заявлений. Выравнивание фигурных скобок с блоком подчеркивает, что полный блок концептуально и программно представляет собой один составной оператор. Отступы в фигурных скобках подчеркивают, что они подчинены управляющему оператору. Конечная скобка больше не совпадает с оператором, а вместо нее находится открывающая скобка.

Пример:

если (данные != НОЛЬ && res > 0)    {    если (!JS_DefineProperty(сх, о, "данные", STRING_TO_JSVAL(JS_NewStringCopyN(сх, данные, res)), НОЛЬ, НОЛЬ, JSPROP_ENUMERATE))        {        QUEUE_EXCEPTION("Внутренняя ошибка!");        идти к ошибаться;        }    PQfreemem(данные);    }еще если (!JS_DefineProperty(сх, о, "данные", OBJECT_TO_JSVAL(НОЛЬ), НОЛЬ, НОЛЬ, JSPROP_ENUMERATE))    {    QUEUE_EXCEPTION("Внутренняя ошибка!");    идти к ошибаться;    }

иначе если рассматриваются как утверждение, как и #elif инструкция препроцессора.

Стиль GNU

Словно Allman и Whitesmiths стили GNU style помещает фигурные скобки в строку отдельно, с отступом двумя пробелами, за исключением случаев открытия определения функции, где они не имеют отступа.[21] В любом случае содержащийся код отделяется двумя пробелами от фигурных скобок.

Популяризируется Ричард Столмен, на макет может повлиять его опыт написания Лисп код.[22] В Lisp эквивалент блока (progn) - это первоклассный объект данных, и предоставление ему собственного уровня отступа помогает подчеркнуть это, тогда как в C блок - это только синтаксис. Этот стиль также можно найти в некоторых АЛГОЛ и XPL учебники по языку программирования 1960-1970-х годов.[23][24][обсуждать] Хотя это не связано напрямую с отступом, стиль кодирования GNU также включает пробел перед заключенным в скобки списком аргументов функции.

статический char *concat (char *s1, char *s2){  пока (Икс == у)    {      что нибудь ();      что-то другое ();    }  последнее ();}

[21]

Этот стиль сочетает в себе преимущества Allman и Whitesmiths, тем самым устраняя возможный недостаток Whitesmiths, заключающийся в том, что скобы не выделяются из блока. Одним из недостатков является то, что конечная скобка больше не совпадает с утверждением, которому она концептуально принадлежит. Другой возможный недостаток заключается в том, что при использовании двух визуальных уровней отступов для одного концептуального уровня это может тратить впустую пространство, но в действительности это маловероятно, потому что в системах с одноуровневым отступом каждый уровень обычно состоит как минимум из 4 пробелов, таких же, как 2 * 2 пробела в стиле GNU.

В Стандарты кодирования GNU рекомендуют этот стиль, и почти все разработчики Проект GNU программное обеспечение использовать это.[нужна цитата ]

В GNU Emacs текстовый редактор и системы GNU ' отступ команда по умолчанию переформатирует код в соответствии с этим стилем.[25] Те, кто не использует GNU Emacs или аналогичные расширяемые / настраиваемые редакторы, могут обнаружить, что настройки автоматического отступа в их редакторе бесполезны для этого стиля. Однако многие редакторы, использующие по умолчанию стиль KNF, хорошо справляются со стилем GNU, когда ширина табуляции установлена ​​равной двум пробелам; аналогично GNU Emacs хорошо адаптируется к стилю KNF, просто задав для ширины табуляции восемь пробелов. В обоих случаях автоматическое переформатирование разрушает исходный интервал, но автоматический отступ строк будет работать правильно.

Стив МакКоннелл, в его книге Код завершен, не рекомендует использовать этот стиль: он помечает образец кода, в котором он используется, значком «Coding Horror», символизирующим особо опасный код, и заявляет, что это препятствует читаемости.[26] В Ядро Linux Документация по стилю кодирования также настоятельно не рекомендует использовать этот стиль, побуждая читателей записать копию стандартов кодирования GNU как «отличный символический жест».[27]

Стиль Хорстмана

Издание 1997 г. Вычислительные концепции с помощью C ++ Essentials Кей С. Хорстманн адаптирует Allman помещая первый оператор блока в ту же строку, что и открывающая фигурная скобка. Этот стиль также используется в примерах Дженсена и Вирта. Руководство пользователя и отчет Pascal.[28]

пока (Икс == у){   что нибудь();    что-то другое();    //...    если (Икс < 0)    {   printf("Отрицательный");        отрицательный(Икс);    }    еще    {   printf(«Неотрицательный»);        неотрицательный(Икс);    }}последнее();

Этот стиль сочетает в себе преимущества Allman сохраняя вертикальное выравнивание фигурных скобок для удобства чтения и легко идентифицируя блоки, с сохранением линии стиля K&R. Однако издание 2003 года теперь повсюду использует стиль Оллмана.[29]

Пико стиль

Это стиль, наиболее часто используемый в языке Пико своими дизайнерами. В Pico отсутствуют операторы возврата, и в качестве разделителей операторов вместо терминаторов используются точки с запятой. Это дает такой синтаксис:[30]

материал (п): {х: 3 * п; у: doStuff (х); y + x}

Преимущества и недостатки аналогичны экономии экранного пространства в стиле K&R. Дополнительным преимуществом является то, что начальная и закрывающая фигурные скобки согласованы в приложении (обе разделяют пространство со строкой кода) по сравнению со стилем K&R, где одна фигурная скобка разделяет пространство со строкой кода, а одна фигурная скобка имеет одну строку.

Рэтлифф стиль

В книге Программисты за работой,[31] К. Уэйн Рэтлифф обсуждал использование стиля ниже. Стиль начинается примерно так же, как 1TBS, но затем закрывающая скобка совпадает с отступом вложенного блока. Рэтлифф был первым программистом, стоящим за популярным dBase -II и -III языки программирования четвертого поколения. Он указал, что первоначально это было задокументировано в материалах из Цифровые исследования Inc. Этот стиль иногда называют знамя стиль,[32] возможно, из-за сходства со знаменем, висящим на шесте. В этом стиле, который Whitesmiths как K&R для Allman, закрывающий элемент имеет отступ как последний элемент в списке (и, таким образом, теряет заметность). Этот стиль может облегчить визуальное сканирование для некоторых, поскольку заголовки любого блока - единственное, что расширяется на этом уровне (теория заключается в том, что контроль закрытия предыдущего блока мешает визуальному потоку заголовка следующего блока в стилях K&R и Allman). Керниган и Плаугер используют этот стиль в коде Ratfor в Программные инструменты.[33]

 // В C за (я = 0; я < 10; я++) {     если (я % 2 == 0) {         сделай что-нибудь(я);         }     еще {         doSomethingElse(я);         }     }

или, на языке разметки ...

{|| - | много чего ... ещё || альтернатива для коротких строк || и т. д. |} {|| -... и т. д. |}

Стиль Лисп

Программист может даже пойти дальше и вставить закрывающие фигурные скобки в последнюю строку блока. Этот стиль делает отступы единственным способом различения блоков кода, но имеет то преимущество, что не содержит неинформативных строк. Это можно легко назвать стилем Lisp (потому что этот стиль очень распространен в коде Lisp) или стилем Python (Python не имеет фигурных скобок, но макет очень похож, как показано в блоках кода ниже). В Python макет - это часть языка, называемая вне игры.

// В Cза (я = 0; я < 10; я++)    {если (я % 2 == 0)        {сделай что-нибудь(я);}     еще        {doSomethingElse(я);         doThirdThing(я);}}

 

# В Pythonза я в классифицировать(10):    если я % 2 == 0:        сделай что-нибудь(я)    еще:        do_something_else(я)        do_third_thing(я)

 

;; В Лиспе(время жизни (я 10)    (если (= (rem я 2) 0)        (сделай что-нибудь я)        (прогноз            (делать что-то еще я)            (делать третье дело я))))

Стиль Haskell

Haskell layout может делать фигурные скобки необязательными, хотя фигурные скобки и точки с запятой разрешены в языке.[34] Два приведенных ниже сегмента одинаково приемлемы для компилятора:

беззаботный = делать  текст <- getContents  позволять    первое слово = голова $ слова текст    bigWord = карта toUpper первое слово  putStrLn bigWordхрабрый = делать  { текст <- getContents  ; позволять      { первое слово = голова $ слова текст      ; bigWord = карта toUpper первое слово      }  ; putStrLn bigWord  }

В Haskell раскладка может заменять фигурные скобки. Обычно фигурные скобки и точки с запятой опускаются для процедурный делать разделы и текст программы в целом, но этот стиль обычно используется для списков, записей и других синтаксических элементов, состоящих из пары круглых или фигурных скобок, разделенных запятыми или точками с запятой.[35] Если код после ключевых слов куда, позволять, или же из фигурные скобки и точки с запятой опускаются, значит отступы имеют значение.[36]

Прочие соображения

Потеря следа блоков

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

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

Чтобы не потерять контроль над такими утверждениями, как заможно использовать большие отступы, например жесткую вкладку шириной 8 единиц, наряду с разделением больших функций на более мелкие и более удобные для чтения. Linux делается таким образом, используя стиль K&R.

В текстовых редакторах vi семейства, одно из средств отслеживания границ блока - это навести текстовый курсор на одну из фигурных скобок и нажать кнопку % ключ. Курсор переместится на противоположную скобку. Поскольку текстовый курсор следующий ключ (а именно, п клавиша) сохраняет информацию о направлении (независимо от того, вверх или же вниз ранее была нажата клавиша), точечный макрос. key) можно затем использовать для размещения текстового курсора на следующей скобке,[37] учитывая подходящий стиль кодирования. Вместо этого, проверяя границы блока, используя % ключ может использоваться для обеспечения соблюдения стандарта кодирования.

Другой способ - использовать встроенные комментарии, добавленные после закрывающей скобки:

за (int я = 0; я < общий; я++) {    фу(бар);} // for (i)
если (Икс < 0) {   бар(фу);} // если (x <0)

Основным недостатком этого метода является сохранение повторяющегося кода в нескольких местах.

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

Вставка выписки

Стиль K&R предотвращает еще одну распространенную ошибку, возникающую при использовании стандартного Unix линейный редактор, ред. Оператор, ошибочно вставленный между оператором управления и открывающей скобкой блока цикла, превращает тело цикла в одно путешествие.

за (int я = 0; я < 10; я++)    упс(бар);   / * повторяется 10 раз, с i от 0 до 9 * /{    только однажды();   / * Программист намеревался сделать это 10 раз * /} // for (i) ← Этот комментарий больше недействителен и вводит в заблуждение!

Стиль K&R позволяет избежать этой проблемы, сохраняя управляющий оператор и открывающую скобку в одной строке.

Смотрите также

Рекомендации

  1. ^ Завински, Джейми (2000). "Вкладки против пробелов: вечная священная война". Получено 6 июн 2016.
  2. ^ «Стандарты кодирования WordPress». Получено 6 июн 2016.
  3. ^ Хоффа, Фелипе (26 июля 2017 г.). «400 000 репозиториев GitHub, 1 миллиард файлов, 14 терабайт кода: пробелы или табуляции?». Середина. Получено 9 июля 2019.
  4. ^ Миара, Ричард Дж .; Musselman, Joyce A .; Наварро, Хуан А. и Шнейдерман, Бен (ноябрь 1983 г.). «Отступы и понятность программы» (PDF). Коммуникации ACM. 26 (11): 861–867. Дои:10.1145/182.358437. Получено 3 августа 2017.
  5. ^ а б c "Файл жаргона". 4.4.7. 29 декабря 2003 г.. Получено 18 августа 2014.
  6. ^ Дарвин, Ян Ф. (1988). Проверка программ на C с помощью Lint. Калифорния: O'Reilly and Assosciates. п. 51. ISBN  9780937175309.
  7. ^ а б http://catb.org/jargon/html/0/one-TBS.html
  8. ^ «Руководство по стилю Java». Предполагаемая древнеегипетская поза
  9. ^ «Египетские скобки». Foldoc. Юмористический термин для стиля отступов K&R, относящийся к позе «одна рука вверху впереди, одна вниз сзади».
  10. ^ "Руководство по стилю Google JavaScript". Скобки соответствуют стилю Кернигана и Ричи («египетские скобки») для непустых блоков и блочных конструкций.
  11. ^ а б «Стили скобок и JavaScript». 7 января 2013 г.. Получено 8 ноября 2018.
  12. ^ Подробное описание стиля дано на kernel.org.
  13. ^ Редди, Ачут (30 марта 2000 г.). "Руководство по стилю программирования Java" (PDF). Sun Microsystems. Архивировано из оригинал (PDF) 28 февраля 2006 г.. Получено 30 мая 2008.
  14. ^ «Соглашения по Java-коду» (PDF). Sun Microsystems. 12 сентября 1997 г. Архивировано с оригинал (PDF) 13 мая 2008 г.. Получено 30 мая 2008.
  15. ^ «Соглашения о коде для языка программирования Java». Sun Microsystems. 20 марта 1997 г.. Получено 30 мая 2008.
  16. ^ а б Страуструп, Бьярн (сентябрь 2010 г.). «Руководство по стилю ГЧП» (PDF).
  17. ^ Страуструп, Бьярн. «Основные принципы C ++». GitHub. Получено 3 ноября 2018.
  18. ^ а б c Шеннон, Билл (19 августа 1996). «Стиль C и стандарты кодирования для SunOS» (PDF). 1.8. Sun Microsystems, Inc. Получено 15 июн 2019.
  19. ^ а б Грегг, Брендан. «Руководство по стилю DTraceToolkit». Получено 6 февраля 2015.
  20. ^ Шеннон, Билл (9 сентября 1998 г.). "cstyle.pl". иллюминатор. 1.58. Sun Microsystems, Inc. Получено 6 февраля 2015.
  21. ^ а б «Форматирование исходного кода». Стандарты кодирования GNU. Получено 6 июн 2016.
  22. ^ Столмен, Ричард (28 октября 2002 г.). «Мои впечатления от Lisp и разработка GNU Emacs (стенограмма выступления на Международной конференции Lisp)». Получено 6 июн 2016.
  23. ^ Р. Бауман, М. Фелисиано, Ф. Л. Бауэр и К. Самуэльсон, Введение в Алгол, 1964, https://archive.org/details/introductiontoal00baum
  24. ^ У. М. МакКиман, Дж. Дж. Хорнинг и Д. Б. Вортман, Генератор компилятора, 1970, https://archive.org/details/compilergenerato00mcke
  25. ^ Протестировано на примере исходного кода выше в Ubuntu 18.04 с отступом GNU 2.2.11 и GNU Emacs 25.2.2 началось с emacs --no-init-file.
  26. ^ МакКоннелл, Стив (2004). Code Complete: Практическое руководство по созданию программного обеспечения. Редмонд, Вашингтон: Microsoft Press. стр.746–747. ISBN  978-0-7356-1967-8.
  27. ^ "Стиль кодирования ядра Linux". Получено 1 января 2017.
  28. ^ Дженсен, Кэтлин; Вирт, Никлаус (1974). Руководство пользователя и отчет PASCAL. Springer-Verlag.
  29. ^ Руководство по стилю Horstmann
  30. ^ Оно, Асако (2013). Методология обучения примерному стилю кодирования с учетом особенности стиля кодирования учащихся содержит колебания. Конференция IEEE Frontiers in Education, 2013 г. (FIE). С. 1908–1910. Дои:10.1109 / fie.2013.6685167. ISBN  9781467352611.
  31. ^ Ламмерс, Сьюзен (1986). Программисты за работой. Microsoft Press. ISBN  978-0-914845-71-3.
  32. ^ Патти, Джим. «Документация Artistic Style 2.05». Художественный стиль. Получено 24 апреля 2015.
  33. ^ Керниган, Брайан В .; Плаугер, П. Дж. (1976). Программные инструменты. Эддисон-Уэсли.
  34. ^ "Отчет Haskell 98". haskell.org. Получено 3 марта 2016.
  35. ^ Липовача, Миран. «Создание наших собственных типов и классов типов». Learnyouahaskell.com. Получено 3 февраля 2016.
  36. ^ Отчет Haskell 1.2 (1992), стр.131 B.4 "Макет"
  37. ^ Лэмб, Линда. Изучение редактора vi. О'Рейли.

внешняя ссылка