Für weniger Geschrei im Code

vor 2 Jahren von David Grudl  

Der Nette-Kodierungsstil erfährt eine kleine Änderung: die PascalCase-Notation wird nun für Klassenkonstanten anstelle des ursprünglichen SCREAMING_SNAKE_CASE verwendet.

Die Tradition, Konstanten in Großbuchstaben zu schreiben, stammt aus der Sprache C, wo sogenannte Präprozessor-Makro-Konstanten als solche bezeichnet wurden. Es war sinnvoll, die Unterscheidung zwischen Parser-Code und Präprozessor-Code nicht zu übersehen. PHP braucht diese Unterscheidung nicht, da es keinen Präprozessor hat. Andererseits ist eine Überbetonung der Konstanten kontraproduktiv. Warum sollte eine Konstante schreien und die Aufmerksamkeit auf sich ziehen, ein herausragendes Element im Programmablauf sein? Es gibt keinen Grund dafür.

Beispiel für echten Code mit SCREAMING_SNAKE_CASE-Konstanten, die im Code aggressiv hervorstechen und außerdem schwerer 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;
	}
}

Ein Beispiel desselben Codes mit PascalCase-Konstanten, der viel kompakter aussieht:

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 ist natürlich auf Rückwärtskompatibilität bedacht. Alle öffentlichen Konstanten bleiben auch in ihrer ursprünglichen Form erhalten und dienen als Aliase für die bevorzugten PascalCase-Konstanten. Sie werden auch in der nächsten Hauptversion weiterbestehen und das @deprecated Flag haben.

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

Aufzählungen

PHP 8.1 kommt mit Aufzählungen, die auch in Nette verwendet werden. Enums werden die bisherige Lösung mit Konstanten ersetzen. Es gibt noch keinen Standard für die Programmierung von Aufzählungen, die PHP-FIG-Organisation hat in dieser Hinsicht lange versagt und kommt mit ihren Empfehlungen viele Jahre zu spät. Die PHP-Dokumentation selbst ist ein Leitfaden. Sie verwendet für “enum cases” ausschließlich die PascalCase-Notation, und das gilt auch für die frühere experimentelle Implementierung SplEnum.

Die Kombination von PascalCase-Aufzählungen mit SCREAMING_SNAKE_CASE-Konstanten würde inkonsistent aussehen, so dass dies auch ein Grund ist, den Schreibstil für Konstanten zu ändern.

*Technische Anmerkung: Aufzählungen sind syntaktischer Zucker für Konstanten, aus PHP-Sicht gibt es keinen Unterschied zwischen “enum case” und Klassenkonstanten.

Wie kann man den eigenen Code ändern?

Jede kosmetische Änderung wird immer eine Menge Unmut hervorrufen. Aber wenn Sie die PascalCase-Konstanten einen Monat lang ausprobieren, werden Sie begeistert sein und es gibt kein Zurück mehr. Und Sie werden die neue Notation auch in Ihrem eigenen Code einführen wollen. Wie man das macht? Am besten benennen Sie die Konstanten in PhpStorm mit der Funktion Refactor > Rename um. Installieren Sie außerdem das Plugin String Manipulation und weisen Sie ihm einen Shortcut in den Einstellungen für Switch Case > To Pascal Case zu.

Dann müssen Sie nur noch den Cursor auf die Konstante setzen, Ctrl-F6 (Umbenennen) und dann die Verknüpfung für To Pascal Case drücken und PhpStorm ändert die Konstante im gesamten Projekt.

Viel Spaß beim Kodieren!