PHP: Зачем переносить фигурные скобки на новую строку

Источник: «why-curly-brackets-go-on-new-lines»
Фигурная скобка редко используется как знак препинания, но это один из самых распространённых символов в языках программирования.

Это фигурная скобка {.

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

Простой вопрос: должна ли открывающая фигурная скобка переносится на новую строку или нет? Вы можете подумать: это всё личные предпочтения; но я бы сказал: это не так.

Взгляните на этот фрагмент кода:

public function __construct(string $publicDirectory, string $configurationFile, PageParser $pageParser, PageRenderer $pageRenderer) {
// ...
}

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

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

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

Итак, как вытащить полезную информацию левее?

public function __construct(string $publicDirectory,
string $configurationFile,
PageParser $pageParser,
PageRenderer $pageRenderer) {
// ...
}

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

public static function create(string $publicDirectory,
string $configurationFile,
PageParser $pageParser,
PageRenderer $pageRenderer) {
// ...
}

Видите нарушение выравнивания?

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

public function __construct(
string $publicDirectory, string $configurationFile,
PageParser $pageParser, PageRenderer $pageRenderer) {
// ...
}

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

public function __construct(
string $publicDirectory, string $configurationFile,
string $cachePath, PageParser $pageParser,
PageRenderer $pageRenderer) {
// ...
}

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

Итак, давайте продолжим поиск консистенции.

public function __construct(
string $publicDirectory,
string $configurationFile,
PageParser $pageParser,
PageRenderer $pageRenderer) {
$this->publicDirectory = rtrim($publicDirectory, '/');
$this->configurationFile = $configurationFile;
$this->pageParser = $pageParser;
$this->pageRenderer = $pageRenderer;
}

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

Я могу проиллюстрировать это. Давайте заменим все символы в коде на X:

XXXXXX XXXXXXXX __XXXXXXXXX(
XXXXXX XXXXXXXXXXXXXXXX,
XXXXXX XXXXXXXXXXXXXXXXXX,
XXXXXXXXXX XXXXXXXXXXX,
XXXXXXXXXXXX XXXXXXXXXXXXX) {
XXXXXXXXXXXXXXXXXXXXXX = XXXXXXXXXXXXXXXXXXXXXXXXXXXX;
XXXXXXXXXXXXXXXXXXXXXXXX = XXXXXXXXXXXXXXXXXX;
XXXXXXXXXXXXXXXXX = XXXXXXXXXXX;
XXXXXXXXXXXXXXXXXXX = XXXXXXXXXXXXX;
}

Видите как становится трудно определить, где заканчивается список аргументов, и начинается тело метода?

Вы можете сказать: Справа всё ещё есть фигурная скобка, указывающая на конец. Но не в этом наша цель! Мы хотим сохранить более важную информацию слева. Как это решить? Оказывается есть одно верное место, куда можно поставить свои фигурные скобки:

XXXXXX XXXXXXXX __XXXXXXXXX(
XXXXXX XXXXXXXXXXXXXXXX,
XXXXXX XXXXXXXXXXXXXXXXXX,
XXXXXXXXXX XXXXXXXXXXX,
XXXXXXXXXXXX XXXXXXXXXXXXX
) {
XXXXXXXXXXXXXXXXXXXXXX = XXXXXXXXXXXXXXXXXXXXXXXXXXXX;
XXXXXXXXXXXXXXXXXXXXXXXX = XXXXXXXXXXXXXXXXXX;
XXXXXXXXXXXXXXXXX = XXXXXXXXXXX;
XXXXXXXXXXXXXXXXXXX = XXXXXXXXXXXXX;
}

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

public function __construct(
string $publicDirectory,
string $configurationFile,
PageParser $pageParser,
PageRenderer $pageRenderer
) {
$this->publicDirectory = rtrim($publicDirectory, '/');
$this->configurationFile = $configurationFile;
$this->pageParser = $pageParser;
$this->pageRenderer = $pageRenderer;
}

Дополнительные материалы

Предыдущая Статья

JavaScript: Руководство по localStorage

Следующая Статья

XSS: Межсайтовые сценарии