Pentru mai puține țipete în cod

acum 2 ani De la David Grudl  

Stilul de codare Nette suferă o modificare minoră: pentru constantele de clasă se folosește acum notația PascalCase în locul originalului SCREAMING_SNAKE_CASE.

Tradiția utilizării majusculelor pentru constante provine din limbajul C, unde așa-numitele constante macro de preprocesor erau notate ca atare. Era util să nu se treacă cu vederea distincția dintre codul parser și codul preprocesorului. PHP nu are nevoie de această distincție, deoarece nu are un preprocesor. Pe de altă parte, accentuarea exagerată a constantelor este contraproductivă. De ce ar trebui ca o constantă să strige și să atragă atenția asupra sa, să fie un element proeminent în fluxul programului? Nu există niciun motiv pentru aceasta.

Exemplu de cod real cu constante SCREAMING_SNAKE_CASE care ies agresiv în evidență în cod și sunt, de asemenea, mai greu de citit:

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;
	}
}

Un exemplu al aceluiași cod cu constante PascalCase, care arată mult mai compact:

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;
	}
}

Compatibilitate

Nette este, bineînțeles, atent la compatibilitatea retroactivă. Toate constantele publice rămân, de asemenea, în forma lor originală și servesc ca pseudonime pentru constantele PascalCase preferate. Acestea vor continua să existe și în următoarea versiune majoră și vor avea indicatorul @deprecated.

Toate constantele de clasă nou adăugate sunt acum doar în varianta PascalCase. Constantele globale nu sunt utilizate de Nette.

Enumerări

PHP 8.1 vine cu enumerări, care vor fi utilizate și în Nette. Enumerațiile vor înlocui soluția anterioară care folosea constante. Nu există încă un standard de codare pentru modul de scriere a enumerărilor, organizația PHP-FIG a eșuat de mult timp în această privință și vine cu recomandări cu mulți ani întârziere. Documentația PHP însăși este un ghid. Pentru “enum cases”, aceasta folosește exclusiv notația PascalCase, iar acest lucru este valabil și pentru implementarea experimentală anterioară SplEnum.

Combinarea enumerațiilor PascalCase cu constantele SCREAMING_SNAKE_CASE ar părea incoerentă, deci acesta este, de asemenea, un motiv pentru a schimba stilul de scriere a constantelor.

Nota tehnică: enumerările sunt zahăr sintactic pentru constante, din punctul de vedere al PHP nu există nicio diferență între “enum case” și constanta de clasă.

Cum se modifică codul propriu?

Orice schimbare cosmetică va provoca întotdeauna multe resentimente. Dar dacă încercați să folosiți constantele PascalCase timp de o lună, veți fi încântați de ele și nu veți mai putea da înapoi. Și veți dori să introduceți noua notație și în propriul cod. Cum să faceți acest lucru? Modul ideal este să redenumiți constantele în PhpStorm folosind funcția Refactor > Rename. De asemenea, instalați pluginul String Manipulation și atribuiți-i o scurtătură în setările pentru Switch Case > To Pascal Case.

Apoi, tot ce trebuie să faceți este să plasați cursorul pe constantă, să apăsați Ctrl-F6 (redenumire) și apoi comanda rapidă pentru To Pascal Case și PhpStorm va schimba constanta în tot proiectul.

Codare fericită!