stringtranslate.com

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

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

Обзор

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

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

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

Стиль отступа применяется только к текстовым языкам. В визуальных языках программирования отступ отсутствует.

Исследовать

Несмотря на повсеместное использование стилей отступов, было проведено мало исследований их ценности. Первые эксперименты, проведенные Вайсманом в 1974 году, не показали никакого эффекта. [1] В 2023 году эксперимент Морцека и др. [2] показал значительный положительный эффект для вложенных ifоператоров, где для чтения кода без отступов требовалось в среднем на 179% больше времени, чем для чтения кода с отступами. Последующий эксперимент Ханенберга и др. [3] подтвердил большой эффект (хотя в этом эксперименте для чтения кода без отступов требовалось всего на 113% больше времени) и показал, что различия во времени чтения можно объяснить кодом, который можно пропустить (для кода с отступами). В другом эксперименте с объектами JSON [4] для чтения кода без отступов требовалось даже на 544% больше времени.

Известные стили

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

Стили C/C++

Атрибуты стилей кодирования языков программирования C , C++ и других с фигурными скобками включают в себя, помимо прочего:

Стиль Кернигана и Ритчи (K&R) обычно используется для кода C и C++ и является основой для многих производных стилей. Он используется в оригинальном ядре Unix, книге Кернигана и Ритчи «Язык программирования C» , а также в книге Кернигана и Плэугера «Элементы стиля программирования» .

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

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

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

Пример кода:

int main ( int argc , char * argv []) { while ( x == y ) { do_something (); do_something_else (); if ( some_error ) fix_issue (); // блок из одного оператора без фигурных скобок else continue_as_usual (); } final_thing (); }                   

Египетские брекеты

Невыровненные скобки многострочных блоков получили прозвище «египетские скобки» (или «египетские скобки») за их сходство с руками в некоторых причудливых позах древних египтян. [5] [6] [ 7]

Отдельные заявления

Блок из одного оператора не имеет фигурных скобок, что является причиной ошибок, которые легко пропустить, например, ошибки goto fail .

Одна настоящая скобка

Стиль One True Brace Style [8] (сокращенно 1TBS или OTBS [9] ) похож на стиль K&R, но функции форматируются как многооператорные блоки с открывающей фигурной скобкой на той же строке, что и объявление, а фигурные скобки не опускаются для блока с одним оператором. [10]

bool is_negative ( int x ) { if ( x < 0 ) { return true ; } else { return false ; } }                

Хотя это и не требуется в таких языках, как C/C++, использование фигурных скобок для блоков с одним оператором гарантирует, что вставка оператора не приведет к потоку управления, который не соответствует отступам, как это видно, например, в печально известной ошибке goto fail от Apple .

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

Источники расходятся во мнениях относительно значения One True Brace Style. Некоторые говорят, что это вариация, указанная здесь, [10] в то время как другие говорят, что это «хакерский жаргон» для K&R. [12]

ядро Linux

Исходное дерево ядра Linux оформлено в стиле K&R. [13] Линус Торвальдс советует участникам следовать ему. Атрибуты включают:

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

Ява

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

Страуструп

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

В отличие от вариантов выше, Страуструп не использует "cuddled else". Таким образом, Страуструп написал бы [18]

 если ( x < 0 ) { puts ( "Отрицательный" ); отрицательный ( x ); } иначе { puts ( "Неотрицательный" ); неотрицательный ( x ); }            

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

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

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

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

БСД КНФ

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

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

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

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

Примеры:

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

Оллман

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

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

пока ( x == y ) { что-то (); что-то_еще (); }     final_thing ();

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

(* Пример стиля отступов кода Оллмана в Паскале *) procedure dosomething ( x , y : Integer ) ; begin while x = y do begin something () ; something_else () ; end ; end ;            

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

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

// пока (x == y) { что-то (); что-то_еще (); }  

Как и это:

// для (int i=0; i < x; i++) // пока (x == y) если ( x == y ) { что-то (); что-то_еще (); }     

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

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

Вариант: Allman-8

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

Уайтсмитс

Стиль Whitesmiths, также иногда называемый стилем Wishart, изначально использовался в документации для первого коммерческого компилятора C, Whitesmiths Compiler. Он также был популярен в ранние дни Windows, поскольку использовался в трех влиятельных книгах по программированию для Windows: Programmer's Guide to Windows Дюранта, Карлсона и Яо, Programming Windows Петцольда и Windows 3.0 Power Programming Techniques Нортона и Яо.

По данным журнала Jargon File , в 1991 году Whitesmiths, наряду с Allman, были признаны наиболее распространёнными стилями крепления , и в то время пользовались примерно одинаковой популярностью. [12] [23]

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

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

пока ( x == y ) { что-то (); что-то_еще (); }       final_thing ();

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

Пример:

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

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

ГНУ

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

Популяризированная Ричардом Столлманом , компоновка, возможно, была создана под влиянием его опыта написания кода на Lisp . [26] В Lisp эквивалент блока (progn) является первоклассной сущностью данных, и предоставление ему собственного уровня отступа помогает подчеркнуть, что, в то время как в C, блок — это всего лишь синтаксис. Этот стиль также можно найти в некоторых учебниках по языкам программирования ALGOL и XPL 1960-х и 1970-х годов. [27] [28] [ обсудить ]

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

статический символ * конкат ( символ * s1 , символ * s2 ) { пока ( x == y ) { что-то (); что-то_еще (); } финальная_вещь (); }                  

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

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

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

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

Хорстманн

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

while ( x == y ) { something (); something_else (); //... if ( x < 0 ) { printf ( "Отрицательное" ); negative ( x ); } else { printf ( "Неотрицательное" ); nonnegative ( x ); } } final_thing ();                   

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

Пико

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

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

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

Ратлифф

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

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

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

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

Стиль Лиспа

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

Традиционный вариант этого стиля Lisp предпочитает чрезвычайно узкие уровни отступов (обычно два пробела), поскольку код Lisp обычно вложен очень глубоко, поскольку 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 ); do_third_thing ( i );}}                 

 

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

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

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

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

