Kevesebb sikolyért a kódban

2 éve A címről David Grudl  

A Nette kódolási stílusa egy kisebb módosításon megy keresztül: az osztálykonstansoknál az eredeti SCREAMING_SNAKE_CASE helyett a PascalCase jelölést használjuk.

A nagybetűs konstansok használatának hagyománya a C nyelvből származik, ahol az úgynevezett preprocesszor makró konstansokat így jelölték. Hasznos volt, hogy ne hagyjuk figyelmen kívül a különbséget a parser kód és a preprocesszor kód között. A PHP-nek nincs szüksége erre a megkülönböztetésre, mivel nincs preprocesszora. Másrészt a konstansok túlhangsúlyozása kontraproduktív. Miért kellene egy konstansnak kiabálnia és felhívnia magára a figyelmet, kiemelkedő elemnek lennie a programfolyamatban? Nincs rá semmi ok.

Példa valódi 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;
	}
}

PascalCase konstansokkal, ami sokkal tömörebbnek 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 visszafelé kompatibilitásra. Minden nyilvános konstans is megmarad eredeti formájában, és a PascalCase preferált konstansok aliasaként szolgál. Ezek a következő nagyobb kiadásban is létezni fognak, és a @deprecated flaggel lesznek ellátva.

Minden újonnan hozzáadott osztálykonstans mostantól csak a PascalCase változatban van. A globális konstansokat a Nette nem használja.

Felsorolások

A PHP 8.1 enumerációkkal érkezik, amelyeket a Nette-ben is használni fogunk. Az enumerációk felváltják a korábbi, konstansokat használó megoldást. Még nincs kódolási szabvány arra, hogy hogyan kell enumerációkat írni, a PHP-FIG szervezet már régóta kudarcot vallott e tekintetben, és sok év késéssel áll elő ajánlásokkal. Maga a PHP dokumentáció egy útmutató. Az “enum esetekre” kizárólag PascalCase jelölést használ, és ez vonatkozik a korábbi kísérleti SplEnum implementációra is.

A PascalCase enumerációk és a SCREAMING_SNAKE_CASE konstansok kombinálása következetlenül nézne ki, így ez is egy ok arra, hogy a konstansok írásmódját megváltoztassuk.

*Technikai megjegyzés: a felsorolások szintaktikai cukrot jelentenek a konstansok számára, PHP szempontból nincs különbség az “enum case” és az osztálykonstans között.

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

Bármilyen kozmetikai változtatás mindig sok neheztelést fog okozni. De ha egy hónapig kipróbálod a PascalCase konstansok használatát, el leszel ragadtatva tőlük, és nem lesz visszaút. És a saját kódodba is be akarod majd vezetni az új jelölést. Hogyan kell ezt megtenni? Az ideális megoldás az, ha átnevezzük a konstansokat a PhpStormban a Refactor > Rename függvény segítségével. Továbbá telepítsd a String Manipulation nevű plugint, és rendelj hozzá egy parancsikont a Switch Case > To Pascal Case beállításaiban.

Ezután csak annyit kell tennie, hogy a kurzort a konstansra helyezi, megnyomja a Ctrl-F6 (átnevezés) gombot, majd a To Pascal Case parancsikonját, és a PhpStorm az egész projektben megváltoztatja a konstanst.

Boldog kódolást!