Aby mniej krzyczeć w kodzie

2 lata temu Ze strony David Grudl  

Styl kodowania Nette przechodzi drobną modyfikację: do stałych klasowych używana jest teraz notacja PascalCase zamiast oryginalnego SCREAMING_SNAKE_CASE.

Tradycja używania wielkich liter dla stałych pochodzi z języka C, gdzie tak oznaczano tzw. stałe makr preprocesora. Było to przydatne, aby nie przeoczyć rozróżnienia między kodem parsera a kodem preprocesora. PHP nie potrzebuje tego rozróżnienia, ponieważ nie posiada preprocesora. Z drugiej strony, nadmierne podkreślanie stałych przynosi efekt przeciwny do zamierzonego. Dlaczego stała ma krzyczeć i zwracać na siebie uwagę, być wyróżniającym się elementem w przepływie programu? Nie ma ku temu żadnego powodu.

Przykład prawdziwego kodu ze stałymi SCREAMING_SNAKE_CASE, które agresywnie wyróżniają się w kodzie, a także są trudniejsze do odczytania:

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 wygląda znacznie bardziej kompaktowo:

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 jest oczywiście ostrożny w kwestii kompatybilności wstecznej. Wszystkie publiczne stałe również pozostają w swojej oryginalnej formie i służą jako aliasy dla preferowanych stałych PascalCase. Będą one nadal istnieć w następnym dużym wydaniu i będą miały flagę @deprecated.

Wszystkie nowo dodane stałe klasowe są teraz tylko w wariancie PascalCase. Stałe globalne nie są używane przez Nette.

Enumeracje

W PHP 8.1 pojawiły się enumy, które będą wykorzystywane również w Nette. Enumy zastąpią dotychczasowe rozwiązanie wykorzystujące stałe. Nie ma jeszcze standardu kodowania jak pisać enumy, organizacja PHP-FIG już dawno zawiodła w tej kwestii i wychodzi z zaleceniami z wieloletnim opóźnieniem. Sama dokumentacja PHP pełni rolę przewodnika. Dla “przypadków enum” używa wyłącznie notacji PascalCase, dotyczy to również wcześniejszej eksperymentalnej implementacji SplEnum.

Łączenie wyliczeń PascalCase ze stałymi SCREAMING_SNAKE_CASE wyglądałoby niespójnie, więc jest to również powód do zmiany stylu pisania stałych.

*Uwaga techniczna: wyliczenia to cukier syntaktyczny dla stałych, z punktu widzenia PHP nie ma różnicy między “enum case” a stałą klasową.

Jak zmienić własny kod?

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

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

Szczęśliwego kodowania!