За менше крику в коді

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 не використовує.

Переліки (Enums)

PHP 8.1 приносить типи переліків, які колись будуть використовуватися і в Nette. Раніше enum'и імітувалися за допомогою констант. Сама документація PHP для “випадків переліку” використовує нотацію PascalCase, так само PHP-FIG або раніша експериментальна реалізація SplEnum.

Переліки є, по суті, синтаксичним цукром для констант, з точки зору PHP немає жодної різниці між «випадком переліку» та константою класу. І тому комбінування PascalCase enum'ів та SCREAMING_SNAKE_CASE констант виглядало б неузгоджено, що є ще однією причиною для зміни стилю запису констант.

Як змінити власний код?

Кожна косметична зміна завжди викликає багато невдоволення. Але якщо ви спробуєте місяць використовувати константи PascalCase, ви будете від них у захваті, і шляху назад не буде. І ви захочете запровадити нову нотацію і у власному коді. Як це зробити? Ідеальним шляхом є перейменування констант у PhpStorm за допомогою функції Refactor > Rename. Встановіть також плагін String Manipulation і призначте йому в налаштуваннях клавішну комбінацію для Switch Case > To Pascal Case.

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

Щасливого кодування!

Останні публікації