Из Википедии, бесплатной энциклопедии
  (Перенаправлено из стиля отступа )
Перейти к навигации Перейти к поиску

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

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

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

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

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

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

Для отображаемой ширины вкладок можно задать произвольные значения в большинстве редакторов программирования, включая Notepad ++ (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] Для Ruby , многих языков сценариев оболочки и некоторых форм форматирования HTML обычно используются два пробела на каждый уровень отступа. [ необходима цитата ]

Инструменты [ править ]

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

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

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

Стили [ править ]

K&R style [ править ]

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

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

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

int  main ( int  argc ,  char  * argv []) {  ... в  то время как  ( x  ==  y )  {  что-то ();  somethingelse (); если  ( some_error )  do_correct ();  иначе  continue_as_usual ();  } finalthing ();  ... }

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

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

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

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

Вариант: 1ТБС (ОТБС) [ править ]

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

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

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

void  checknegative ( x )  {  if  ( x  <  0 )  {  put ( "Отрицательный" );  }  else  {  неотрицательный ( x );  } }

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

Вариант: ядро ​​Linux [ править ]

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

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

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

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

Вариант: обязательные фигурные скобки [ править ]

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

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

Вариант: Java [ править ]

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

Вариант: Страуструп [ править ]

Стиль Страуструпа - это адаптация Бьярна Страуструпа стиля K&R для C ++, используемого в его книгах, таких как Programming: Principles and Practice using C ++ and The C ++ Programming Language . [16]

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

 if  ( x  <  0 )  {  ставит ( "Отрицательный" );  отрицательный ( х );  }  else  {  put ( "неотрицательный" );  неотрицательный ( х );  }

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

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

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

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

Вариант: BSD KNF [ править ]

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

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

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

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

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

в то время как  ( х  ==  у )  {  что-то ();  somethingelse (); } finalthing ();

 

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 ( " Внутренняя ошибка! " );  goto  err ;  }  PQfreemem (данные ); }  else  {  if  ( JS_DefineProperty ( cx ,  o ,  "данные" ,  OBJECT_TO_JSVAL ( NULL ),  NULL ,  NULL ,  JSPROP_ENUMERATE )  ! =  0 )  {  QUEUE_EXCEPTION ( «Внутренняя ошибка!» );  goto  err ;  } }

 

статический  JSBool pgresult_constructor ( JSContext  * cx ,  JSObject  * obj ,  uintN  argc ,  jsval  * argv ,  jsval  * rval ) { QUEUE_EXCEPTION ( "Класс PGresult не может быть создан пользователем" ); возврат  ( JS_FALSE ); }

Стиль Allman [ править ]

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

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

в то время как  ( х  ==  у ) {  что-то ();  somethingelse (); }finalthing ();

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

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

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

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

// while (x == y) {  something ();  somethingelse (); }

Как это:

// for (int i = 0; i <x; i ++) // while (x == y) if  ( x  ==  y ) {  something ();  somethingelse (); }

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

 int  c ; #ifdef HAS_GETCH  while  (( c  =  getch ())  ! =  EOF ) #else  while  (( c  =  getchar ())  ! =  EOF ) #endif  {  do_something ( c );  }

Вариант: Allman-8 [ править ]

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

Стиль Whitesmiths [ править ]

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

Согласно « Жаргонному файлу», Whitesmiths, наряду с Allman , были наиболее распространенными стилями крепления с одинаковой популярностью . [5]

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

в то время как  ( х  ==  у )  {  что-то ();  somethingelse ();  }finalthing ();

Преимущества этого стиля аналогичны преимуществам стиля 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 ( "Внутренняя ошибка ! " );  goto  err ;  }  PQfreemem ( данные ); } else  if  ( ! JS_DefineProperty ( cx ,  o ,  «данные» ,  OBJECT_TO_JSVAL ( NULL ),  NULL ,  NULL ,  JSPROP_ENUMERATE ))  {  QUEUE_EXCEPTION ( «Внутренняя ошибка!» );  goto  err ;  }

else ifобрабатываются как инструкция, как и #elifинструкция препроцессора.

Стиль GNU [ править ]

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

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

статический  char  * concat  ( char  * s1 ,  char  * s2 ) {  while  ( x  ==  y )  {  something  ();  somethingelse  ();  }  finalthing  (); }

[21]

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

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

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

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

Стиль Хорстмана [ править ]

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

