Программирование стиля , также известный как стиль кода , представляет собой набор правил или принципов , используемые при написании исходного кода для компьютерной программы . Часто утверждается, что следование определенному стилю программирования поможет программистам прочитать и понять исходный код, соответствующий стилю, и поможет избежать ошибок.
Классической работой по этой теме были «Элементы стиля программирования» , написанные в 1970-х годах и проиллюстрированные примерами из языков Fortran и PL / I, распространенных в то время.
Стиль программирования, используемый в конкретной программе, может быть получен из соглашений о кодировании компании или другой вычислительной организации, а также от предпочтений автора кода. Стили программирования часто разрабатываются для определенного языка программирования (или семейства языков): стиль, который считается хорошим в исходном коде C, может не подходить для исходного кода BASIC и т. Д. Однако некоторые правила обычно применяются ко многим языкам.
Элементы хорошего стиля
Хороший стиль - дело субъективное, и его трудно определить. Однако есть несколько элементов, общих для большого количества стилей программирования. Проблемы, обычно рассматриваемые как часть стиля программирования, включают структуру исходного кода, включая отступы ; использование пробелов вокруг операторов и ключевых слов; использование заглавных или иных букв в ключевых словах и именах переменных; стиль и написание определяемых пользователем идентификаторов, таких как имена функций, процедур и переменных; а также использование и стиль комментариев .
Внешний вид кода
Стили программирования обычно имеют дело с внешним видом исходного кода с целью его удобочитаемости. Уже давно существует программное обеспечение, которое автоматически форматирует исходный код, оставляя кодировщикам возможность сосредоточиться на именовании, логике и более высоких методах. С практической точки зрения использование компьютера для форматирования исходного кода экономит время, и затем можно без споров применять общеорганизационные стандарты .
Отступ
Стили отступа помогают идентифицировать поток управления и блоки кода. В некоторых языках программирования отступы используются для разграничения логических блоков кода; правильный отступ в этих случаях - это больше, чем вопрос стиля. В других языках отступы и пробелы не влияют на функцию, хотя логические и последовательные отступы делают код более читабельным. Сравнивать:
если ( часы < 24 && минут < 60 && секунд < 60 ) { вернуть истину ; } else { вернуть ложь ; }
или же
если ( часы < 24 && минут < 60 && секунд < 60 ) { вернуть истину ; } else { вернуть ложь ; }
с чем-то вроде
if ( часы < 24 && минут < 60 && секунд < 60 ) { return true ;} else { return false ;}
Первые два примера, вероятно, намного легче читать, потому что они имеют определенный отступ (стиль «висящего абзаца»). Этот стиль отступа особенно полезен при работе с несколькими вложенными конструкциями.
ModuLiq
Стиль ModuLiq с нулевым отступом объединяет символы возврата каретки, а не отступы. Сравните все вышеперечисленное с:
если ( часы < 24 && минут < 60 && секунд < 60 ) вернуть true ;иначе вернет ложь ;
Lua
Lua не использует традиционные фигурные скобки или круглые скобки . Операторы if / else требуют только выражения, за которым следует выражение then
, а закрытие оператора if / else с помощью end
.
если часы < 24 и минуты < 60 и секунды < 60, тогда верните true, иначе верните false end
Отступы необязательны. and
, or
, not
Используются в истинных / ложных показаний.
Это истинные / ложные утверждения, поскольку
печать ( не верно )
будет означать ложь.
Python
Python использует отступ для обозначения управляющих структур, поэтому требуется правильный отступ . Таким образом отпадает необходимость в фигурных скобках (т.е. {
и }
). С другой стороны, копирование и вставка кода Python может привести к проблемам, потому что уровень отступа вставляемого кода может не совпадать с уровнем отступа текущей строки. Такое переформатирование вручную может быть утомительным, но некоторые текстовые редакторы и IDE имеют функции, позволяющие делать это автоматически. Существуют также проблемы, когда код Python становится непригодным для использования при размещении на форуме или веб-странице, которая удаляет пробелы, хотя этой проблемы можно избежать, если можно заключить код в теги, сохраняющие пробелы, такие как "
.. ."(для HTML )," [code] "..." [/ code] "(для bbcode ) и т. д.
если часы < 24 и минуты < 60 и секунды < 60 : вернуть True else : вернуть False
Обратите внимание, что Python использует не фигурные скобки, а обычное двоеточие (например else:
).
Многие программисты Python склонны следовать общепринятому руководству по стилю, известному как PEP8. [1] Существуют инструменты, предназначенные для автоматизации соответствия PEP8.
Haskell
У Haskell также есть правило оффсайда , то есть он имеет двумерный синтаксис, в котором отступы имеют смысл для определения блоков (хотя в альтернативном синтаксисе используются фигурные скобки и точки с запятой). 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:
Функция \ глагол + isValidDate + тест , если дата является действительным \ начать { код } isValidDate :: Дата -> Bool isValidDate дата = чч > = 0 && мм > = 0 && сс > = 0 && чч < 24 && мм < 60 && сс < 60 , где ( чч , мм , сс ) = FromDate дата \ конец { код } заметить , что в этом случае перегружена функция является \ глагол + FromDate :: дата -> ( Int , Int , Int ) +.
И пример с использованием обычного текста:
Функция isValidDate тест , если дата является действительной> isValidDate :: Date -> Bool > isValidDate date = hh > = 0 && mm > = 0 && ss > = 0 > && hh < 24 && mm < 60 && ss < 60 > где ( hh , mm , ss ) = fromDate Датанаблюдать , что в этом случае перегружена функция является FromDate :: Дата -> ( Int , Int , Int ) .
Вертикальное выравнивание
Часто бывает полезно выровнять похожие элементы по вертикали, чтобы сделать ошибки, вызванные опечатками, более очевидными. Сравнивать:
$ search = array ( 'a' , 'b' , 'c' , 'd' , 'e' ); $ поиск = массив ( 'a' , 'b' , 'c' , 'd' , 'e' ); $ замена = массив ( 'foo' , 'bar' , 'baz' , 'quux' );// Другой пример:$ значение = 0 ; $ anothervalue = 1 ; $ stillanothervalue = 2 ;
с участием:
$ search = array ( 'a' , 'b' , 'c' , 'd' , 'e' ); $ поиск = массив ( 'a' , 'b' , 'c' , 'd' , 'e' ); $ замена = массив ( 'foo' , 'bar' , 'baz' , 'quux' );// Другой пример:$ значение = 0 ; $ anothervalue = 1 ; $ stillanothervalue = 2 ;
Последний пример интуитивно проясняет две вещи, которые не были ясны в первом:
- условия поиска и замены связаны и совпадают: они не являются дискретными переменными;
- существует на один критерий поиска больше, чем имеется заменяющих терминов. Если это ошибка, то теперь вероятность ее обнаружения повышается.
Однако учтите, что есть аргументы против вертикального выравнивания:
- Межстрочные ложные зависимости ; табличное форматирование создает зависимости между строками. Например, если идентификатор с длинным именем добавлен в макет таблицы, ширину столбца, возможно, придется увеличить, чтобы разместить его. Это требует большего изменения исходного кода, чем необходимо, и существенное изменение может быть потеряно в шуме. Это вредно для контроля версий, где важно проверять различия между версиями.
- Хрупкость ; если программист не отформатирует таблицу аккуратно при внесении изменений, возможно, законно с учетом предыдущего пункта, результатом станет беспорядок, который ухудшается с дальнейшими такими изменениями. Простые операции рефакторинга, такие как поиск и замена, также могут нарушить форматирование.
- Устойчивость к модификации ; Табличное форматирование требует больше усилий для поддержания. Это может помешать программисту внести полезные изменения, такие как добавление, исправление или улучшение имени идентификатора, потому что это испортит форматирование.
- Использование одинарного шрифта ; табличное форматирование предполагает, что редактор использует шрифт фиксированной ширины. Многие современные редакторы кода поддерживают пропорциональные шрифты, и программист может предпочесть использовать пропорциональный шрифт для удобства чтения.
- Зависимость от инструмента ; Некоторые усилия по поддержанию выравнивания можно облегчить с помощью инструментов (например, редактора исходного кода, который поддерживает эластичные табуляторы ), хотя это создает зависимость от таких инструментов.
Например, если выполнить простую операцию рефакторинга в приведенном выше коде, переименовав переменные «$ replace» в «$ r» и «$ anothervalue» в «$ a», полученный код будет выглядеть следующим образом:
$ search = array ( 'a' , 'b' , 'c' , 'd' , 'e' ); $ поиск = массив ( 'a' , 'b' , 'c' , 'd' , 'e' ); $ r = массив ( 'foo' , 'bar' , 'baz' , 'quux' );// Другой пример:$ значение = 0 ; $ a = 1 ; $ stillanothervalue = 2 ;
Исходное последовательное форматирование по-прежнему будет выглядеть нормально после такого изменения:
$ search = array ( 'a' , 'b' , 'c' , 'd' , 'e' ); $ поиск = массив ( 'a' , 'b' , 'c' , 'd' , 'e' ); $ r = массив ( 'foo' , 'bar' , 'baz' , 'quux' );// Другой пример: $ значение = 0 ; $ a = 1 ; $ stillanothervalue = 2 ;
Пространства
В тех ситуациях, когда требуется некоторое количество пробелов , грамматики большинства языков свободного формата не заботятся о количестве, которое появляется. Стиль, связанный с пустым пространством, обычно используется для повышения удобочитаемости . В настоящее время нет достоверных фактов (выводов исследований) о том, какие из стилей пробелов лучше всего читаются.
Например, сравните следующие синтаксически эквивалентные примеры кода C:
int i ; для ( я = 0 ; я < 10 ; ++ я ) { printf ( "% d" , я * я + я ); }
против
int i ; для ( я = 0 ; я < 10 ; ++ я ) { printf ( "% d" , я * я + я ); }
Вкладки
Использование вкладок для создания пустого пространства создает определенные проблемы, когда не уделяется достаточно внимания, поскольку расположение точки табуляции может быть различным в зависимости от используемых инструментов и даже предпочтений пользователя.
Например, один программист предпочитает четыре позиции табуляции, настроил свой набор инструментов таким образом и использует их для форматирования своего кода.
int ix ; // Индекс для сканирования массива long sum ; // Аккумулятор для суммы
Другой программист предпочитает восемь позиций табуляции, и их набор инструментов настроен таким образом. Когда кто-то другой изучает исходный код человека, он может счесть его трудным для чтения.
int ix ; // Индекс для сканирования массива long sum ; // Аккумулятор для суммы
Одно из широко используемых решений этой проблемы может включать запрет на использование вкладок для выравнивания или правила установки позиций табуляции. Обратите внимание, что вкладки работают нормально при условии, что они используются последовательно, ограничены логическим отступом и не используются для выравнивания:
class MyClass { int foobar ( int qux , // первый параметр int quux ); // второй параметр int foobar2 ( int qux , // первый параметр int quux , // второй параметр int quuux ); // третий параметр };
Смотрите также
Рекомендации
- ^ «PEP 0008 - Руководство по стилю кода Python» . python.org.