Pour moins de cris dans le code

il y a 3 ans par David Grudl  

Le style de codage Nette subit une légère modification : pour les constantes de classe, la notation PascalCase est désormais utilisée à la place de l'ancienne SCREAMING_SNAKE_CASE.

La tradition d'utiliser des majuscules pour les constantes vient du langage C, où les macroconstantes du préprocesseur étaient ainsi désignées. Il était utile de distinguer de manière immanquable le code pour l'analyseur syntaxique du code pour le préprocesseur. PHP n'a pas besoin de cette distinction car il n'a pas de préprocesseur. Au contraire, la mise en évidence excessive des constantes est contre-productive. Pourquoi une constante devrait-elle crier et attirer l'attention sur elle, être un élément saillant dans le flux du programme ? Il n'y a aucune raison à cela.

Exemple de code réel avec des constantes SCREAMING_SNAKE_CASE, qui ressortent agressivement du code et sont également plus difficiles à lire :

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

Exemple du même code avec des constantes PascalCase, qui semble beaucoup plus compact :

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 veille bien sûr à la compatibilité ascendante. Toutes les constantes publiques restent également disponibles dans leur forme originale et servent d'alias pour les constantes PascalCase préférées. Elles existeront également dans la prochaine version majeure et auront l'indicateur @deprecated.

Toutes les nouvelles constantes de classe ajoutées ne sont que dans la variante PascalCase. Nette n'utilise pas de constantes globales.

Énumérations

PHP 8.1 apporte les types énumérés, qui seront un jour également utilisés dans Nette. Auparavant, les énumérations étaient imitées à l'aide de constantes. La documentation PHP elle-même pour les cas d'énumération utilise la notation PascalCase, tout comme PHP-FIG ou l'implémentation expérimentale précédente SplEnum.

Les énumérations sont essentiellement du sucre syntaxique pour les constantes, du point de vue de PHP, il n'y a aucune différence entre un « cas d'énumération » et une constante de classe. C'est pourquoi la combinaison d'énumérations PascalCase et de constantes SCREAMING_SNAKE_CASE semblerait incohérente, ce qui est une autre raison de changer le style d'écriture des constantes.

Comment changer votre propre code ?

Chaque changement cosmétique suscite toujours beaucoup de mécontentement. Mais si vous essayez d'utiliser les constantes PascalCase pendant un mois, vous en serez ravis et il n'y aura pas de retour en arrière possible. Et vous voudrez introduire la nouvelle notation également dans votre propre code. Comment faire ? La voie idéale est de renommer les constantes dans PhpStorm à l'aide de la fonction Refactor > Rename. Installez également le plugin String Manipulation et attribuez-lui dans les paramètres un raccourci clavier pour Switch Case > To Pascal Case.

Il suffira alors de placer le curseur sur la constante, d'appuyer sur Ctrl-F6 (rename) puis sur le raccourci pour To Pascal Case et PhpStorm changera la constante dans tout le projet.

Bon codage !