Za manj kričanja v kodi

pred 3 leti od David Grudl  

Stil kodiranja Nette je doživel manjšo spremembo: za konstante razredov se zdaj uporablja zapis PascalCase namesto prvotnega SCREAMING_SNAKE_CASE.

Tradicija uporabe velikih črk za konstante izhaja iz jezika C, kjer so bile tako označene tako imenovane makrokonstante predprocesorja. Koristno je bilo, da nismo spregledali razlike med kodo razhroščevalnika in kodo predprocesorja. PHP tega razlikovanja ne potrebuje, saj nima predprocesorja. Po drugi strani pa je pretirano poudarjanje konstant kontraproduktivno. Zakaj bi morala konstanta kričati in opozarjati nase, biti pomemben element v poteku programa? Za to ni nobenega razloga.

Primer prave kode s konstantami SCREAMING_SNAKE_CASE, ki v kodi agresivno izstopajo in jih je tudi težje brati:

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

Primer iste kode s konstantami PascalCase, ki je videti veliko bolj kompaktna:

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

Združljivost

Nette je seveda pozoren na združljivost za nazaj. Vse javne konstante prav tako ostanejo v svoji prvotni obliki in služijo kot vzdevki za prednostne konstante PascalCase. Obstajale bodo tudi v naslednji večji izdaji in bodo imele zastavico @deprecated.

Vse na novo dodane konstante razredov so zdaj samo v različici PascalCase. Globalnih konstant Nette ne uporablja.

Izštevanje

PHP 8.1 ima na voljo naštevanja, ki jih bomo uporabljali tudi v Nette. Številke bodo nadomestile prejšnjo rešitev z uporabo konstant. Kodirnega standarda za to, kako zapisati naštevanja, še ni, organizacija PHP-FIG je v zvezi s tem že dolgo neuspešna in s priporočili prihaja z večletno zamudo. Dokumentacija PHP je sama po sebi vodilo. Za “primere enumov” uporablja izključno zapis PascalCase, kar velja tudi za prejšnjo eksperimentalno implementacijo SplEnum.

Kombinacija naštevanj PascalCase s konstantami SCREAMING_SNAKE_CASE bi bila videti nekonsistentna, zato je tudi to razlog za spremembo sloga zapisovanja konstant.

Tehnična opomba: naštevanja so sintaktični sladkor za konstante, z vidika PHP ni razlike med “enum case” in konstanto razreda.

Kako spremeniti lastno kodo?

Vsaka kozmetična sprememba bo vedno povzročila veliko neodobravanja. Toda če boste en mesec poskušali uporabljati konstante PascalCase, boste nad njimi navdušeni in ne bo več poti nazaj. In nov zapis boste želeli uvesti tudi v svojo lastno kodo. Kako to storiti? Idealen način je preimenovanje konstant v programu PhpStorm z uporabo funkcije Refactor > Rename. Prav tako namestite vtičnik String Manipulation in mu v nastavitvah določite bližnjico za Switch Case > To Pascal Case.

Potem morate le postaviti kurzor na konstanto, pritisniti Ctrl-F6 (preimenovanje) in nato bližnjico za To Pascal Case in PhpStorm bo spremenil konstanto v celotnem projektu.

Srečno kodiranje!