stringtranslate.com

Стиль отступа

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

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

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

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

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

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

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

Обзор

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

Стили C/C++

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

Относительное размещение тела функции и составного оператора иногда различается ( if, while, for, ...)

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

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

Однако многострочные блоки внутри функции имеют открывающие скобки на той же строке, что и соответствующие управляющие операторы; Закрывающие скобки остаются на отдельной строке, если за ними не следует ключевое слово elseили while. Такие несоосные подтяжки получили прозвище «египетские подтяжки» (или «египетские скобки») за сходство с руками в некоторых причудливых позах древних египтян. [4] [5] [6] В K&R однострочные блоки не имеют фигурных скобок, что является возможным источником ошибок, которые легко пропустить при слиянии кода (например, см. ошибку gotofail ) .

int main ( int argc , char * argv []) { ... while ( x == y ) { Something (); что-то другое ();             если ( some_error ) do_correct (); // В K&R блок с одним оператором не имеет фигурных скобок. еще continue_as_usual (); }       финальная_вещь (); ... } 

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

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

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

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

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

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

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

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

bool is_negative ( x ) { if ( x < 0 ) { return true ; } Еще { вернуть ложь ; } }               

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

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

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

В стиле ядра для отступов используются позиции табуляции (при этом позиции табуляции устанавливаются через каждые 8 ​​символов). Открывающие фигурные скобки функции переходят в начало строки, следующей за заголовком функции. Любые другие открывающие фигурные скобки располагаются на той же строке, что и соответствующий оператор, и разделяются пробелом. Метки в switchоператоре выравниваются по окружающему блоку (имеется только один уровень отступов). Раньше длина строки ограничивалась 80 символами — в 2020 году она была увеличена до 100, но исходное ограничение по-прежнему является предпочтительным. [9] Тело составного оператора, состоящее из одного оператора (например, if, while и do- while ), не обязательно должно быть заключено в фигурные скобки. Однако если один или несколько подоператоров в if-elseоператоре требуют фигурных скобок, то оба подоператора должны быть заключены в фигурные скобки:

int power ( int x , int y ) { int result ;       если ( y < 0 ) { результат = 0 ; } Еще { результат = 1 ; while ( y -- > 0 ) результат *= x ; } вернуть результат ; }                       

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

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

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

Вариант: Ява

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

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

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

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

 if ( x < 0 ) { puts ( «Отрицательный» ); отрицательный ( х ); } else { puts ( "Неотрицательный" ); неотрицательный ( x ); }            

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

 class Vector { public : // создаём Vector Vector ( int s ) : elem ( new double [ s ]), sz ( s ) { } // доступ к элементу: индексация double & оператор []( int i ) { return elem [ я ]; } int size () { return sz ; } Private : // указатель на элементы double * elem ; // количество элементов int sz ; };                                  

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

Страуструп позволяет писать короткие функции в одной строке. Стиль Страуструпа — это именованный стиль отступов, доступный в редакторе Emacs . Страуструп поощряет использование C++ в стиле K&R, как указано в его современном C++ Core Guidelines . [14]

Вариант: БСД КНФ

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

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

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

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

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

while ( x == y ) { что-то (); что-то другое (); } Final_thing ();      
if ( data != NULL && res > 0 ) { if ( JS_DefineProperty ( cx , o , "data" , STRING_TO_JSVAL ( JS_NewStringCopyN ( cx , data , res ))), NULL , NULL , JSPROP_ENUMERATE ) != 0 ) { QUEUE_EXCEPTION ( " Внутренняя ошибка!" ); перейти к ошибке ; } PQfreemem ( данные ); } else { if ( JS_DefineProperty ( cx , o , "data" , OBJECT_TO_JSVAL ( NULL ), NULL , NULL , JSPROP_ENUMERATE ) != 0 ) { QUEUE_EXCEPTION ( "Внутренняя ошибка!" ); перейти к ошибке ; } }                                           
статический JSBool pgresult_constructor ( AOContext * cx , JSObject * obj , uintN argc , jsval * argv , jsval * rval ) {           QUEUE_EXCEPTION ( "Класс PGresult не может быть создан пользователем" ); возврат ( JS_FALSE ); } 

Оллман стиль

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

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

while ( x == y ) { что-то (); что-то другое (); }     финальная_вещь ();

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

(* Пример стиля отступов кода Allman в Паскале *) процедура dosomething ( x , y : Integer ) ; начать , пока x = y , начать что-то () ; что-то другое () ; конец ; конец ;            

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

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

// while (x == y) { что-то (); что-то другое (); }  

Как это:

// for (int i=0; i < x; i++) // while (x == y) if ( x == y ) { Something (); что-то другое (); }     

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

 интервал с ; #ifdef HAS_GETCH while (( c = getch ()) != EOF ) #else while (( c = getchar ()) != EOF ) #endif { do_something ( c ); }                

Вариант: Оллман-8

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

Стиль кузнецов

Стиль Whitesmiths, также иногда называемый стилем Wishart, первоначально использовался в документации для первого коммерческого компилятора C, Whitesmiths Compiler. Он также был популярен на заре существования Windows, поскольку использовался в трех влиятельных книгах по программированию для Windows: « Руководство программиста по Windows» Дюранта, Карлсона и Яо, « Программирование Windows» Петцольда и «Техники мощного программирования Windows 3.0» Нортона и Яо.

Согласно Jargon File, Whitesmiths, наряду с Allman, были наиболее распространенными стилями крепления с одинаковой популярностью . [1]

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

Как и в стиле Рэтлиффа, закрывающая скобка имеет такой же отступ, как и операторы внутри фигурных скобок. [19]

while ( x == y ) { что-то (); что-то другое (); }       финальная_вещь ();

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

Пример:

if ( data != NULL && res > 0 ) { if ( ! JS_DefineProperty ( cx , o , "data" , STRING_TO_JSVAL ( JS_NewStringCopyN ( cx , data , res )), NULL , NULL , JSPROP_ENUMERATE )) { QUEUE_EXCEPTION ( "Внутренняя ошибка) !" ); перейти к ошибке ; } PQfreemem ( данные ); } else if ( ! JS_DefineProperty ( cx , o , "data" , OBJECT_TO_JSVAL ( NULL ), NULL , NULL , JSPROP_ENUMERATE )) { QUEUE_EXCEPTION ( "Внутренняя ошибка!" ); перейти к ошибке ; }                                      

else ifрассматриваются как оператор, во многом похожий на #elifоператор препроцессора.

стиль GNU

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

На макет, популяризированный Ричардом Столлманом , может повлиять его опыт написания кода на Lisp . [21] В Лиспе эквивалентом блока (программы) является объект данных первого класса, и присвоение ему собственного уровня отступов помогает подчеркнуть это, тогда как в C блок — это всего лишь синтаксис. Этот стиль также можно найти в некоторых учебниках по языкам программирования ALGOL и XPL 1960-х и 1970-х годов. [22] [23] [ обсудить ]

Хотя это и не отступ как таковой, стиль кодирования GNU также включает пробел после имени функции – перед левой скобкой в ​​списке аргументов.

static char * concat ( char * s1 , char * s2 ) { while ( x == y ) { Something (); что-то другое (); } Final_thing (); }                  

[20]

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

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

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

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

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

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

while ( x == y ) { что-то (); что-то другое (); //... if ( x < 0 ) { printf ( "Negative" ); отрицательный ( х ); } else { printf ( «Неотрицательный» ); неотрицательный ( x ); } } Final_thing ();                   

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

Пико стиль

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

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

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

Стиль Рэтлиффа

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

 // В C for ( i = 0 ; i < 10 ; i ++ ) { if ( i % 2 == 0 ) { do_something ( i ); } Еще { do_something_else ( я ); } }                       

Стили языка, производные от C

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

Стиль Лиспа

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

Традиционный вариант этого стиля в Лиспе предпочитает чрезвычайно узкие уровни отступов (обычно два пробела), поскольку код Лиспа обычно вложен очень глубоко, поскольку в Лиспе есть только выражения , без отдельного класса операторов ; Аргументы функции обычно имеют отступ до одного и того же уровня, чтобы проиллюстрировать их общий статус внутри заключающего выражения. Это также связано с тем, что, если оставить в стороне фигурные скобки, Lisp традиционно является очень кратким языком, опуская даже распространенные формы простого шаблонного кода как неинформативные, такие как ключевое слово elseв if : then | elseблоке, вместо этого отображая его единообразно как (if expr1 expr2 expr3).

// C for ( i = 0 ; i < 10 ; i ++ ) { if ( i % 2 == 0 ) { do_something ( i );} else { do_something_else ( i ); сделать_третью_вещь ( я );}}                 

 

;; Lisp ( dotimes ( i 10 ) ( if ( = ( rem i 2 ) 0 ) ( do-something i ) ( progn ( do-something-else i ) ( do-th-th-thing i ))))               

Примечание. prognЭто процедура последовательной оценки нескольких подвыражений для эффектов с отбрасыванием всего возвращаемого значения, кроме последнего (n-го). Если все возвращаемые значения желательны, valuesбудет использована процедура.

Стиль Хаскелла

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

braceless = do text <- getContents let firstWord = head $ words text bigWord = сопоставить toUpper firstWord putStrLn bigWord                   braceful = do { text <- getContents ; let { firstWord = head $ words text ; bigWord = сопоставить верхнее первое слово } ; putStrLn bigWord }                          

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

стиль АПЛ

В качестве примера того, насколько краток обычно APL, вот реализация ступенчатой ​​функции для Game of Life:

жизнь { 1 . 3 4 =+ / + ¯1 0 1 ∘. ¯1 0 1 ¨ }     

Стиль APL C напоминает краткий стиль кода APL и обычно используется в их реализациях. [35] Этот стиль был впервые предложен Артуром Уитни и активно используется при реализации K , собственного проекта Артура. Язык программирования J также реализован в этом стиле. Примечательно, что не все реализации APL используют этот стиль C, а именно: GNU APL и Dyalog APL.

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

Стиль Python

Python не использует фигурные скобки. Отступ определяет блоки в так называемом правиле «вне игры» .

для  i  в  диапазоне ( 10 ):  если  я  %  2  ==  0 :  do_something ( i )  else :  do_something_else ( i )  do_ Third_thing ( i )

Размер отступа

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

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

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

Табуляция против пробела

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

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

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

Многие текстовые редакторы, включая Notepad++ , TextEdit , Emacs , vi и nano , можно настроить либо на сохранение символов табуляции при вводе с помощью клавиши табуляции, либо на преобразование их в пробелы (в зависимости от настроенной ширины табуляции), чтобы символы табуляции не добавляется в файл при нажатии клавиши табуляции. Некоторые редакторы могут преобразовывать символы табуляции в пробелы и наоборот.

Некоторые пейджеры текстовых файлов , такие как less , можно настроить на ширину табуляции. Некоторые инструменты, такие как развернуть / свернуть, можно конвертировать на лету с помощью фильтров.

Автоматизация стиля

Инструмент может автоматизировать код форматирования в соответствии со стилем отступов, например команда Unix indent .

Emacs предоставляет команды для изменения отступов, включая нажатие Tabна заданную строку. M-x indent-regionкод отступов.

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

Теряем след блоков

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

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

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

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

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

Другой способ сохранить распознавание блоков — использовать комментарии после закрывающей скобки. Например:

для ( int я знак равно 0 ; я < всего ; я ++ ) { foo (); } //для (я)           
если ( Икс < 0 ) { бар (); } //если (х < 0)      

Недостатком является сохранение одного и того же кода в нескольких местах — над и под блоком.

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

Вставка заявления

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

Рассмотрим этот стартовый код:

for ( int я = 0 ; я < 10 ; я ++ ) { do_something (); } //для (я)          

do_somethingбудет вызван 10 раз. Затем он модифицируется путем добавления новой второй строки:

для ( int я знак равно 0 ; я < 10 ; я ++ )         do_something_else ();{ сделай что-нибудь (); // вызывается один раз! } //for (i) ==> НЕПРАВИЛЬНО! 

Исходный блок (строки 3–5) больше не является телом цикла forи выполняется только один раз. Далее комментарий в пятой строке становится неверным!

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

Оригинал:

для ( int я знак равно 0 ; я < 10 ; я ++ ) {          сделай что-нибудь ();} //для (я) 

Добавление новой второй строки не влияет на количество do_somethingвызовов или на достоверность конечного комментария.

для ( int я знак равно 0 ; я < 10 ; я ++ ) {          do_something_else (); сделай что-нибудь ();} //для (я) 

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

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

  1. ^ abc "Жаргонный файл". 4.4.7. 29 декабря 2003 года . Проверено 18 августа 2014 г.
  2. ^ Дарвин, Ян Ф. (1988). Проверка программ на C с помощью Lint. Калифорния: О'Рейли и партнеры. п. 51. ИСБН 9780937175309.
  3. ^ аб "1TBS".
  4. ^ «Руководство по стилю Java». Архивировано из оригинала 12 июля 2018 года. Допускается использование «египетских» фигурных скобок или фигурных скобок в стиле C.
  5. ^ «Египетские скобки». Фолдок . Юмористический [ sic ] термин для обозначения стиля отступов K&R, обозначающий позу «одна рука вверх вперед, другая вниз сзади».
  6. ^ «Руководство по стилю Google JavaScript» . Фигурные скобки соответствуют стилю Кернигана и Ритчи («египетские скобки») для непустых блоков и блочных конструкций.
  7. ^ ab «Стили фигурных скобок и JavaScript». 7 января 2013 года . Проверено 8 ноября 2018 г.
  8. ^ Подробное описание стиля дано на kernel.org.
  9. ^ Ларабель, Майкл. «Ядро Linux не поддерживает стиль кодирования строк из 80 символов». Фороникс . Фороникс Медиа . Проверено 1 мая 2022 г.
  10. Редди, Ачут (30 марта 2000 г.). «Руководство по стилю кодирования Java» (PDF) . Сан Микросистемс. Архивировано из оригинала (PDF) 28 февраля 2006 года . Проверено 30 мая 2008 г.
  11. ^ «Соглашения о коде Java» (PDF) . Сан Микросистемс. 12 сентября 1997 г. Архивировано из оригинала (PDF) 13 мая 2008 г. . Проверено 30 мая 2008 г.
  12. ^ «Соглашения о коде для языка программирования Java». Сан Микросистемс. 20 марта 1997 года . Проверено 30 мая 2008 г.
  13. ^ аб Страуструп, Бьярн (сентябрь 2010 г.). «Руководство по стилю PPP» (PDF) .
  14. ^ Страуструп, Бьярн. «Основные рекомендации C++». Гитхаб . Проверено 3 ноября 2018 г.
  15. ^ abc Шеннон, Билл (19 августа 1996 г.). «Стиль C и стандарты кодирования для SunOS» (PDF) . 1.8. Сан Микросистемс, Инк . Проверено 15 июня 2019 г.
  16. ^ аб Грегг, Брендан. «Руководство по стилю DTraceToolkit» . Проверено 6 февраля 2015 г.
  17. Шеннон, Билл (9 сентября 1998 г.). "cstyle.pl". иллюмос-врата . 1.58. Сан Микросистемс, Инк . Проверено 6 февраля 2015 г.
  18. ^ «стиль отступа». Интернет-хакерский жаргонный файл . 4.4.7. 29 декабря 2003 года . Проверено 20 марта 2022 г. - через Catb.
  19. ^ abc МакКоннелл, Стив (2004). Code Complete: Практическое руководство по созданию программного обеспечения . Редмонд, Вашингтон: Microsoft Press. стр. 746–747. ISBN 978-0-7356-1967-8.
  20. ^ ab «Форматирование исходного кода». Стандарты кодирования GNU . Проверено 6 июня 2016 г.
  21. Столлман, Ричард (28 октября 2002 г.). «Мой опыт работы с Lisp и разработка GNU Emacs (Стенограмма выступления на Международной конференции Lisp)» . Проверено 6 июня 2016 г.
  22. ^ Бауманн, Ричард [на немецком языке] ; Фелисиано, Мануэль; Бауэр, Фридрих Людвиг ; Самельсон, Клаус (1964). Введение в АЛГОЛ – учебник для неспециалистов, подчеркивающий практическое использование алгоритмического языка. Серия по автоматическим вычислениям. Энглвуд Клиффс, Нью-Джерси, США: Prentice-Hall, Inc. ISBN  0-13-477828-6. LCCN  64-10740. ковчег:/13960/t6qz35p37 . Проверено 23 октября 2022 г.
  23. ^ WM McKeeman, JJ Horning и DB Wortman, Генератор компилятора , 1970, https://archive.org/details/compilergenerato00mcke
  24. ^ Протестировано на приведенном выше примере исходного кода в Ubuntu 18.04 с отступом GNU 2.2.11 и GNU Emacs 25.2.2, начинающимся с emacs --no-init-file.
  25. ^ «Стиль кодирования ядра Linux» . Проверено 1 января 2017 г.
  26. ^ Дженсен, Кэтлин; Вирт, Никлаус (1974). Руководство пользователя и отчет PASCAL . Спрингер-Верлаг.
  27. ^ Руководство по стилю Хорстманна
  28. ^ Оно, Асако (2013). «Методология обучения образцовому стилю кодирования с учетом особенностей стиля кодирования студентов, которые содержат колебания». Конференция IEEE Frontiers in Education 2013 (FIE) . стр. 1908–1910. дои : 10.1109/fie.2013.6685167. ISBN 9781467352611. S2CID  28385526.
  29. ^ Ламмерс, Сьюзен (1986). Программисты за работой . Майкрософт Пресс. ISBN 978-0-914845-71-3.
  30. ^ Патти, Джим. «Документация по художественному стилю 2.05». Художественный стиль . Проверено 24 апреля 2015 г.
  31. ^ Керниган, Брайан В.; Плаугер, П.Дж. (1976). Программные инструменты . Аддисон-Уэсли. ISBN 9780201036695.
  32. ^ "Отчет о Haskell 98" . Haskell.org . Проверено 3 марта 2016 г.
  33. ^ Липовача, Миран. «Создание собственных типов и типовых классов». Learnyouahaskell.com . Проверено 3 февраля 2016 г.
  34. ^ Отчет Haskell 1.2 (1992), стр.131 B.4 «Макет»
  35. ^ "J Инкунабулум". jsoftware.com . Проверено 19 мая 2022 г.
  36. ^ Миара, Ричард Дж.; Массельман, Джойс А.; Наварро, Хуан А. и Шнейдерман, Бен (ноябрь 1983 г.). «Отступы и понятность программы» (PDF) . Коммуникации АКМ . 26 (11): 861–867. дои : 10.1145/182.358437. S2CID  11767796 . Проверено 3 августа 2017 г.
  37. ^ Завински, Джейми (2000). «Табы против пробелов: вечная священная война» . Проверено 6 июня 2016 г.
  38. ^ «Стандарты кодирования WordPress» . Проверено 6 июня 2016 г.
  39. Хоффа, Фелипе (26 июля 2017 г.). «400 000 репозиториев GitHub, 1 миллиард файлов, 14 терабайт кода: пробелы или табуляции?». Середина . Проверено 9 июля 2019 г.
  40. ^ Лэмб, Линда (1998). Изучение редактора vi . О'Рейли. ISBN 9781565924260.

Внешние ссылки

Табы и пробелы