Marskratervermeidung


Wie wir wissen hat die NASA einen kleinen, aber teuren Marskrater erzeugt, nur damit die Schulkinder auf der Erde ein schönes Beispiel dafür haben, wie wichtig es ist, bei einer Berechnungen penibel auf die richtigen physikalischen Einheiten zu achten.

Wenn man sich die Antwort auf dieses Problem in Java-Land anschaut (nämlich JSR-275), kommt sicher ein bisschen Bewunderung angesichts des freigiebigen und virtuosen Gebrauchs von Generics auf, lässt aber die Frage nach der Praktikabilität einer solchen Lösung offen. Nun ja, vielleicht schafft ja Project Coin Linderung

Hier nun eine kleine Scala-Spielerei, die zeigt, wie leichtgewichtig man ein kleines Einheiten-Framework implementieren und wie schmerzlos dabei die Syntax gestaltet werden kann.

case class Length(mm:Int) {
  def +(that:Length) = Length(this.mm + that.mm)
  def -(that:Length) = Length(this.mm - that.mm)
  def *(scalar:Int) = Length(scalar * mm)
}

So weit, so gut. Unsere Längen basieren intern auf mm, aber natürlich kann man ohne weiteres auch Methoden zum Abfragen der cm, m oder km schreiben. Addieren und Subtrahieren kann die Klasse auch. Im richtigen Leben würde man statt Int wahrscheinlich Double oder sogar BigDecimal nehmen, je nach Anwendung.

implicit def intToMM(value:Int) = new { 
    def mm = Length(value) 
}
implicit def intToCM(value:Int) = new {  
    def cm = Length(value*10) 
}
implicit def intToM(value:Int) = new {  
    def m = Length(value*1000) 
}
implicit def intToKM(value:Int) = new {  
    def km = Length(value*1000000) 
}

Die impliziten Konvertierungen verwenden anonyme Klassen – wozu sollen die temporären Objekte auch einen Namen bekommen, wenn sie nur dazu da sind, uns die passenden Length-Objekte zu liefern?

Ein kleiner Test:

(3 m) + (5 cm) == (3050 mm)
//--> res0: Boolean = true
(3 m) + (5 cm) == (3005 mm)
//--> res1: Boolean = false

Tja, die Operatorpräzedenz ist festgelegt, da hilft auch kein Flehen und Brummen, wir brauchen hier leider die Klammern. Aber trotzdem finde ich diese Version viiieeel lesbarer als Java. Auf jeden Fall ist die hier gezeigte Technik es ein einfaches, aber nützliches Werkzeug bei der Gestaltung eigener DSLs.

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s