Eine Frage des Code-Stils

Kuroko und Code-Stil

Weil übersichtlich

Einrückung. Wer seinen Code nicht einrückt (HTML und CSS mal ausgenommen) gehört geschlagen und dazu verdonnert, sein nächstes Projekt komplett in Python[1] zu schreiben als erzieherische Maßnahme[2]. Ein böses Beispiel:

function foobar( $lorem, $ipsum ) {
	while( $lorem < 42 ) {
	$ipsum++;
	}
	$temp = doSomething();
	if( $temp == $ipsum )
	// Besonderer Bommel
	return 17;
	return 19;
}

Ja, du mich auch. Die beiden return sind besonders hübsch.

function foobar( $lorem, $ipsum ) {
	while( $lorem < 42 ) {
		$ipsum++;
	}
	$temp = doSomething();
	if( $temp == $ipsum )
		// Besonderer Bommel
		return 17;
	return 19;
}

Minimum an Leerzeichen. Mir wird ja gerne vorgehalten, ich übertriebe es mit Leerzeichen. An bestimmten Stellen sollte man aber wirklich, sonst …

function doSomething(){
	$foo='abc123xyz';
	$replace=array('abc','xyz');
	for($i=0;$i<2;$i++){
		$foo=str_replace($replace[$i],'',$foo);
	}
	return 2*$foo+4;
}

Autschen. Zumindest so viel sollte machbar sein, oder?

function doSomething() {
	$foo = 'abc123xyz';
	$replace = array('abc', 'xyz');
	for($i = 0; $i < 2; $i++) {
		$foo = str_replace($replace[$i], '', $foo);
	}
	return 2*$foo + 4;
}

Zeilenumbruch. Optische Abstände im Code helfen, zusammenhängende Blöcke zu erkennen oder schneller den Anfang und das Ende einer Funktion zu erkennen. Deswegen setze ich einen Zeilenumbruch oft nach den Variablendeklarationen und z.B. zwei Zeilenumbrüche zwischen den Funktionen.

/**
* Turns a string into a more URL suitable string.
*/
public static function ProcessString( $string ) {
	$umlaute = array( 'ä', 'ö', 'ü', 'ß' );
	$deumlauted = array( 'ae', 'oe', 'ue', 'ss' );

	$string = strtolower( $string );
	$string = str_ireplace( $umlaute, $deumlauted, $string );

	$string = preg_replace( '!\s|\.|_|:|,|;|/|\\\|\*|%|~|\^!', '-', $string );
	$string = preg_replace( '/[^a-z0-9-\+]/', '', $string );
	$string = preg_replace( '/[-]{2,}/', '-', $string );
	$string = preg_replace( '/^-|-$/', '', $string );

	if( $string == '' ) {
		$string = 'tag-1';
	}

	return $string;
}


/**
 * Another function doing something. You get the drift.
 */
protected function somethingElse() {
…

Keine geschweiften Klammern auslassen. Folgt auf eine Bedingung oder Schleife nur eine Anweisung, kann man die geschweiften Klammern rein technisch auch weglassen. Was hat man davon? Eine Zeile Code gespart? Donnerlütchen, bin ich beeindruckt. Vier Minuten später kommt eine Anweisung hinzu und die Klammern müssen doch gesetzt werden. Und dann vergisst man sie und allES FLIEGT EINEM UM DIE OHREN! BAM!![3] Hier ruht eine potentielle Gefahrenquelle, daher sollte man es sich nicht angewöhnen.

// SO NICHT
function foo() {
	$i = 0;
	while( $i++ < 10 )
		if( $i == 4 )
			bar();
}

// SO
function foo() {
	$i = 0;
	while( $i++ < 10 ) {
		if( $i == 4 ) {
			bar();
		}
	}
}

Weil nach Geschmack

Tabs vs. Spaces. Einrückung mit Tabs oder Leerzeichen. Es gilt nur: Nicht mischen. Danach kann es jeder halten, wie es ihm beliebt. Persönlich bevorzuge ich Tabs:

  • In den meisten Editoren ist die dargestellte Länge eines Tabs einstellbar.
  • Hat man einmal nur einen unfähigen Texteditor zur Hand: Viel Spaß beim Einrücken mit Leerzeichen.

Mein Punkt: Tabs gehen schnell und sind flexibel.

Wohin mit geschweiften Klammern. Zwei Varianten sind weit verbreitet für Funktionen:

function variante1( $a, $b ) {
	if( $a == $b ) {
		return 2 * $a;
	}
	return $a + $b;
}

function variante2( $a, $b )
{
	if( $a == $b ) {
		return 2 * $a;
	}
	return $a + $b;
}

Wie an Variante 2 zu sehen, geht es wirklich nur um die Funktion und die if-Bedingung ist nicht betroffen. Auf der einen Seite ein wenig inkonsequent, andererseits könnte es auch eine gewollte Unterscheidung sein. Ohnehin ist Variante 1 mein Ding.

Doch letztenendes

Über alledem ist vor allem eines empfehlenswert: Einheitlichkeit. Weist Code einen einheitlichen Stil auf, macht ihn das durchgängig lesbarer. Für so etwas existieren Coding Guidelines. Mein persönlicher Stil beruht zum Teil auf jenen von WordPress. Umgekehrt sind mir die Guidelines von Mono ein Graus.

Den angehenden Codern wünsche ich viel Erfolg bei der Suche nach ihrem Stil. Aber seid darauf gefasst, diesen bei späteren Teamarbeiten wieder zurückzustellen. Und auch wenn euch das Kotzen kommt – nie den Code anderer auto-formatieren. Das gibt böses Blut. ;)


[1] In Python gibt es keine geschweiften Klammern um zusammengehörige Anweisungen einzurahmen. Dies funktioniert alles über korrekte Einrückung.

[2] Was keine negative Äußerung gegenüber Python sein soll. Damit soll zum Ausdruck gebracht werden, dass Python in dieser Hinsicht vorbildhaft aufgebaut ist und zu guten Stil zwingt. So, besser Kai? ;)

[3] Uh, ja, ich hatte irgendwann keine Lust mehr weiter zu schreiben, aber wollte den Artikel doch noch zu Ende bringen. So etwas passiert dann.