Por menos gritos no código

há 3 anos De David Grudl  

O estilo de codificação do Nette está passando por uma pequena modificação: para constantes de classe, agora é usada a notação PascalCase em vez da original SCREAMING_SNAKE_CASE.

A tradição de usar letras maiúsculas para constantes vem da linguagem C, onde eram usadas para marcar as chamadas macro constantes do pré-processador. Era útil distinguir de forma inconfundível o código para o parser do código para o pré-processador. O PHP não precisa dessa distinção, pois não tem pré-processador. Pelo contrário, o destaque excessivo das constantes é contraproducente. Por que uma constante deveria gritar e chamar a atenção para si, ser um elemento saliente no fluxo do programa? Não há razão para isso.

Exemplo de código real com constantes SCREAMING_SNAKE_CASE, que se destacam agressivamente do código e também são mais difíceis de ler:

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

Exemplo do mesmo código com constantes PascalCase, que parece muito mais compacto:

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

Compatibilidade

O Nette, claro, zela pela compatibilidade retroativa. Todas as constantes públicas continuam existindo também na forma original e servem como aliases para as constantes PascalCase preferidas. Elas existirão também na próxima versão principal e terão o flag @deprecated.

Todas as constantes de classe recém-adicionadas já estão apenas na variante PascalCase. O Nette não usa constantes globais.

Enumerações

O PHP 8.1 traz tipos enumerados, que um dia também serão usados no Nette. Anteriormente, enums eram imitados usando constantes. A própria documentação do PHP para “enum cases” usa a notação PascalCase, assim como o PHP-FIG ou a implementação experimental anterior SplEnum.

As enumerações são, na verdade, açúcar sintático para constantes; do ponto de vista do PHP, não há diferença entre um “enum case” e uma constante de classe. E, portanto, combinar enums PascalCase e constantes SCREAMING_SNAKE_CASE pareceria inconsistente, o que é outra razão para mudar o estilo de escrita das constantes.

Como alterar seu próprio código?

Qualquer mudança cosmética sempre causa muita relutância. Mas se você tentar usar constantes PascalCase por um mês, ficará encantado com elas e não haverá volta. E você vai querer introduzir a nova notação também no seu próprio código. Como fazer isso? O caminho ideal é renomear as constantes no PhpStorm usando a função Refatorar > Renomear. Instale também o plugin String Manipulation e atribua a ele um atalho de teclado nas configurações para Alternar Caixa > Para Pascal Case.

Então, bastará posicionar o cursor sobre a constante, pressionar Ctrl-F6 (renomear) e, em seguida, o atalho para Para Pascal Case, e o PhpStorm alterará a constante em todo o projeto.

Happy coding!