Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Scala Grundkurs

Eigene Operatoren definieren

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Operatoren wie +, -, <, > lassen sich in Scala ganz einfach mit eigenen Implementierungen in Form von Funktionen überschreiben. Wie das genau funktioniert, zeigt Ihnen Christopher Janietz in diesem Film.

Transkript

Normalerweise können nur Programmiersprachen selbst eigene Operatoren definieren. Beispielsweise kann man in Java Integer-Werte miteinander addieren. Hingegen ist das mit Klassen nicht möglich. Scala nimmt sich genau dieser Problemstellung an und erlaubt es, Operatoren für intuitive Operationen zwischen zwei Klassen definierbar zu machen, und wie genau das funktionert, möchte ich Ihnen nun demonstrieren. Hierfür beginne ich in meiner Applikation. Diese definiert Kunden, einen Warenkorb, Preise und Produkte. Mein Ziel ist es nun, Preise miteinander zu addieren. Üblicherweise wäre das so einfach, wie zwei Zahlen zu addieren. Im Fall eines Preises handelt es sich allerdings um eine Klasse. Um genau zu sein, um eine "case class". Zunächst einmal definiere ich also nun drei Preise. Der erste Preis ist 20 Euro, der zweite Preis ist in der Höhe von 30 Euro und zu guter Letzt noch einen dritten Preis, der 15 US-Dollar beträgt. Interessant wäre nun, wenn ich also in der Lage wäre, Preis 1 und Preis 2 zu addieren oder möglicherweise auch, Preis 1 mit Preis 3 zu addieren. Dafür muss ich nun also einen Operator überschreiben, in dem Fall also den Operator "+". Die Art und Weise Operatoren zu überschreiben in Skala, ist relativ intuitiv. Das bedeutet, ich definiere lediglich eine Funktion mit der Bezeichnung "+" und dem gegenüberliegenden Argument. In dem Fall also einen weiteren Preis. Das Resultat dieser Operation ist wiederum ein Preis. Um sicher zu stellen, dass hierbei auch die richtigen Währungen miteinander verrechnet werden, überprüfe ich zunächst, ob die Währung meines aktuellen Preises mit der Währung des gegenüberliegenden Preises übereinstimmt. Wenn dies nicht der Fall ist, erzeuge ich eine "RuntimeException" mit dem Inhalt "Invalid currency". Für das Erzeugen des neuen Preises verwende ich die Möglichkeit einer "case class". Über die Copy-Methode definiere ich also nun ein neues "value" und nehme das "value" meines aktuellen Preises addiert mit dem "value" des gegenüberliegenden Preises. Führe ich nun meine Applikation aus, so erhalte ich das gewünschte Ergebnis 50 Euro. Allerdings habe ich nun noch ein Problem bei der Addition zwischen zwei verschiedenen Währungen. Hierfür erhalte ich die erwünschte RuntimeException. Eine Möglichkeit, die ich nun hätte, ist das Konvertieren des ersten Preises in US-Dollar. Allerdings möcht ich das Ganze mit Hilfe von Operatoren lösen. In dem Moment, wo man nun eigene Operatoren definiert, begibt man sich in ein schwieriges Terrain, denn schließlich muss allen Nutzern der Klasse "price" klar sein, wozu der Operator dient. Das kann entweder mit Hilfe von Dokumentationen oder Intuitivität sein. Ich definiere jetzt also einen neuen Operator mit zweimal dem Größer-Zeichen () und einer neuen "Currency" als Stringargument. Das Resultat ist wieder ein "Price" und in dem Fall, dass die "newCurrency" also US-Dollar beträgt, wandle ich den aktuellen Preis in US-Dollar um. Andernfalls, da ich dafür noch keine Umrechnungsmethoden habe, erzeuge ich eine "RuntimeException ("Invalid Currency")". An der Stelle könnte ich also nun den Operator verwenden, und "price1" in US-Dollar umwandeln. Nichtsdestotrotz werde ich immer noch eine Fehlermeldung erhalten. Das liegt an der Assoziativität. Denn der Ausdruck "USD + price3" wird zuerst ausgewertet. Erst dann wird dieser Zusammenhang ausgewertet. Das bedeutet, das Ergebnis ist also hier das "price1" versucht sich, in die Währung umzuwandeln, US-Dollar plus die Two-String-Version von "price3". Scala berücksichtigt daher eine bestimmte Form von Assoziativität. Genau hier sind die Operatoren definiert, die in ihrer Reihenfolge von oben nach unten in der Wichtigkeit steigen. Das bedeutet, wie bspw. aus der Mathematik bekannt, Punkt vor Strich. Und wie in meinem Beispiel nun ist Plus wichtiger als Größer/Kleiner-Zeichen. Um also nun die korrekte Funktionalität herzustellen, muss ich Klammern setzen. Um eine schöne Notation ohne Klammersetzung zu gewinnen, muss ich nicht immer auf Operatoren setzen. Beispielsweise kann ich auch eine Funktion "exchange" definieren, die an dieser Stelle nun die Implementierung der Konvertiermethode des Operators kopiert. So kann ich nun statt dem Operator auch den Ausdruck "exchange" nehmen. Es war mir nun also möglich, Operatoren anhand des Methodennamens zu überschreiben. Das bedeutet bspw., dass ich ledglich ein Plus als Methodennamen verwendet habe und dadurch den Operator innerhalb der Programmiersprache verwenden konnte. Besonders gut eignen sich solche Operatoren für Case-Klassen, gerade dann, wenn diese Daten in sich beinhalten, die sich besonders gut bspw. für Additionen eignen. Das Ganze bezeichnet man als Infix-Operationen, und diese unterliegen einer bestimmten Assoziativität. Das heißt, man sollte immer beachten, in welcher Reihenfolge die Operatoren ausgewertet werden. Zu guter Letzt bleibt mir noch zu sagen, dass die Definition von eigenen Operatoren spärlich verwendet werden sollte, denn anders als Methodennamen transportieren diese oft nicht den Zweck, den sie erfüllen sollen. Besonders dann, wenn man Operatoren nicht so einsetzt, wie ihre Zeichensetzung normalerweise es implizieren würde.

Scala Grundkurs

Entdecken Sie die Möglichkeiten und Eigenschaften der modernen Programmiersprache Scala.

4 Std. 44 min (39 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Exklusiv für Abo-Kunden
Erscheinungsdatum:12.04.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!