Kevesebb kiabálás a kódban

3 éve írta David Grudl  

A Nette kódolási stílusa apró módosításon esik át: az osztálykonstansokhoz újonnan a PascalCase jelölést használjuk az eredeti SCREAMING_SNAKE_CASE helyett.

A konstansokhoz használt nagybetűk hagyománya a C nyelvből származik, ahol így jelölték az ún. preprocesszor makrokonstansokat. Hasznos volt feltűnően megkülönböztetni a parsernek szánt kódot a preprocesszornak szánt kódtól. A PHP-nak erre a megkülönböztetésre nincs szüksége, mivel nincs preprocesszora. Ezzel szemben a konstansok túlzott kiemelése kontraproduktív. Miért kellene egy konstansnak kiabálnia és felhívnia magára a figyelmet, kiemelkedő elemnek lennie a program folyamatában? Nincs rá ok.

Példa valós kódra SCREAMING_SNAKE_CASE konstansokkal, amelyek agresszívan kiemelkednek a kódból és nehezebben is olvashatók:

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

Példa ugyanarra a kódra PascalCase konstansokkal, amely sokkal kompaktabbnak tűnik:

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

Kompatibilitás

A Nette természetesen ügyel a visszamenőleges kompatibilitásra. Minden nyilvános konstans továbbra is megmarad az eredeti formájában is, és aliaszként szolgál a preferált PascalCase konstansokhoz. A következő főverzióban is létezni fognak, és @deprecated jelzéssel lesznek ellátva.

Minden újonnan hozzáadott osztálykonstans már csak PascalCase változatban létezik. Globális konstansokat a Nette nem használ.

Enumerációk

A PHP 8.1 bevezeti az enum típusokat, amelyeket egyszer majd a Nette-ben is használni fognak. Korábban az enumokat konstansokkal utánozták. Maga a PHP dokumentáció az “enum case”-ekhez PascalCase jelölést használ, ahogy a PHP-FIG vagy a korábbi kísérleti implementáció, az SplEnum is.

Az enumok lényegében szintaktikai cukorkák a konstansokhoz, a PHP szempontjából nincs különbség az „enum case” és az osztálykonstans között. Ezért a PascalCase enumok és a SCREAMING_SNAKE_CASE konstansok kombinálása következetlennek tűnne, ami egy további ok a konstansok írásmódjának megváltoztatására.

Hogyan változtassuk meg a saját kódunkat?

Minden kozmetikai változás mindig sok ellenérzést vált ki. De ha egy hónapig kipróbálja a PascalCase konstansokat, le lesz nyűgözve tőlük, és nem lesz visszaút. És be akarja majd vezetni az új jelölést a saját kódjába is. Hogyan tegye? Az ideális út az, ha átnevezi a konstansokat a PhpStormban a Refactor > Rename funkcióval. Telepítse a String Manipulation plugint is, és rendeljen hozzá egy billentyűparancsot a beállításokban a Switch Case > To Pascal Case funkcióhoz.

Ezután elég a kurzort a konstansra helyezni, megnyomni a Ctrl-F6 (rename) billentyűt, majd a To Pascal Case billentyűparancsot, és a PhpStorm megváltoztatja a konstanst az egész projektben.

Boldog kódolást!