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!

David Grudl A web developer since 1999 who now specializes in artificial intelligence. He's the creator of Nette Framework and libraries including Texy!, Tracy, and Latte. He hosts the Tech Guys podcast and covers AI developments on Uměligence. His blog La Trine earned a Magnesia Litera award nomination. He's dedicated to AI education and approaches technology with pragmatic optimism.