Meno urla nel codice

3 anni fa Da David Grudl  

Lo stile di codifica di Nette sta subendo una piccola modifica: per le costanti di classe viene ora utilizzata la notazione PascalCase invece della precedente SCREAMING_SNAKE_CASE.

La tradizione di utilizzare lettere maiuscole per le costanti deriva dal linguaggio C, dove venivano così contrassegnate le cosiddette macro costanti del preprocessore. Era utile distinguere in modo inconfondibile il codice per il parser dal codice per il preprocessore. PHP non ha bisogno di questa distinzione poiché non ha un preprocessore. Al contrario, l'eccessiva evidenziazione delle costanti è controproducente. Perché una costante dovrebbe urlare e attirare l'attenzione su di sé, essere un elemento sporgente nel flusso del programma? Non c'è motivo.

Esempio di codice reale con costanti SCREAMING_SNAKE_CASE, che sporgono aggressivamente dal codice e sono anche più difficili da leggere:

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

Esempio dello stesso codice con costanti PascalCase, che appare molto più compatto:

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

Compatibilità

Nette ovviamente si preoccupa della retrocompatibilità. Tutte le costanti pubbliche continuano a rimanere anche nella forma originale e servono come alias per le costanti PascalCase preferite. Esisteranno anche nella prossima versione major e avranno il flag @deprecated.

Tutte le costanti di classe appena aggiunte sono già solo nella variante PascalCase. Nette non utilizza costanti globali.

Enumerations

PHP 8.1 introduce i tipi enumerati, che un giorno verranno utilizzati anche in Nette. In precedenza, gli enum venivano imitati tramite costanti. La stessa documentazione PHP per gli “enum cases” utilizza la notazione PascalCase, così come PHP-FIG o l'implementazione sperimentale precedente SplEnum.

Gli enum sono essenzialmente zucchero sintattico per le costanti, dal punto di vista di PHP non c'è differenza tra un “enum case” e una costante di classe. E quindi combinare enum PascalCase e costanti SCREAMING_SNAKE_CASE apparirebbe incoerente, il che è un'altra ragione per cambiare lo stile di scrittura delle costanti.

Come cambiare il proprio codice?

Ogni cambiamento cosmetico suscita sempre molto malcontento. Ma se provate a usare le costanti PascalCase per un mese, ne sarete entusiasti e non ci sarà modo di tornare indietro. E vorrete introdurre la nuova notazione anche nel vostro codice. Come fare? Il modo ideale è rinominare le costanti in PhpStorm usando la funzione Refactor > Rename. Installate anche il plugin String Manipulation e assegnategli nelle impostazioni una scorciatoia da tastiera per Switch Case > To Pascal Case.

Poi basterà posizionare il cursore sulla costante, premere Ctrl-F6 (rename) e successivamente la scorciatoia per To Pascal Case e PhpStorm cambierà la costante nell'intero progetto.

Happy coding!