Щоб менше крику в коді

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.

Перерахування

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

Поєднання перерахувань PascalCase з константами SCREAMING_SNAKE_CASE виглядатиме непослідовно, тому це також є причиною для зміни стилю написання констант.

Технічна примітка: перерахування є синтаксичним цукром для констант, з точки зору PHP немає ніякої різниці між “регістром перерахування” і константою класу.

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

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

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

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

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