Mniej krzyku w kodzie

3 lata temu przez David Grudl  

Styl kodowania Nette przechodzi drobną modyfikację: dla stałych klasowych nowo używana jest notacja PascalCase zamiast pierwotnej SCREAMING_SNAKE_CASE.

Tradycja używania wielkich liter dla stałych pochodzi z języka C, gdzie w ten sposób oznaczano tzw. makrostałe preprocesora. Było użyteczne nieprzegapialne odróżnienie kodu dla parsera od kodu dla preprocesora. PHP tego rozróżnienia nie potrzebuje, ponieważ nie ma preprocesora. Wręcz przeciwnie, zbyt duże wyróżnienie stałych jest kontrproduktywne. Dlaczego stała miałaby krzyczeć i zwracać na siebie uwagę, być wyróżniającym się elementem w przepływie programu? Nie ma ku temu powodu.

Przykład rzeczywistego kodu ze stałymi SCREAMING_SNAKE_CASE, które agresywnie wyróżniają się z kodu i również gorzej się czytają:

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

Przykład tego samego kodu ze stałymi PascalCase, który wydaje się znacznie bardziej zwarty:

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

Kompatybilność

Nette oczywiście dba o kompatybilność wsteczną. Wszystkie publiczne stałe nadal pozostają również w pierwotnej formie i służą jako aliasy dla preferowanych stałych PascalCase. Będą istnieć również w następnej wersji major i będą miały flagę @deprecated.

Wszystkie nowo dodane stałe klasowe są już tylko w wariancie PascalCase. Stałych globalnych Nette nie używa.

Wyliczenia (Enumy)

PHP 8.1 wprowadza typy wyliczeniowe, które będą kiedyś używane również w Nette. Wcześniej enumy naśladowano za pomocą stałych. Sama dokumentacja PHP dla “enum cases” używa notacji PascalCase, podobnie jak PHP-FIG czy wcześniejsza eksperymentalna implementacja SplEnum.

Wyliczenia są w zasadzie cukrem syntaktycznym dla stałych, z punktu widzenia PHP nie ma żadnej różnicy między „enum case” a stałą klasową. Dlatego łączenie enumów PascalCase i stałych SCREAMING_SNAKE_CASE wyglądałoby niespójnie, co jest kolejnym powodem zmiany stylu zapisu stałych.

Jak zmienić własny kod?

Każda kosmetyczna zmiana zawsze wywołuje wiele niechęci. Ale jeśli spróbujesz przez miesiąc używać stałych PascalCase, będziesz nimi zachwycony i nie będzie powrotu. I będziesz chciał wprowadzić nową notację również do własnego kodu. Jak to zrobić? Idealnym sposobem jest zmiana nazw stałych w PhpStorm za pomocą funkcji Refactor > Rename. Zainstaluj również wtyczkę String Manipulation i przypisz jej w ustawieniach skrót klawiszowy dla Switch Case > To Pascal Case.

Wtedy wystarczy umieścić kursor na stałej, nacisnąć Ctrl-F6 (rename), a następnie skrót dla To Pascal Case i PhpStorm zmieni stałą w całym projekcie.

Happy coding!