Für weniger Schreien im Code

vor 3 Jahren von David Grudl  

Der Nette Coding Style erfährt eine kleine Anpassung: Für Klassenkonstanten wird neu die PascalCase-Notation anstelle der ursprünglichen SCREAMING_SNAKE_CASE verwendet.

Die Tradition der Verwendung von Großbuchstaben für Konstanten stammt aus der Sprache C, wo damit sogenannte Makrokonstanten des Präprozessors gekennzeichnet wurden. Es war nützlich, den Code für den Parser unübersehbar vom Code für den Präprozessor zu unterscheiden. PHP benötigt diese Unterscheidung nicht, da es keinen Präprozessor hat. Im Gegenteil, die übermäßige Hervorhebung von Konstanten ist kontraproduktiv. Warum sollte eine Konstante schreien und auf sich aufmerksam machen, ein hervorstechendes Element im Programmfluss sein? Es gibt keinen Grund dafür.

Beispiel für realen Code mit SCREAMING_SNAKE_CASE-Konstanten, die aggressiv aus dem Code herausstechen und auch schlechter zu lesen sind:

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

Beispiel desselben Codes mit PascalCase-Konstanten, der wesentlich kompakter wirkt:

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

Kompatibilität

Nette achtet selbstverständlich auf Abwärtskompatibilität. Alle öffentlichen Konstanten bleiben weiterhin auch in der ursprünglichen Form erhalten und dienen als Aliase für die bevorzugten PascalCase-Konstanten. Sie werden auch in der nächsten Major-Version existieren und das @deprecated-Flag tragen.

Alle neu hinzugefügten Klassenkonstanten gibt es nur noch in der PascalCase-Variante. Globale Konstanten verwendet Nette nicht.

Enumerations

PHP 8.1 bringt Enum-Typen, die eines Tages auch in Nette verwendet werden. Früher wurden Enums mithilfe von Konstanten nachgebildet. Die PHP-Dokumentation selbst verwendet für “enum cases” die PascalCase-Notation, ebenso PHP-FIG oder die frühere experimentelle Implementierung SplEnum.

Enums sind im Grunde syntaktischer Zucker für Konstanten, aus PHP-Sicht gibt es keinen Unterschied zwischen einem „enum case“ und einer Klassenkonstante. Daher würde die Kombination von PascalCase-Enums und SCREAMING_SNAKE_CASE-Konstanten inkonsistent aussehen, was ein weiterer Grund für die Änderung des Schreibstils von Konstanten ist.

Wie ändert man den eigenen Code?

Jede kosmetische Änderung löst immer viel Unmut aus. Aber wenn Sie versuchen, einen Monat lang PascalCase-Konstanten zu verwenden, werden Sie begeistert sein und es wird kein Zurück mehr geben. Und Sie werden die neue Notation auch in Ihrem eigenen Code einführen wollen. Wie geht das? Der ideale Weg ist, die Konstanten in PhpStorm mit der Funktion Refactor > Rename umzubenennen. Installieren Sie auch das Plugin String Manipulation und weisen Sie ihm in den Einstellungen eine Tastenkombination für Switch Case > To Pascal Case zu.

Dann genügt es, den Cursor auf die Konstante zu setzen, Strg-F6 (rename) und anschließend die Tastenkombination für To Pascal Case zu drücken, und PhpStorm ändert die Konstante im gesamten Projekt.

Happy coding!