Стиль программирования , также известный как стиль кодирования , относится к соглашениям и шаблонам, используемым при написании исходного кода , что приводит к последовательной и читаемой кодовой базе . Эти соглашения часто охватывают такие аспекты, как отступы , соглашения об именовании , использование заглавных букв и комментарии . Последовательный стиль программирования обычно считается полезным для читаемости и поддерживаемости кода , особенно в средах совместной работы.
Поддержание единого стиля в кодовой базе может улучшить читаемость и простоту обслуживания программного обеспечения. Это позволяет разработчикам быстро понимать код, написанный другими, и снижает вероятность ошибок во время модификаций. Соблюдение стандартизированных руководств по кодированию гарантирует, что команды будут придерживаться единого подхода, что упрощает управление и масштабирование кодовой базы. Многие организации и проекты с открытым исходным кодом принимают определенные стандарты кодирования для облегчения совместной работы и снижения когнитивной нагрузки.
Руководства по стилю могут быть формализованы в документах, известных как соглашения по кодированию , которые диктуют определенные правила форматирования и именования. Эти соглашения могут быть предписаны официальными стандартами для языка программирования или разработаны внутри команды или проекта. Например, PEP 8 Python — это широко признанное руководство по стилю, в котором изложены лучшие практики написания кода Python. Напротив, такие языки, как C или Java, могут иметь отраслевые стандарты, которые либо официально задокументированы, либо соблюдаются по соглашению.
Соблюдение стиля кодирования может быть обеспечено с помощью автоматизированных инструментов, которые форматируют код в соответствии с предопределенными правилами. Эти инструменты сокращают ручные усилия, необходимые для поддержания единообразия стиля, позволяя программистам сосредоточиться на логике и функциональности. Например, такие инструменты, как Black
для Python и clang-format
для C++, автоматически переформатируют код для соответствия указанным стандартам кодирования.
Общие элементы стиля кодирования включают в себя:
Стиль отступа может помочь читателю различными способами, включая: идентификацию потока управления и блоков кода. В некоторых языках программирования отступ используется для разграничения блоков кода и, следовательно, не является вопросом стиля. В языках, которые игнорируют пробелы, отступ может повлиять на читаемость.
Например, отформатированный в общепринятом стиле:
если ( часы < 24 && минуты < 60 && секунды < 60 ) { вернуть true ; } иначе { вернуть false ; }
Возможно, плохо отформатировано:
если ( часы < 24 && минуты < 60 && секунды < 60 ) { вернуть истину ;} иначе { вернуть ложь ;}
Стиль нулевого отступа ModuLiq группирует по пустой строке, а не по отступу.
Пример:
если ( часы < 24 && минуты < 60 && секунды < 60 ) вернуть true ; в противном случае вернуть false ;
Lua не использует традиционные фигурные скобки или круглые скобки ; вместо этого выражение в условном операторе должно сопровождаться then
, а блок должен быть закрыт end
.
если часы < 24 и минуты < 60 и секунды < 60, то верните true, иначе верните false конец
Отступы в Lua необязательны. and
, or
и not
функционируют как логические операторы.
Python полагается на правило off-side , используя отступы для указания и реализации структуры управления, тем самым устраняя необходимость в скобках (т. е. {
и }
). Однако копирование и вставка отступа кода может вызвать проблемы, поскольку уровень отступа вставленного кода может не совпадать с уровнем отступа целевой строки. Такое ручное переформатирование утомительно и подвержено ошибкам, но некоторые текстовые редакторы и интегрированные среды разработки (IDE) имеют функции, позволяющие делать это автоматически. Также существуют проблемы, когда отступы кода становятся непригодными для использования при публикации на форуме или веб-странице, которая удаляет пробелы, хотя этой проблемы можно избежать, если заключить код в теги, сохраняющие пробелы, такие как "<pre> ... </pre>" (для HTML ), "[code]" ... "[/code]" (для bbcode ) и т. д.
если часы < 24 и минуты < 60 и секунды < 60 : вернуть True, иначе : вернуть False
Python начинает блок с двоеточия ( :
).
Программисты Python, как правило, следуют общепринятому руководству по стилю, известному как PEP8. [1] Существуют инструменты, предназначенные для автоматизации соответствия PEP8.
Haskell , как и Python, имеет правило офсайда . Он имеет двумерный синтаксис, где отступы имеют смысл для определения блоков (хотя альтернативный синтаксис использует фигурные скобки и точки с запятой).
Haskell — декларативный язык, в нем есть операторы, но в скрипте Haskell есть объявления.
Пример:
пусть c_1 = 1 c_2 = 2 в f x y = c_1 * x + c_2 * y
можно записать в одну строку как:
пусть { c_1 = 1 ; c_2 = 2 } в f x y = c_1 * x + c_2 * y
Haskell поощряет использование грамотного программирования , где расширенный текст объясняет происхождение кода. В грамотных скриптах Haskell (названных с lhs
расширением) все является комментарием, за исключением блоков, помеченных как код. Программа может быть написана в LaTeX , в таком случае code
среда отмечает то, что является кодом. Кроме того, каждый активный абзац кода может быть помечен путем добавления пустой строки перед ним и в конце и начала каждой строки кода со знака «больше» и пробела. Вот пример использования разметки LaTeX:
Функция \ verb + isValidDate + проверка допустимости даты \ begin { code } isValidDate :: Date -> Bool isValidDate date = hh >= 0 && mm >= 0 && ss >= 0 && hh < 24 && mm < 60 && ss < 60 где ( hh , mm , ss ) = fromDate date \ end { code } обратите внимание , что в этом случае перегруженная функция — \ verb + fromDate :: Date - > ( Int , Int , Int ) + .
И пример с использованием обычного текста:
Функция isValidDate проверяет, является ли дата допустимой . > isValidDate :: Дата -> Bool > isValidDate дата = чч >= 0 && мм >= 0 && сс >= 0 > && чч < 24 && мм < 60 && сс < 60 > где ( чч , мм , сс ) = fromDate дата Обратите внимание , что в этом случае перегруженная функция — fromDate :: Date -> ( Int , Int , Int ) .
Некоторые программисты считают полезным выравнивать похожие элементы по вертикали (в виде таблиц, в столбцах), ссылаясь на то, что это может сделать ошибки, вызванные опечатками, более очевидными.
Например, невыровненный:
$search = массив ( 'a' , 'b' , 'c' , 'd' , 'e' ); $replacement = массив ( 'foo' , 'bar' , 'baz' , 'quux' );$value = 0 ; $anothervalue = 1 ; $yetanothervalue = 2 ;
выровнено:
$search = массив ( 'a' , 'b' , 'c' , 'd' , 'e' ); $replacement = массив ( 'foo' , 'bar' , 'baz' , 'quux' );$value = 0 ; $anothervalue = 1 ; $yetanothervalue = 2 ;
В отличие от невыровненного кода, выровненный код подразумевает, что значения поиска и замены связаны, поскольку у них есть соответствующие элементы. Поскольку для поиска на одно значение больше, чем для замены, если это ошибка, ее с большей вероятностью можно обнаружить с помощью визуального осмотра.
К недостаткам вертикального выравнивания относятся:
Поддержание выравнивания можно облегчить с помощью инструмента, обеспечивающего поддержку (например, эластичных упоров ), хотя это создает зависимость от таких инструментов.
Например, простые операции рефакторинга по переименованию «$replacement» в «$r» и «$anothervalue» в «$a» приведут к следующему результату:
$search = массив ( 'a' , 'b' , 'c' , 'd' , 'e' ); $r = массив ( 'foo' , 'bar' , 'baz' , 'quux' );$value = 0 ; $a = 1 ; $yetanothervalue = 2 ;
При невыровненном форматировании эти изменения не оказывают столь драматичного, непоследовательного или нежелательного эффекта:
$search = массив ( 'a' , 'b' , 'c' , 'd' , 'e' ); $r = массив ( 'foo' , 'bar' , 'baz' , 'quux' );$value = 0 ; $a = 1 ; $yetanothervalue = 2 ;
Язык свободного формата игнорирует пробельные символы : пробелы, табуляции и новые строки, поэтому программист может свободно стилизовать код различными способами, не влияя на смысл кода. Обычно программист использует стиль, который, как считается, улучшает читаемость .
Два приведенных ниже фрагмента кода логически одинаковы, но отличаются пробелами.
int i ; for ( i = 0 ; i < 10 ; ++ i ) { printf ( "%d" , i * i + i ); }
против
int i ; for ( i = 0 ; i < 10 ; ++ i ) { printf ( "%d" , i * i + i ); }
Использование табуляции для пробелов является спорным. Проблемы выравнивания возникают из-за различных позиций табуляции в разных средах и смешанного использования табуляции и пробелов.
Например, один программист предпочитает четыре позиции табуляции и настраивает свой набор инструментов таким образом, а также использует их для форматирования своего кода.
int ix ; // Индекс для сканирования массива long sum ; // Аккумулятор для суммы
Другой программист предпочитает табуляции в восемь, и его набор инструментов настроен таким образом. Когда кто-то другой изучает исходный код человека, он может обнаружить, что его трудно читать.
int ix ; // Индекс для сканирования массива long sum ; // Аккумулятор для суммы
Одним из широко используемых решений этой проблемы может быть запрет использования табуляции для выравнивания или правил того, как должны быть установлены табуляции. Обратите внимание, что табуляция работает нормально, если она используется последовательно, ограничена логическим отступом и не используется для выравнивания:
class MyClass { int foobar ( int qux , // первый параметр int quux ); // второй параметр int foobar2 ( int qux , // первый параметр int quux , // второй параметр int quuux ); // третий параметр };