без скобок = сделать текст <- получитьСодержимое пусть firstWord = заголовок $ слова текст bigWord = карта toUpper firstWord putStrLn bigWord                   braceful = do { text <- getContents ; let { firstWord = head $ words text ; bigWord = map toUpper firstWord } ; putStrLn bigWord }                          

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

стиль АПЛ

В качестве примера того, насколько лаконичен APL, приведем реализацию ступенчатой ​​функции для игры «Жизнь»:

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

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

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

Стиль Python

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

для  i  в  диапазоне ( 10 ):  если  i  %  2  ==  0 :  сделать_что-то ( i )  иначе :  сделать_что-то_еще ( i )  сделать_третье_что-то ( i )

Традиционно отступ составляет четыре пробела. Табуляция также возможна. [41]

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

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

Эксперимент, проведенный на коде PASCAL в 1983 году, показал, что размер отступа значительно влияет на понятность. Оптимальным оказался размер отступа от 2 до 4 символов. [42]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

для ( int i = 0 ; i < total ; i ++ ) { foo (); } // для (i)           
если ( х < 0 ) { бар (); } // если (х < 0)      

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

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

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

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

Учитывая этот начальный код:

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

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

для ( int i = 0 ; i < 10 ; i ++ )         сделать_что-то_еще ();{ do_something (); // вызывается один раз! } //для (i) 

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

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

Оригинал:

для ( int i = 0 ; i < 10 ; i ++ ) {          сделать_что-то ();} //для (i) 

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

для ( int i = 0 ; i < 10 ; i ++ ) {          сделать_что-то_еще (); сделать_что-то ();} //для (i) 

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

Ссылки

  1. ^ Вайсман, Лоренс Марк (1974). Методология изучения психологической сложности компьютерных программ. CSRG-37 (Технический отчет). Исследовательская группа компьютерных систем, Университет Торонто . OCLC  1085612768. technicalreportc37univ – через Интернет-архив .
  2. ^ Морцек, Йоханнес; Ханенберг, Стефан; Вергер, Оле; Грун, Фолькер (2023). Отступы в исходном коде: рандомизированное контрольное испытание читаемости потоков управления в коде Java с большими эффектами. Труды 18-й Международной конференции по программным технологиям - ICSOFT. Рим , Италия. стр. 117–128. doi : 10.5220/0012087500003538 . ISBN 978-989-758-665-1– через Стефана Ханенберга на Google Диске (препринт).
  3. ^ Ханенберг, Стефан; Морцек, Йоханнес; Грун, Фолькер (9 августа 2024 г.). «Отступ и время чтения: рандомизированное контрольное испытание различий между сгенерированными отступами и без отступов if-statements». Эмпирическая программная инженерия . 29 (5): 134. doi : 10.1007/s10664-024-10531-y . ISSN  1573-7616.
  4. ^ Ханенберг, Стефан; Морцек, Йоханнес; Вергер, Оле; Грис, Стефан; Грун, Фолькер (2024). «Отступ и время чтения: контролируемый эксперимент по различиям между сгенерированными отступами и неотступами JSON-объектов». В Fill, Ханс-Георг; Домингес Майо, Франсиско Хосе; ван Синдерен, Мартен; Мациашек, Лешек А. (ред.). Программные технологии . Коммуникации в области компьютерных и информационных наук. Том 2104. Cham: Springer Nature Switzerland. стр. 50–75. doi :10.1007/978-3-031-61753-9_4. ISBN 978-3-031-61753-9.
  5. ^ "Java Style Guide". Архивировано из оригинала 12 июля 2018 г. Допустимо использование как "египетских" фигурных скобок, так и фигурных скобок в стиле C.
  6. ^ "Египетские скобки". Foldoc . Юмористический [ sic ] термин для стиля отступа K&R, относящийся к позе "одна рука вверху спереди, одна внизу сзади"
  7. ^ "Google JavaScript Style Guide". Скобки следуют стилю Кернигана и Ричи ("египетские скобки") для непустых блоков и блочно-подобных конструкций
  8. ^ Дарвин, Ян Ф. (1988). Проверка программ на языке C с помощью Lint. Калифорния: O'Reilly and Assosciates. стр. 51. ISBN 9780937175309.
  9. ^ "1ТБС".
  10. ^ ab "Стили скобок и JavaScript". 7 января 2013 г. Получено 8 ноября 2018 г.
  11. ^ ab "Linux kernel coding style" . Получено 1 января 2017 г. .
  12. ^ abc "The Jargon File". 4.4.7. 29 декабря 2003 г. Получено 18 августа 2014 г.
  13. ^ Подробное описание стиля приведено на kernel.org.
  14. ^ Ларабель, Майкл. «Ядро Linux отказывается от стиля кодирования строк из 80 символов». Phoronix . Phoronix Media . Получено 1 мая 2022 г. .
  15. ^ Reddy, Achut (30 марта 2000 г.). "Java Coding Style Guide" (PDF) . Sun Microsystems. Архивировано из оригинала (PDF) 28 февраля 2006 г. Получено 30 мая 2008 г.
  16. ^ "Java Code Conventions" (PDF) . Sun Microsystems. 12 сентября 1997 г. Архивировано из оригинала (PDF) 13 мая 2008 г. Получено 30 мая 2008 г.
  17. ^ "Code Conventions for the Java Programming Language". Sun Microsystems. 20 марта 1997 г. Получено 30 мая 2008 г.
  18. ^ аб Страуструп, Бьярн (сентябрь 2010 г.). «Руководство по стилю PPP» (PDF) .
  19. ^ Страуструп, Бьярн. «Основные рекомендации C++». Гитхаб . Проверено 3 ноября 2018 г.
  20. ^ abc Шеннон, Билл (19 августа 1996 г.). "Стиль C и стандарты кодирования для SunOS" (PDF) . 1.8. Sun Microsystems, Inc. Получено 15 июня 2019 г.
  21. ^ ab Gregg, Brendan. "DTraceToolkit Style Guide" . Получено 6 февраля 2015 г.
  22. Шеннон, Билл (9 сентября 1998 г.). "cstyle.pl". illumos-gate . 1.58. Sun Microsystems, Inc. Получено 6 февраля 2015 г.
  23. ^ "The Jargon File (Version 2.4.3)". 2.4.3. 23 января 1991 г. Получено 14 мая 2024 г.
  24. ^ abc Макконнелл, Стив (2004). Code Complete: практическое руководство по построению программного обеспечения . Редмонд, Вашингтон: Microsoft Press. С. 746–747. ISBN 978-0-7356-1967-8.
  25. ^ ab "Форматирование исходного кода". Стандарты кодирования GNU . Получено 6 июня 2016 г.
  26. ^ Столлман, Ричард (28 октября 2002 г.). «Мой опыт работы с Lisp и разработка GNU Emacs (стенограмма выступления на Международной конференции по Lisp)» . Получено 6 июня 2016 г.
  27. ^ Бауманн, Ричард [на немецком] ; Фелисиано, Мануэль; Бауэр, Фридрих Людвиг ; Самельсон, Клаус (1964). Введение в АЛГОЛ – учебник для неспециалистов, подчеркивающий практическое использование алгоритмического языка. Серия по автоматическим вычислениям. Энглвуд Клиффс, Нью-Джерси, США: Prentice-Hall, Inc. ISBN  0-13-477828-6. LCCN  64-10740. ark:/13960/t6qz35p37 . Получено 23 октября 2022 г. .
  28. ^ WM McKeeman, JJ Horning и DB Wortman, Генератор компиляторов , 1970, https://archive.org/details/compilergenerato00mcke
  29. ^ Протестировано на примере исходного кода выше на Ubuntu 18.04 с GNU indent 2.2.11 и GNU Emacs 25.2.2, запущенном с emacs --no-init-file.
  30. ^ Дженсен, Кэтлин; Вирт, Никлаус (1974). Руководство пользователя и отчет PASCAL . Спрингер-Верлаг.
  31. ^ Руководство по стилю Хорстманна
  32. ^ Ohno, Asako (2013). «Методология обучения образцовому стилю кодирования с учетом особенностей стиля кодирования студентов, содержащих колебания». 2013 IEEE Frontiers in Education Conference (FIE) . стр. 1908–1910. doi :10.1109/fie.2013.6685167. ISBN 9781467352611. S2CID  28385526.
  33. ^ Ламмерс, Сьюзен (1986). Программисты на работе . Microsoft Press. ISBN 978-0-914845-71-3.
  34. ^ Патти, Джим. "Artistic Style 2.05 Documentation". Artistic Style . Получено 24 апреля 2015 г. .
  35. ^ Керниган, Брайан В.; Плогер, П. Дж. (1976). Программные средства . Addison-Wesley. ISBN 9780201036695.
  36. ^ "The Haskell 98 Report". haskell.org . Получено 3 марта 2016 г. .
  37. ^ Липовача, Миран. «Создание собственных типов и классов типов». learnyouahaskell.com . Получено 3 февраля 2016 г. .
  38. ^ Haskell Report 1.2 (1992), стр.131 B.4 «Макет»
  39. ^ "The J Incunabulum". jsoftware.com . Получено 19 мая 2022 г. .
  40. ^ "Исходный код J". github.com . Получено 12 сентября 2024 г. .
  41. ^ ван Россум, Гвидо ; Варшава, Барри; Коглан, Алисса. "PEP 8 – Руководство по стилю для кода Python § Code Lay-out". peps.python.org . Получено 11 марта 2024 г.
  42. ^ Miara, Richard J.; Musselman, Joyce A.; Navarro, Juan A. & Shneiderman, Ben (ноябрь 1983 г.). "Program Indentation and Comprehensibility" (PDF) . Communications of the ACM . 26 (11): 861–867. doi :10.1145/182.358437. S2CID  11767796. Получено 3 августа 2017 г.
  43. ^ Завински, Джейми (2000). «Табы против пробелов: вечная священная война» . Получено 6 июня 2016 г.
  44. ^ "WordPress Coding Standards" . Получено 6 июня 2016 г. .
  45. ^ Хоффа, Фелипе (26 июля 2017 г.). «400 000 репозиториев GitHub, 1 миллиард файлов, 14 терабайт кода: пробелы или табуляции?». Medium . Получено 9 июля 2019 г. .
  46. ^ Лэмб, Линда (1998). Изучение редактора vi . O'Reilly. ISBN 9781565924260.

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

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