Flexiblen, erweiterweiterbaren Code schreiben

Guter Code zeichnet sich im Wesentlichen dadurch aus, dass er sich unkompliziert erweitern lässt. Soweit herrscht, denke ich, Konsens. Diesen heiligen Gral der Programmierung haben schon viele versucht zu finden, nicht wenige sind gescheitert. Auf dem Weg da hin sind ganze Paradigmen entstanden und komplizierteste Pattern probiert worden. Dabei kann es so einfach sein. Doch zuerst ein Negativ-Beispiel um es zu verdeutlichen.

<?php

/**
 * recursion till the judgment day
 *
 * @param int $a
 * @param int $b
 * @return never
 */
function ackermann( $a, $b ) {
	$answer = 0;

	if ( 0 == $a )
		$answer = $b + 1;
	elseif ( 0 == $b )
		$answer = ackermann( $a - 1, 1 );
	else
		$answer = ackermann( $a - 1, ackermann( $a, $b - 1 ) );

	return $answer;
}

Die Ackermann-Funktion wird verwendet, um die Anzahl der Atome im Universum zu berechnen. (Achtung die Funktion läuft etwas länger!)

Angenommen, man möchte an der Implementierung nachträglich etwas ändern. In diesem Fall hätte man verloren, da der Code keinerlei Platz lässt für weitere Befehle (außerdem läuft die Funktion höchstwahrscheinlich noch). Auch vor der Funktion wird viel Platz von einem Kommentar vergeudet, der für die Ausführung vollkommen irrelevant ist – er wird vom PHP Parser komplett ignoriert!

Gewöhnt euch das gar nicht erst an, so zu programmieren.

Ich gebe zu, lange Zeit habe ich auch solchen Code geschrieben – aus Unwissenheit. Eines Tages besonn ich mich auf ein Theme, welches ich für eine meiner ersten Kunden debuggen durfte. Da fiel es mir wie Schuppen von den Augen. Der Code war schlicht genial. Diese Perfektion konnte ich als junger Spund natürlich noch nicht erkennen. Ein Beispiel aus diesem Theme:

<?php



class tt_display_box{



	var $runs;

	var $boxname;

	var $placeholder;

	var $prev_image_array;



	function tt_display_box($boxname, $placeholder = array(), $default = 3)

	{	



		if(get_option($boxname.'_count') != "")

		{

			$this->runs = get_option($boxname.'_count');

		}

		else

		{

			$this->runs = $default;

		}

		

		$this->boxname = $boxname;

		$this->placeholder = $placeholder;

		

		

	}

}

Hier haben die Programmierer Weitsicht bewiesen – dieser Code lässt sich wunderbar erweitern! Angenommen, man wollte den Option-Parameter ändern, ginge das hier ohne Probleme, da hier noch eine Zeile Platz ist:

		if(get_option($boxname.'_count') != "")

		{

			$this->runs = get_option($boxname.'_count');
			$this->runs = get_option($boxnabe.'_new_key');
		}

Auf die eingangs vorgestellte Ackermann-Funktion (die läuft vermutlich immer noch) angewendet sähe das dann so aus:

<?php



function ackermann( $a, $b ) {


	$answer = 0;


	if ( 0 == $a )


		$answer = $b + 1;

	elseif ( 0 == $b )


		$answer = ackermann( $a - 1, 1 );


	else


		$answer = ackermann( $a - 1, ackermann( $a, $b - 1 ) );



	return $answer;



}

Zu wissen, wieviel Platz man tatsächlich lässt, bedarf einiges an Erfahrung – auch ich habe das schmerzlich lernen müssen. Als Faustregel kann man folgendes ansetzen: Bei Kundenprojekten, bei denen die Spezifikationen von Beginn an klipp und klar sind (und die immer gut Dokumentiert sind), reichen zwei bis drei Leerzeilen pro Zeile Code. Bei Comunity-Projekten empfehle ich vier bis fünf Leerzeilen. Das Zeigt, dass man keine One-Man-Show aufzieht und wirkt einladend auf potentielle Mitwirkende.

Kommentare

Es wurden noch keine Kommentarte zu diesem Artikel geschrieben.

Fragen, Ideen oder Kritik? – Hier ist Platz dafür!

Dein Kommentar

Um ein Kommentar abzugeben, reicht der Text im Kommentarfeld. Die Angabe eines Namens wäre nett, ist aber nicht erforderlich.

Du darfst folgenden HTML-Code verwenden, musst aber nicht:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>