K-энд-Р дизайн в разработке ПО¶
K-энд-Р дизайн (от англ. K&R style, Kernighan and Ritchie style) — стиль оформления исходного кода в программировании, при котором открывающая фигурная скобка блока остаётся на той же строке, что и управляющая конструкция, а закрывающая выносится на отдельную строку. Название происходит от фамилий Брайана Кернигана и Денниса Ритчи, авторов языка C и классического руководства «The C Programming Language» (1978), где этот стиль использовался последовательно. K-энд-Р относится к группе так называемых «египетских скобок» (Egyptian brackets) и является одним из самых распространённых способов форматирования в языках семейства C.
¶Происхождение
Стиль сформировался в Bell Labs в 1970-х годах при разработке операционной системы UNIX и языка C. Брайан Керниган и Деннис Ритчи применяли компактную запись блоков, при которой скобка не занимает отдельную строку. Это позволяло экономить вертикальное пространство на терминалах с ограниченным числом строк (обычно 24) и уменьшать объём распечаток листингов.
Название «K&R» закрепилось после выхода первого издания книги «The C Programming Language», ставшей де-факто стандартом описания языка. Позднее стиль был формализован в утилите indent, входившей в состав UNIX, и в руководствах по стилю крупных проектов.
¶Синтаксис и пример
В классическом виде K-энд-Р записывается так:
`` if (x > 0) { printf("positive"); } else { printf("non-positive"); } ``
Ключевые признаки:
- открывающая скобка
{— на строке сif,for,while,switch, именем функции; - тело блока — с отступом (обычно 4 или 8 пробелов);
- закрывающая скобка
}— на отдельной строке, на уровне управляющей конструкции; else— на строке с закрывающей скобкой предыдущего блока.
Для функций в оригинальном K&R скобка также оставалась на строке заголовка, что отличает стиль от варианта «1TBS» (one true brace style), где это правило распространяется только на управляющие конструкции.
¶Разновидности и родственные стили
| Стиль | Положение { | Примечание |
|---|---|---|
| K&R | на строке конструкции | классический вариант |
| Allman | на новой строке | распространён в C++, C# |
| GNU | на новой строке, отступ тела +2 | стандарт проекта GNU |
| 1TBS | на строке конструкции | вариант K&R, принятый в ядре Linux |
| Whitesmiths | на новой строке с отступом | редко используется |
Близким к K-энд-Р является стиль, принятый в ядре Linux: Линус Торвальдс закрепил его в документе CodingStyle, где открывающая скобка ставится на строку конструкции, а отступ равен восьми пробелам (табуляции).
¶Применение
K-энд-Р и его производные широко используются в системном программировании. Среди проектов, придерживающихся этого стиля или его вариантов:
- ядро Linux;
- исходный код языков и утилит BSD;
- проекты на Java (соглашение Sun/Oracle близко к K&R);
- код на JavaScript в ряде руководств по стилю;
- Go — язык, где форматирование принудительно приводится утилитой gofmt к варианту с открывающей скобкой на строке конструкции.
В языке Go требование размещать { на строке управляющей конструкции закреплено на уровне синтаксиса: перенос скобки на новую строку приводит к ошибке компиляции из-за автоматической вставки точки с запятой.
¶Преимущества и недостатки
Сторонники стиля отмечают компактность: код занимает меньше строк, блоки визуально плотнее, а связь между условием и телом более очевидна. Экономия вертикального пространства особенно заметна в длинных вложенных конструкциях.
Противники указывают на трудность визуального поиска парных скобок при беглом чтении и на то, что при переносе длинного условия скобка может оказаться далеко от начала конструкции. В сообществах, где принят стиль Олмана (Allman), K-энд-Р считается менее читаемым.
¶Инструменты и автоматизация
Форматирование кода редко выполняется вручную. Для приведения исходников к выбранному стилю применяются:
- indent (UNIX) — историческая утилита с опцией
-kr; - clang-format — поддерживает предустановленные стили, включая
LLVM,Google,Mozilla, близкие к K&R; - astyle (Artistic Style) — с режимом
--style=kr; - gofmt — обязательное форматирование для Go;
- редакторы и IDE (Vim, Emacs, Visual Studio Code) с настраиваемыми правилами отступов.
Автоматическое форматирование снижает разногласия в командах и упрощает чтение диффов в системах контроля версий.
¶Значение
K-энд-Р дизайн стал одним из первых массово закреплённых стилей оформления кода и повлиял на большинство последующих соглашений. Практически все современные форматтеры предлагают режим, воспроизводящий K&R, а многие языки и проекты используют его как основной или единственный допустимый. Термин вошёл в профессиональный жаргон программистов наряду с обозначениями других стилей — Allman, GNU, 1TBS.
Источники: Б. Керниган, Д. Ритчи «Язык программирования C»; документация GNU indent; Linux Kernel CodingStyle; документация clang-format и Artistic Style; спецификация языка Go.