Per non urlare 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 dell'originale SCREAMING_SNAKE_CASE.

La tradizione di usare le lettere maiuscole per le costanti deriva dal linguaggio C, dove le cosiddette macro costanti del preprocessore erano indicate come tali. Era utile non trascurare la distinzione tra codice del parser e codice del preprocessore. PHP non ha bisogno di questa distinzione, poiché non ha un preprocessore. D'altra parte, enfatizzare eccessivamente le costanti è controproducente. Perché una costante dovrebbe gridare e attirare l'attenzione su di sé, essere un elemento di spicco nel flusso del programma? Non c'è alcun motivo per farlo.

Esempio di codice reale con costanti SCREAMING_SNAKE_CASE che spiccano in modo aggressivo nel 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;
	}
}

Un esempio dello stesso codice con le 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 è naturalmente attento alla compatibilità all'indietro. Anche tutte le costanti pubbliche rimangono nella loro forma originale e servono come alias per le costanti PascalCase preferite. Continueranno a esistere nella prossima major release e avranno il flag @deprecated.

Tutte le costanti di classe aggiunte di recente sono ora solo nella variante PascalCase. Le costanti globali non sono utilizzate da Nette.

Enumerazioni

PHP 8.1 è dotato di enumerazioni, che saranno utilizzate anche in Nette. Le enumerazioni sostituiranno la precedente soluzione delle costanti. Non esiste ancora uno standard di codifica per la scrittura delle enumerazioni; l'organizzazione PHP-FIG ha fallito da tempo in questo senso e propone raccomandazioni con molti anni di ritardo. La stessa documentazione di PHP è una guida. Per i “casi enum”, utilizza esclusivamente la notazione PascalCase, e questo vale anche per la precedente implementazione sperimentale SplEnum.

Combinare le enumerazioni in PascalCase con le costanti SCREAMING_SNAKE_CASE sarebbe incoerente, quindi anche questo è un motivo per cambiare lo stile di scrittura delle costanti.

Nota tecnica: le enumerazioni sono uno zucchero sintattico per le costanti, dal punto di vista di PHP non c'è differenza tra “enum case” e costante di classe.

Come modificare il proprio codice?

Qualsiasi cambiamento estetico causerà sempre molto risentimento. Ma se provate a usare le costanti PascalCase per un mese, ne sarete entusiasti e non potrete più tornare indietro. E vorrete introdurre la nuova notazione anche nel vostro codice. Come fare? Il modo ideale è rinominare le costanti in PhpStorm utilizzando la funzione Refactor > Rename. Inoltre, installate il plugin String Manipulation e assegnategli una scorciatoia nelle impostazioni di Switch Case > To Pascal Case.

A questo punto basta posizionare il cursore sulla costante, premere Ctrl-F6 (rinominare) e poi la scorciatoia per To Pascal Case e PhpStorm cambierà la costante in tutto il progetto.

Buona codifica!