в то время как  ( х  ==  у ) {  что-то ();  somethingelse ();  // ...  if  ( x  <  0 )  {  printf ( "Negative" );  отрицательный ( х );  }  else  {  printf ( "неотрицательный" );  неотрицательный ( х );  } } finalthing ();

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

Стиль Пико [ править ]

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

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

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

Стиль Рэтлиффа [ править ]

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

 // В C  for  ( i  =  0 ;  i  <  10 ;  i ++ )  {  if  ( i  %  2  ==  0 )  {  doSomething ( i );  }  еще  {  doSomethingElse ( i );  }  }

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

{|| -| много вещей... больше вещей || альтернатива коротким строкам || и т.п.|}{|| -... так далее|}

Стиль Лисп [ править ]

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

// В C for  ( i  =  0 ;  i  <  10 ;  i ++ )  { if  ( i  %  2  ==  0 )  { doSomething ( i );}  else  { doSomethingElse ( i );  doThirdThing ( i );}}

 

# В Python для  i  в  диапазоне ( 10 ):  if  i  %  2  ==  0 :  do_something ( i )  else :  do_something_else ( i )  do_third_thing ( i )

 

;; В Лиспе ( dotimes  ( i  10 )  ( if  ( =  ( rem  i  2 )  0 )  ( do-something  i )  ( progn  ( do-something-else  i )  ( do-third-thing  i ))))

Стиль Haskell [ править ]

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

braceless  =  do  text  <-  getContents  let  firstWord  =  head  $  words  text  bigWord  =  map  toUpper  firstWord  putStrLn  bigWordbraceful  =  делать  {  текст  <-  getContents  ;  пусть  {  firstWord  =  head  $  words  текст  ;  bigWord  =  map  toUpper  firstWord  }  ;  putStrLn  bigWord  }

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

Другие соображения [ править ]

Потеря отслеживания блоков [ править ]

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

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

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

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

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

для  ( int  я  =  0 ;  я  <  всего ;  я ++ )  {  foo ( бар ); }  // for (i)
если  ( х  <  0 )  {  бар ( фу ); }  // если (x <0)

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

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

Вставка выписки [ править ]

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

для  ( int  я  =  0 ;  я  <  10 ;  я ++ )  упс ( бар );  / * повторяется 10 раз, i от 0 до 9 * / {  only_once ();  / * Программист намеревался сделать это 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. DOI : 10.1145 / 182.358437 . S2CID 11767796 . Дата обращения 3 августа 2017 .  
  5. ^ a b c "Файл жаргона" . 4.4.7. 29 декабря 2003 . Проверено 18 августа 2014 .
  6. ^ Дарвин, Ян Ф. (1988). Проверка программ на C с помощью Lint . Калифорния: O'Reilly and Assosciates. п. 51. ISBN 9780937175309.
  7. ^ a b http://catb.org/jargon/html/0/one-TBS.html
  8. ^ "Руководство по стилю Java" . Предполагаемая древнеегипетская поза
  9. ^ "Египетские скобки" . Foldoc . Юмористический термин для стиля отступов K&R, относящийся к позе «одна рука вверху впереди, одна вниз сзади».
  10. ^ "Руководство по стилю Google JavaScript" . Фигурные скобки соответствуют стилю Кернигана и Ричи («египетские скобки») для непустых блоков и блочных конструкций.
  11. ^ a b «Стили скобок и JavaScript» . 7 января 2013 . Проверено 8 ноября 2018 .
  12. ^ Подробное описание стиля дано на kernel.org .
  13. ^ Reddy, Achut (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. ^ a b Страуструп, Бьярн (сентябрь 2010 г.). «Руководство по стилю PPP» (PDF) .
  17. ^ Страуструп, Бьярн. «Основные принципы C ++» . GitHub . Проверено 3 ноября 2018 .
  18. ^ a b c Шеннон, Билл (19 августа 1996 г.). «Стиль C и стандарты кодирования для SunOS» (PDF) . 1.8. Sun Microsystems, Inc . Проверено 15 июня 2019 .
  19. ^ a b Грегг, Брендан. «Руководство по стилю DTraceToolkit» . Проверено 6 февраля 2015 года .
  20. Шеннон, Билл (9 сентября 1998 г.). "cstyle.pl" . иллюмос-ворота . 1.58. Sun Microsystems, Inc . Проверено 6 февраля 2015 года .
  21. ^ a b «Форматирование исходного кода» . Стандарты кодирования GNU . Проверено 6 июня +2016 .
  22. Столмен, Ричард (28 октября 2002 г.). «Мои впечатления от Lisp и разработка GNU Emacs (стенограмма выступления на Международной конференции Lisp)» . Проверено 6 июня +2016 .
  23. ^ Р. Бауманн, М. Фелисиано, Ф.Л. Бауэр и К. Самуэльсон, Введение в Алгол , 1964, https://archive.org/details/introductiontoal00baum
  24. ^ WM McKeeman, JJ Хорнинг и БД Уортман, Компилятор генератор , 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. ^ Руководство по стилю Хорстманна
  30. ^ Оно, Асако (2013). «Методология обучения примерному стилю кодирования с учетом особенностей стиля кодирования учащихся содержит колебания». 2013 IEEE Frontiers in Education Conference (FIE) . С. 1908–1910. DOI : 10.1109 / fie.2013.6685167 . ISBN 9781467352611. S2CID  28385526 . Отсутствует или пусто |title=( справка )
  31. Перейти ↑ Lammers, Susan (1986). Программисты за работой . Microsoft Press. ISBN 978-0-914845-71-3.
  32. ^ Pattee, Джим. «Документация Artistic Style 2.05» . Художественный стиль . Проверено 24 апреля 2015 года .
  33. ^ Керниган, Брайан В .; Plauger, PJ (1976). Программные инструменты . Эддисон-Уэсли.
  34. ^ "Отчет Haskell 98" . haskell.org . Проверено 3 марта +2016 .
  35. ^ Липовача, Миран. «Создание наших собственных типов и классов типов» . Learnyouahaskell.com . Проверено 3 февраля +2016 .
  36. ^ Haskell Report 1.2 (1992), стр.131 Б.4 "Layout"
  37. ^ Лэмб, Линда. Изучение редактора vi . О'Рейли.

Внешние ссылки [ править ]

  • C Style: Standards and Guidelines: Defining Programming Standards for Professional C Programmers , Prentice Hall, ISBN 0-13-116898-3 / ISBN 978-0-13-116898-5 (полный текст также доступен онлайн). Стрейкер, Дэвид (1992).  
  • Контекстный отступ
  • Стандарты кодирования GNU
  • Форматировщики исходного кода в Curlie