Betrachten wir ein einfaches Beispiel für ein DAO -Muster. % Co_de% ist ein Wertobjekt und Person
ist das entsprechende Merkmal, das Methoden zum Speichern / Abrufen von PersonDAO
in / aus der Datenbank bereitstellt.
Wir verwenden dieses Muster (im Gegensatz zu Active Record zum Beispiel), wenn wir die Geschäftsdomäne trennen wollen und Persistenzlogik.
Was ist, wenn wir stattdessen einen anderen Ansatz verwenden?
Wir werden Person
und implizite Konvertierung von PersonDatabaseAdapter
nach it.
Wenn wir nun diese Konvertierungen importieren, können wir Client-Code schreiben, um Person
zu manipulieren und sie auf folgende Weise in der Datenbank zu speichern / abzurufen:
Dieser Code sieht wie Persons
aus, aber die Geschäftsdomäne und die Persistenz sind noch getrennt.
Macht es Sinn?
Nun, ich weiß nichts über "veraltete" Muster. Muster ist ein Muster und Sie verwenden es wo es angebracht ist. Außerdem weiß ich nicht, ob ein Muster in einer Sprache veraltet sein sollte, es sei denn, die Sprache selbst implementiert es mit derselben Funktionalität.
Datenzugriffsobjekt ist meines Wissens nicht obsolet:
Mir scheint, dass Sie immer noch das DAO-Muster verwenden. Sie haben es gerade anders implementiert.
Ich habe diese Frage tatsächlich gefunden, weil ich in Anbetracht der Leistungsfähigkeit von Hibernate untersucht habe, ob das DAO-Muster in schlichtem Java tot ist. Es scheint, dass die Hibernate-Sitzung eine generische Implementierung eines DAO ist und Vorgänge wie create, save, saveOrUpdate und mehr definiert.
In der Praxis habe ich wenig Wert bei der Verwendung des DAO-Musters gesehen. Bei der Verwendung von Hibernate sind die DAO-Schnittstellen und -Implementierungen redundante Wrapper um die einlinigen Hibernate Session-Idiome, z. B. getSession (). Update (...);
Was Sie am Ende haben, sind doppelte Schnittstellen - eine Service-Schnittstelle, die alle Methoden der DAO-Schnittstelle neu definiert und einige andere, die in Bezug auf diese implementiert wurden.
Es scheint, dass Spring + Hibernate die Persistenzlogik fast auf eine Trivialität reduziert hat. Persistence-Technologie Portabilität wird nicht in fast allen Anwendungen benötigt. Hibernate bietet bereits Datenbankportabilität. Sicher, DAOs würden Ihnen die Möglichkeit geben, von Hibernate zu Toplink zu wechseln, aber in der Praxis würde man das nie tun. Persistenztechnologien sind bereits undichte Abstraktionen und Anwendungen werden entwickelt, um mit dieser Tatsache umzugehen - wie das Laden eines Proxys für das Setzen von Assoziationen im Vergleich zum Ausführen eines Datenbanktreffers -, der sie notwendigerweise mit der Persistenztechnologie verbindet. An Hibernate gekoppelt zu sein, ist jedoch nicht wirklich so schlimm, da es sein Bestes tut, um aus dem Weg zu gehen (keine überprüften Ausnahmen a la JDBC und anderen Unsinn).
Zusammenfassend denke ich, dass Ihre Scala-Implementierung des DAO-Musters in Ordnung ist, obwohl Sie wahrscheinlich ein komplett generisches Mixin erstellen könnten, das jeder Entität grundlegende CRUD-Operationen geben würde (die kompetentesten Entwickler implementieren eine "generische DAO" -Basis) Klasse auch in Java). Geht das mit Active Record?
/ Ende der zufälligen Kommentare /
Ich glaube, Ihr PersonDatabaseAdapter
mutiert Person
in seiner Methode retrieve(id: Int)
. Dieses Muster zwingt also Ihre Domänenobjekte, veränderbar zu sein, während die Scala-Gemeinschaft aufgrund der funktionalen Natur (oder Merkmale) der Sprache Unbeweglichkeit bevorzugt.
Ansonsten denke ich, dass das DAO-Muster immer noch die gleichen Vor- und Nachteile (aufgelistet hier ) in Scala hat wie es tut in Java.
Heutzutage fällt mir auf, dass das Repository-Muster sehr beliebt ist, besonders weil es aufgrund seiner Terminologie so aussieht, als ob es sich um Sammlungen handelt.