Tabs vs. Spaces > Einrückungen in der Programmierung

Dabei sind sich alle Entwickler einig: Einrückungen halten den Programmcode leserlich und übersichtlich. Dennoch gibt es hier einen großen Streitpunkt: Welches Steuerzeichen soll zur Einrückung verwendet werden? Manche halten es für eine Philosophie ähnlich wie der Kampf Mac vs. Linux vs. Windows, oder TYPO3 vs. Drupal, oder auch Einfache vs. Doppelte Anführungszeichen bei Strings. Bei dem Thema Tabulator vs. Leerzeichen sehe ich es allerdings anders.

Das größte Argument für die Verwendung des Leerzeichens als Einrückung war immer, dass es universell auf allen System gleich dargestellt wird. Wenn man eine Textdatei mit 4 Spaces speichert, sieht die Datei unter Mac, unter Windows oder unter jedem anderen Betriebssystem und in jedem Texteditor immer gleich aus. Ein Argument, das für viele Entwickler die Diskussion an dieser Stelle beendet. ABER: Wer so denkt, lebt immer noch in der Vergangenheit. Wir haben inzwischen nicht mehr 1999, sondern 2012. Das Tab-Zeichen ist auf den meisten Systemen vereinheitlich worden und viele moderne Editoren und Entwicklungsumgebungen lassen sich problemlos umkonfigurieren. Damit wäre das größte Argument für die Verwendung von Spaces neutralisiert.

Das sind die Vorteile von Tabs:

  • Ein Tab ist nur ein einziges Steuerzeichen.
    Durch Tabs werden die Dateigrößen reduziert, weil eine Einrückung nur noch ein Zeichen lang ist statt 4 Leerzeichen.
  • Schneller durch den Code navigieren.
    Der Cursor springt schneller über ein Tab, als über 4 Leerzeichen.
  • Einheitliche Länge der Einrückung.
    Ein Tab ist in der Regel exakt 4 Leerzeichen lang. Die Länge der Einrückungen bei Leerzeichen variiert dagegen abhängig vom Entwickler und dem verwendeten Editor.

Bei Einrückungen mit Leerzeichen hat sich inzwischen ein bunter Strauß verschiedener Längen gebildet. Der eine verwendet 2 Leerzeichen ein anderer dagegen 4. Und der dritte übersieht beim Überarbeiten des Codes ein Leerzeichen oder schreibt eins zu viel und schon ist das Chaos perfekt. Bei Tabs hingegen sieht man solche Fehler wesentlich schneller.

Ich hoffe ich konnte einige ältere Programmierer davon überzeugen endlich auf Tabs umzusteigen. Es ist einfach die saubere, schnellere und weniger Fehleranfällige Variante zum Einrücken. Wer also die Möglichkeit hat und modern arbeiten möchte, kommt an Tabs einfach nicht mehr vorbei. Auf kurz oder lang werden sich Tabs gegenüber Spaces durchsetzen.

Dependency Injection – kurz erklärt

Dependency Injection – klingt nach professioneller Programmierung. Aber was ist das eigentlich?
Wenn man nach Dependency Injection sucht, gibt es fast ausschließlich komplexe Erklärungen, die man nicht auf Anhieb versteht. Deshalb gibt es an dieser Stelle eine möglichst einfache Erläuterung von Dependency Injection in PHP.

Nehmen wir einmal an wir haben eine Klasse Gästebuch, die beim instanziieren ein Datenbank-Objekt erwartet.

class Guestbook
{
    /**
     * @var DatabaseDriver
     */
    protected $db;
 
    public function __construct(DatabaseDriver $db)
    {
        $this->db = $db;
    }
}

Jetzt ist es aber aufwendig bei jeder Erzeugung eines neuen Gästebuchs das Datenbank-Objekt zu übergeben, vor allem weil die Datenbank bei allen Gästebüchern die gleiche ist. Also wurde das Entwurfsmuster Dependency Injection entwickelt, das dieses Vorgehen vereinfachen soll.

class Guestbook
{
    /**
     * @var DatabaseDriver
     * @inject
     */
    protected $db;
 
    public function __construct()
    {
        $result = $this->db->query("SELECT * FROM guestbook");
        ...
    }
}

Dieses Beispiel funktioniert natürlich nicht ohne Weiteres, es zeigt aber die Idee hinter DI. Durch zum Beispiel die Angabe der Annotation @inject wird angezeigt, dass die Datenbank noch vor der Instanziierung von Guestbook eingefügt werden soll und wir damit quasi sofort arbeiten können.

In PHP gibt es diverse Frameworks, die das DI-Entwurfsmuster bereits implementieren. Dazu gehören unter anderem FLOW3, Zend Framework 2 und Symfony 2, aber eine wirklich saubere Lösung ist meiner Meinung nach noch nicht dabei. Bei FLOW3 beispielsweise werden die eigentlichen Klassen durch Fake-Klassen „überschrieben“, in denen dann das Inject vollzogen wird.
Wer DI also nutzen will, braucht in jedem Fall eine Logik, die das Inject überhaupt ausführt. Ohne Framework keine leichte Aufgabe.

FLOW3: Erster Eindruck

Da ich aktuell an einer kleinen FLOW3(-Übungs)-Anwendung arbeite, wollte ich einfach mal meine ersten Eindrücke aufschreiben.

Als erstes ist zu sagen, dass FLOW3 so ziemlich das sauberste Framework ist, das ich je gesehen habe. Die komplette Architektur ist durchdesigned und hat ein klares Konzept: Der eigene Code soll so klein wie möglich ausfallen.
Mit Hilfe des Kickstarters nimmt einem das Framework die langweilige Schreibarbeit beim Anlegen von Model, Controller und Templates ab.
Außerdem kommen viele moderne Design Patterns wie Dependency Injection, Domain Driven Design oder Aspekt Orientierte Programmierung zum Einsatz. Mit Doctrine wurde zudem auf ein solides ORM gesetzt.

Klingt im ersten Moment alles super, aber man merkt, dass FLOW3 noch sehr jung ist. Einfache Dinge wie Datensätze anlegen, bearbeiten, löschen sind erschreckend schnell gemacht (dank Kickstarter), aber sobald man etwas spezielleres braucht, ist es schwierig an Beispiele und Informationen zu kommen. In der Dokumentation fehlen viele Bereiche oder sind noch nicht optimal beschrieben. Daneben gibt es als Informationsquelle nur noch eine Mailinglist und vereinzelte Blog-Artikel, die zum Teil aber nicht mehr mit der neusten FLOW3-Version kompatibel sind.
Ein weiterer Nachteil ist aus meiner Sicht die Geschwindigkeit. Der erste Aufruf ist besonders langsam, weil der Cache erstmal aufgebaut werden muss – das lässt sich aber noch verkraften. Aber auch alle anschließenden Aufrufe sind für meinen Geschmack noch zu langsam. Hier wurde allerdings schon Besserung versprochen. Die Entwickler wollen sich erst um Funktionalität und dann um Geschwindigkeit kümmern.

Alles in allem hat FLOW3 großes Potenzial und eine sehr gute Basis, aber im aktuellen Status würde ich es noch nicht für Geschäftskritische Anwendungen empfehlen. Ich bin aber guter Dinge, dass sich in den nächsten Monaten viele der zuvor genannten Baustellen verkleinern werden.