Меньше крика в коде

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

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

Традиция использования заглавных букв для констант происходит из языка C, где так обозначались макроконстанты препроцессора. Было полезно заметно отличать код для парсера от кода для препроцессора. 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 не использует.

Перечисления (Enumerations)

PHP 8.1 приносит перечисляемые типы, которые однажды будут использоваться и в Nette. Раньше перечисления имитировались с помощью констант. Сама документация PHP для случаев перечислений (enum cases) использует нотацию PascalCase, также PHP-FIG или более ранняя экспериментальная реализация SplEnum.

Перечисления — это, по сути, синтаксический сахар для констант, с точки зрения PHP нет никакой разницы между «enum case» и константой класса. И поэтому сочетание PascalCase перечислений и SCREAMING_SNAKE_CASE констант выглядело бы неконсистентно, что является еще одной причиной для изменения стиля записи констант.

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

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

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

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

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