Za manj kričanja v kodi

pred 3 leti od David Grudl  

Coding style Nette doživlja drobno spremembo: za konstante razredov se po novem uporablja notacija PascalCase namesto prvotne SCREAMING_SNAKE_CASE.

Tradicija uporabe velikih črk za konstante izvira iz jezika C, kjer so se tako označevale t.i. makrokonstante predprocesorja. Bilo je koristno nepregledljivo ločiti kodo za parser od kode za predprocesor. PHP te ločitve ne potrebuje, saj predprocesorja nima. Nasprotno pa je prekomerno poudarjanje konstant kontraproduktivno. Zakaj bi morala konstanta kričati in opozarjati nase, biti izstopajoč element v toku programa? Ni razloga za to.

Primer realne kode s SCREAMING_SNAKE_CASE konstantami, ki agresivno izstopajo iz kode in se tudi težje berejo:

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 PascalCase konstantami, ki deluje veliko bolj kompaktno:

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 seveda skrbi za povratno združljivost. Vse javne konstante še naprej ostajajo tudi v prvotni obliki in služijo kot aliasi za preferirane PascalCase konstante. Obstajale bodo tudi v naslednji glavni različici in bodo imele oznako @deprecated.

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

Enumerations

PHP 8.1 prinaša naštevne tipe, ki se bodo nekoč uporabljali tudi v Nette. Prej so se enum-i posnemali s pomočjo konstant. Sama dokumentacija PHP za “enum cases” uporablja PascalCase notacijo, prav tako PHP-FIG ali prejšnja eksperimentalna implementacija SplEnum.

Naštevni tipi so v bistvu sintaktični sladkor za konstante, z vidika PHP ni med „enum case“ in razredno konstanto nobene razlike. In zato bi kombiniranje PascalCase enumov in SCREAMING_SNAKE_CASE konstant izgledalo nekonsistentno, kar je še en razlog za spremembo sloga zapisa konstant.

Kako spremeniti lastno kodo?

Vsaka kozmetična sprememba vedno sproži veliko nejevolje. Ampak če poskusite mesec dni uporabljati PascalCase konstante, boste nad njimi navdušeni in ne bo poti nazaj. In boste želeli uvesti novo notacijo tudi v lastno kodo. Kako na to? Idealna pot je preimenovati konstante v PhpStormu s pomočjo funkcije Refactor > Rename. Namestite si tudi vtičnik String Manipulation in mu v nastavitvah dodelite tipkovno bližnjico za Switch Case > To Pascal Case.

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

Srečno kodiranje!