Mai puțin țipăt în cod

acum 3 ani de David Grudl  

Stilul de codare Nette trece printr-o mică modificare: pentru constantele de clasă se utilizează acum notația PascalCase în locul celei originale SCREAMING_SNAKE_CASE.

Tradiția utilizării literelor mari pentru constante provine din limbajul C, unde astfel se marcau așa-numitele macroconstante ale preprocesorului. Era util să se distingă în mod vizibil codul pentru parser de codul pentru preprocesor. PHP nu are nevoie de această distincție, deoarece nu are preprocesor. Dimpotrivă, evidențierea excesivă a constantelor este contraproductivă. De ce ar trebui o constantă să țipe și să atragă atenția asupra ei, să fie un element proeminent în fluxul programului? Nu există niciun motiv pentru asta.

Exemplu de cod real cu constante SCREAMING_SNAKE_CASE, care ies agresiv în evidență din 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;
	}
}

Exemplu al aceluiași cod cu constante PascalCase, care pare 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, desigur, acordă atenție compatibilității inverse. Toate constantele publice rămân în continuare și în forma originală și servesc ca aliasuri pentru constantele PascalCase preferate. Vor exista și în următoarea versiune majoră și vor avea flag-ul @deprecated.

Toate constantele de clasă nou adăugate sunt deja doar în varianta PascalCase. Nette nu utilizează constante globale.

Enumerări

PHP 8.1 aduce tipuri enumerare, care vor fi utilizate odată și în Nette. Anterior, enum-urile erau imitate folosind constante. Documentația PHP însăși pentru “enum cases”:“enum cases” utilizează notația PascalCase, la fel și PHP-FIG sau implementarea experimentală anterioară SplEnum.

Enumerările sunt, în esență, zahăr sintactic pentru constante, din punctul de vedere al PHP nu există nicio diferență între „enum case” și o constantă de clasă. Și, prin urmare, combinarea enum-urilor PascalCase și a constantelor SCREAMING_SNAKE_CASE ar părea inconsistentă, ceea ce este un alt motiv pentru schimbarea stilului de scriere a constantelor.

Cum să schimbați propriul cod?

Fiecare modificare cosmetică provoacă întotdeauna multă nemulțumire. Dar dacă încercați să utilizați constantele PascalCase timp de o lună, veți fi încântați de ele și nu va mai exista cale de întoarcere. Și veți dori să introduceți noua notație și în propriul cod. Cum să faceți asta? Calea ideală este să redenumiți constantele în PhpStorm folosind funcția Refactor > Rename. Instalați și pluginul String Manipulation și alocați-i în setări o scurtătură de tastatură pentru Switch Case > To Pascal Case.

Apoi va fi suficient să plasați cursorul pe constantă, să apăsați Ctrl-F6 (rename) și apoi scurtătura pentru To Pascal Case, iar PhpStorm va schimba constanta în întregul proiect.

Codare fericită!