Чтобы меньше кричать в коде

2 года назад от David Grudl  

Стиль кодирования Nette претерпел небольшое изменение: теперь для констант классов используется нотация PascalCase вместо первоначальной SCREAMING_SNAKE_CASE.

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

Пример реального кода с константами SCREAMING_SNAKE_CASE, которые агрессивно выделяются в коде, а также труднее читаются:

foreach (self::SYMBOL_TO_NAME as $symbol => $name) {
	$idx = self::ACTION_BASE[$state] + $symbol;
	if (($idx >= 0 && $idx < count(self::ACTION) && self::ACTION_CHECK[$idx] === $symbol
			|| $state < self::YY_2_TBLSTATE
			&& ($idx = self::ACTION_BASE[$state + self::NUM_NON_LEAF_STATES] + $symbol) >= 0
			&& $idx < count(self::ACTION) && self::ACTION_CHECK[$idx] === $symbol)
		&& self::ACTION[$idx] !== self::UNEXPECTED_TOKEN_RULE
		&& self::ACTION[$idx] !== self::DEFAULT_ACTION
		&& $symbol === 0
	) {
		return true;
	}
}

Пример того же кода с константами PascalCase, который выглядит гораздо компактнее:

foreach (self::SymbolToName as $symbol => $name) {
	$idx = self::ActionBase[$state] + $symbol;
	if (($idx >= 0 && $idx < count(self::Action) && self::ActionCheck[$idx] === $symbol
			|| $state < self::Yy2Tblstate
			&& ($idx = self::ActionBase[$state + self::NumNonLeafStates] + $symbol) >= 0
			&& $idx < count(self::Action) && self::ActionCheck[$idx] === $symbol)
		&& self::Action[$idx] !== self::UnexpectedTokenRule
		&& self::Action[$idx] !== self::DefaultAction
		&& $symbol === 0
	) {
		return true;
	}
}

Совместимость

Nette, конечно же, заботится об обратной совместимости. Все публичные константы также остаются в своем первоначальном виде и служат псевдонимами для предпочтительных констант PascalCase. Они продолжат свое существование в следующем основном выпуске и будут иметь флаг @deprecated.

Все вновь добавленные константы классов теперь имеют только вариант PascalCase. Глобальные константы не используются Nette.

Перечисления

PHP 8.1 поставляется с перечислениями, которые будут использоваться и в Nette. Перечисления заменят предыдущее решение с использованием констант. Стандарта кодирования для написания перечислений пока не существует, организация PHP-FIG давно потерпела неудачу в этом вопросе, и рекомендации появляются с опозданием на много лет. Сама документация PHP является руководством. Для “случаев перечисления” в ней используется исключительно нотация PascalCase, и это также относится к более ранней экспериментальной реализации SplEnum.

Сочетание перечислений PascalCase с константами SCREAMING_SNAKE_CASE будет выглядеть непоследовательно, так что это тоже причина изменить стиль написания констант.

Техническое примечание: перечисления – это синтаксический сахар для констант, с точки зрения PHP нет никакой разницы между “enum case” и константой класса.

Как изменить собственный код?

Любое косметическое изменение всегда вызовет массу недовольства. Но если вы попробуете использовать константы PascalCase в течение месяца, вы будете в восторге от них, и пути назад уже не будет. И вы захотите ввести новую нотацию и в свой собственный код. Как это сделать? Идеальный способ – переименовать константы в PhpStorm с помощью функции Refactor > Rename. Также установите плагин String Manipulation и назначьте ему ярлык в настройках для Switch Case > To Pascal Case.

После этого достаточно установить курсор на константу, нажать Ctrl-F6 (переименовать), а затем ярлык для To Pascal Case, и PhpStorm изменит константу во всем проекте.

Счастливого кодирования!

Последние сообщения