Scala Grundkurs

Traits

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Traits sind eines der mächtigsten Werkzeuge von Scala. Damit lassen sich viele Dinge umsetzen, wie beispielsweise Java-Interfaces oder die Mehrfachvererbung. Sehen Sie in diesem Video, wie Traits korrekt in Scala eingesetzt werden.

Transkript

Traits sind eines der mächtigsten Werkzeuge von Scala. Damit lassen sich viele Dinge umsetzen wie beispielsweise Java-Interfaces oder auch Mehrfachvererbung, und ich zeige Ihnen nun, wie Sie Traits korrekt einsetzen können. Ich befinde mich nun also in meiner Applikation, in der es Kunden gibt, einen Warenkorb, Preise, Produkte mit Preisen und einen Online-Shop. Mein Online-Shop verwaltet bis jetzt alle seine Funktionen selbst. Das sind hier speziell das Hinzufügen von Kunden. Mit Hilfe eines Traits kann ich diese Funktionalität nun auslagern. Ein Trait wird definiert über das Keyword "trait" und einen Bezeichner, beispielsweise könnte ich nun dieses "trait" "CustomerManager" nennen. Um die Funktionalität für das Managen von "Customern" nun auszulagern, kopiere ich die Implementierung in den "CustomerManager". Nun ist mein "OnlineShop" nicht mehr in der Lage, Kunden hinzuzufügen. Möchte ich allerdings diese Funktionalität wieder auf meinem "OnlineShop" zur Verfügung stellen, erweitere ich lediglich die "OnlineShop"-Klasse um die "trait" "CustomerManager". In diesem Zusammenhang kann ich einen Trait also ähnlich wie eine Klasse betrachten, von dieser kann ich erben, und diese hat auch Implementierungen. Genauso verwaltet sie eigene Variablen. All diese Möglichkeiten bietet ein reguläres Java-Interface beispielsweise nicht. Ich könnte nun eine weitere "trait" deklarieren, mit der Bezeichnung "CheckoutHandler". Diese "trait" soll sich also nun um den "Checkout"-Prozess, also das Abschließen des Verkaufs kümmern. Dafür definiert sie also eine Methode "checkout", die einen Warenkorb entgegennimmt. An der Stelle implementiere ich diese Methode nun nicht weiter. Mein "OnlineShop" hingegen kann nun nicht nur vom "CustomerManager" erben, sondern zusätzlich mit der Notation "with" vom "CheckoutHandler". Das bedeutet, ich kann meinen "OnlineShop" nun nutzen, um einen "checkout" auszuführen, für einen "Basket". So konnte ich nun also beispielsweise schon Mehrfachvererbung abbilden. Aber was ist nun, wenn ich meine beiden "traits" "CustomerManager" und "CheckoutHandler" beispielsweise überwachen möchte? Eine solche Funktionalität benötigt man üblicherweise in Form von "Audits". Ich nenne also nun meine neue "trait" den "AuditLogger", und mit genau diesem "AuditLogger" möchte ich nun die Methode "Checkout" und "addCustomer" überwachen. Dafür nutze ich auch hier Vererbung, und erbe in dem Fall also vom "CustomerManager" und dem "CheckoutHandler". "traits" können also andere "traits" ohne Probleme beerben. An der Stelle könnte ich nun beispielsweise die Methode "addCustomer" überschreiben, und nach dem Hinzufügen eines "Customer" in die Konsole ein "Audit"-Event ausgeben. Beispielsweise in Form von "[Audit] Added Customer". Das Gleiche ist auch möglich für den "Checkout"-Prozess. Zusätzlich benötige ich nun eine Information darüber um welchen "Basket" es sich handelt. Bis jetzt ist es nicht möglich, irgendein bestimmtes relevantes Feld aus dem "Basket" auszulesen. Ich benötige also beispielsweise eine "basketId". Dafür füge ich nun ein "companion object" zu meinem "basket" hinzu, dieses verwaltet einen "counter", das ist im Hintergrund ein "AtomicInteger", um "Thread"-Sicherheit zu garantieren, und sobald sich ein "basket" initialisiert, bekommt er eine "basketId", die er auf Basis des "Counters" generiert. Diese "basketId" verwende ich nun im Rahmen meines "Audit". Das Besondere an meinem "AuditLogger" ist nun, dass ich ihn beliebig zuschalten oder abschalten kann. Wenn ich also die Applikation nun starte, so sehe ich nichts auf der Konsole, füge ich nun meinen "AuditLogger" in die Vererbungshierarchie hinzu, bekomme ich meine "Audit"-Events. Besonders an der Stelle ist auch, dass Scala automatisch sich um Probleme kümmert, wie die Reihenfolge der Vererbung. Theoretisch erbt ja mein "AuditLogger" von "CustomerManager" und "CheckoutHandler", das bedeutet, er wird im Normalfall vor diesen beiden "traits" stehen. "traits" können im Übrigen auch von Klassen erben. Ich definiere nun also zwei Klassen, beispielsweise eine "Class1" und eine "Class2". Nun ist es beliebig, welche der Klassen in der Hierarchie von einer Klasse erbt, zum Beispiel könnte der "CustomerManager" von der Klasse1 erben. Das wäre soweit möglich, da sonst keine "trait" oder Klasse innerhalb der Hierarchie von einer anderen Klasse erbt. Wenn ich nun aber eine andere Klasse hinzufüge, wie beispielsweise, dass der "CheckoutHandler" von Klasse2 erbt, dann bekomme ich eine Fehlermeldung, ausgelöst durch den Compiler. Denn es ist nicht möglich, Mehrfachvererbung in Form von Klassen abzubilden. Selbstverständlich können "traits" auch wie Interfaces verwendet werden. Beispielsweise könnte ich eine "trait" erstellen mit der Bezeichnung "AdvertisementHelper". Die Aufgabe ist es hier, eine Methode bereitzustellen, die auf der Konsole eine Werbung ausgibt; für den Shop. Dafür benötigt sie zum einen einen Namen und zum anderen eine URL. Das Ganze kann dann in Form einer String Interpolation abgebildet werden. Beispielsweise durch "getName" und "getURL". Die Definitionen "getName" und "getURL" sind also mit einem normalen Java-Interface vergleichbar. Wenn ich nun also zusätzlich von "AdvertisementHelper" erbe, werde ich dazu aufgefordert, die Implementierung von "getURL" vorzunehmen. Die Methode "getName" existiert bereits und definiert einen "OnlineShop"-Namen. Das Ganze kann ich dann noch auf meinem "OnlineShop" testen, indem ich die Methode "advertise" aufrufe. Traits sind also ein sehr mächtiges Werkzeug. Standardmäßig bilden sie auf jeden Fall die Funktionalitäten eines regulären Java-Interfaces ab. Doch viel mehr als das, können Traits auch andere Traits beerben und dadurch Mehrfachvererbung abbilden. Nebenbei können Traits auch mindestens eine Klasse in der gesamten Vererbungshierarchie beerben. Die Besonderheit liegt da vor allem darin, dass Traits Implementierungen enthalten und eigene Variablen und Konstanten verwalten. Anhand der Möglichkeiten von Traits kann man also Klassen nach Aspekten entwickeln. Das bedeutet, man kann die Funktionalität nach verschiedenen Aspekten auftrennen. Bei mir geschehen durch beispielsweise den "CheckoutHandler" und den "CustomerManager". Dabei handelt es sich allerdings um ein zweischneidiges Schwert. Zum einen ist die Anwendung so etwas modularer zusammenzusetzen, zum anderen kann es sein, dass am Ende nicht ganz klar ist, welche Funktionalitäten nun tatsächlich in einer Klasse implementiert sind.

Scala Grundkurs

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

4 Std. 44 min (39 Videos)
Derzeit sind keine Feedbacks vorhanden...
Software:
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!