За по-малко крещене в кода

преди 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. Преди това enum-ите се имитираха с помощта на константи. Самата документация на PHP за “enum cases” използва PascalCase нотация, както и PHP-FIG или по-ранната експериментална имплементация SplEnum.

Изброяванията са по същество синтактична захар за константи, от гледна точка на PHP няма разлика между „enum case“ и класова константа. И затова комбинирането на PascalCase enum-и и SCREAMING_SNAKE_CASE константи би изглеждало неконсистентно, което е още една причина за промяна на стила на запис на константите.

Как да промените собствения си код?

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

След това ще бъде достатъчно да поставите курсора върху константата, да натиснете Ctrl-F6 (rename) и след това клавишната комбинация за To Pascal Case и PhpStorm ще промени константата в целия проект.

Приятно кодиране!

Последни публикации