Beiträge gettagt mit Ruby

Verwenden Sie keine Verneinung nicht!

Wenn ich es schaffe, eine if-Anweisung zu vermeiden, dann versüßt mir das immer meinen Tag. Aber leider kann man als Entwickler nicht darauf verzichten, Bedingungen in den Code einzubauen.

Was ich jedoch versuche, an allen Stellen zu vermeiden, ist der schreckliche „not”-Operator, der in den meisten Sprachen durch den Einsatz von „!” implementiert wird. Der Einsatz dieses Operators macht den Quellcode immer schwerer zu lesen. Ich möchte keine Bedingungen wie die folgende in meinem Code haben:

if (!$this->isUserAuthenticated()) {
    $this->requireLogin();
}

So ein kleines Ausrufezeichen übersieht man einfach viel zu leicht und da es die Logik des Ausdrucks komplett umdreht, ist es einfach viel zu wichtig, um übersehen zu werden. Noch schlimmer wird es, wenn Sie den Operator mehrfach in einer Bedingung einsetzen.

if (!$this->isUserAuthenticated() && !$this->isInternalIP()) {
    $this->requireLogin();
}

In solchen Code-Stellen kommt es gerne auch mal vor, dass man UND mit ODER verwechselt. Denn wenn man etwas negieren möchte, sollte man dran denken, auch die Verknüpfung zu negieren oder entsprechend zu klammern. Die obige Bedingung ist mit der folgenden identisch, statt einem logischen UND verwenden Sie jedoch ein logisches ODER:

if (!($this->isUserAuthenticated() || $this->isInternalIP())) {
    $this->requireLogin();
}

Auf den ersten Blick erschließt sich mir nie, was die Bedingung aussagt, sobald ein „not”-Operator im Spiel ist.

Aber welche Möglichkeiten gibt es, um den ungeliebten Operator loszuwerden?

Verneinen Sie den Methodennamen

Statt einer Methode isUserAuthenticated() einen „not”-Operator voranzustellen, könnten Sie eine zweite Methode implementieren, die bereits auf das Gegenteil prüft und einen sprechenden Namen hat:

if ($this->isUserUnknown()) {
    $this->requireLogin();
}

So liest sich der gesamte Code viel flüssiger und es kann nicht dazu kommen, dass der Operator übersehen wird oder das Ergebis im Kopf evaluiert werden muss.

Prüfen Sie auf false

Statt den „not”-Operator zu verwenden, können Sie die Rückgabe der Methode auf false prüfen:

if (false === $this->isUserAuthenticated()) {
    $this->requireLogin();
}

Der Code ist zwar nicht so lesbar wie im vorherigen Beispiel, aber wenn Sie die Bedingung nur einmal prüfen müssen, kann es sinnvoll sein, auf die Implementierung einer Methode für diesen einen Fall zu verzichten. Achten Sie übrigens immer darauf, bei einer Bedingung den konstanten Wert auf der linken Seite der Klammer zu setzen. Sollten Sie zu wenige Gleichheitszeichen verwenden, so kann aus der Bedingung nicht aus Versehen eine Zuweisung werden.

Verwenden Sie unless

Sollten Sie Ruby verwenden, so haben Sie noch eine dritte, sehr elegante Möglichkeit. Ruby bietet Ihnen neben der if-Anweisung auch eine unless-Anweisung, die, wenn Sie sie als Modifier einsetzen, besonders elegant zu lesen ist.

require_authentication unless user_is_authenticated

In diesem Beispiel ist der Code kaum noch von einem englischen Satz zu unterscheiden. Unterstützt wird das natürlich noch dadurch, dass Sie in Ruby keine Klammern verwenden müssen, wenn Sie keine Parameter an eine Methode übergeben wollen.

Wenn Sie also das nächste Mal eine Bedingung negieren, dann denken Sie darüber nach, ob es keine bessere Lösung gibt. Und falls Sie in einer Bedingung zweimal negieren müssen, dann denken Sie nochmal über eine Alternative nach. Es gibt sie sicher.

Ruby on Rails on Windows

Nachdem ich Anfang des Jahres beschlossen hatte, Ruby zu lernen, habe ich das vor einer Woche in die Tat umgesetzt. Zusammen mit Holger entwickle ich eine webbasierte DVD- und Blu-Ray Verwaltung basierend auf Ruby on Rails. Dabei habe ich den Fehler gemacht, dass ich das auf einem Windows-Notebook machen wollte und erst mal fast einen Abend mit der Installation der neusten Ruby Version 1.8.7 verbracht.

Damit das anderen nicht auch so geht, versuche ich nochmal, zu rekapitulieren, welche Schritte dazu nötig waren:

  1. Laden Sie den Ruby One-Click Installer 1.8.6 von der Ruby Website herunter.
  2. Installieren Sie Ruby 1.8.6 (zum Beispiel in C:\ruby).
  3. Laden Sie das Ruby 1.8.7 Binary von der Ruby Website herunter.
  4. Entpacken Sie das Binary in den selben Ordner (C:\ruby), in den der Installer die Version 1.8.6 installiert hat.
  5. Laden Sie ZLib Packages von der ZLib Website herunter und Entpacken Sie das Archiv.
  6. Benennen Sie die Datei zlib1.dll nach zlib.dll um.
  7. Kopieren Sie die Datei zlib.dll nach C:\ruby\bin.
  8. Laden Sie libiconv 1.91 herunter und Entpacken das Archiv.
  9. Kopieren Sie die Datei bin/iconv.dll nach C:\ruby\bin.
  10. Laden Sie OpenSSL herunter und installieren es. Bei der Installation kann es sein, dass Sie aufgefordert werden, zuerst das Microsoft Visual C++ 2008 Redistributable Package zu installieren.

Damit sollte Ruby installiert sein. Überprüfen können Sie das einfach in der Konsole über:

C:\Users\schst> ruby --version
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]

Um Ruby on Rails zu verwenden, sollten Sie nun auch noch SQLite installieren. Während der Entwicklung können Sie Ihre Models sehr komfortabel in einer SQLite Datenbank persistieren. Sollten Sie SQLite noch nicht installiert haben, reichen dazu die folgenden Schritte aus:

  1. Laden Sie die vorkompilierte Verson für Windows herunter.
  2. Entpacken Sie das Archiv
  3. Kopieren Sie die Datei sqlite3.exe nach C:\ruby\bin.

Als nächstes können Sie sich nun daran machen, den gem Installer für Ruby zu installieren:

  1. Laden Sie die aktuelle Version von RubyForge herunter.
  2. Entpacken Sie das Archiv.
  3. Führen Sie ruby setup.rb aus.

Alle weiteren Schritte erledigt nun gem für Sie:

C:\Users\schst>gem install rails
C:\Users\schst>gem install sqlite3-ruby

Danach können Sie mit Ihrer ersten Ruby on Rails Applikation loslegen:

C:\Users\schst> rails my-app
C:\Users\schst>     cd my-app
C:\Users\schst>     ruby script/server

Ihre Anwendung öffnen Sie nun im Browser über http://localhost:3000.