Was ist der Unterschied zwischen den Mustern Data Mapper, Table Data Gateway (Gateway), Data Access Object (DAO) und Repository?

133

Ich versuche, meine Fähigkeiten als Designmuster aufzufrischen, und ich bin gespannt, was die Unterschiede zwischen diesen Mustern sind. Alle scheinen dasselbe zu sein - kapseln Sie die Datenbanklogik für eine bestimmte Entität, sodass der aufrufende Code keine Kenntnis von der zugrunde liegenden Persistenzschicht hat. Nach meiner kurzen Recherche implementieren alle normalerweise Ihre Standard-CRUD-Methoden und abstrahieren die datenbankspezifischen Details.

Was ist der Unterschied, abgesehen von Namenskonventionen (z. B. CustomerMapper vs. CustomerDAO vs. CustomerGateway vs. CustomerRepository)? Wenn es einen Unterschied gibt, wann würden Sie einen über den anderen wählen?

In der Vergangenheit habe ich Code ähnlich dem folgenden geschrieben (natürlich vereinfacht - ich würde normalerweise keine öffentlichen Eigenschaften verwenden):

public class Customer
{
    public long ID;
    public string FirstName;
    public string LastName;
    public string CompanyName;
}

public interface ICustomerGateway
{
    IList<Customer> GetAll();
    Customer GetCustomerByID(long id);
    bool AddNewCustomer(Customer customer);
    bool UpdateCustomer(Customer customer);
    bool DeleteCustomer(long id);
}

und haben eine CustomerGatewayKlasse, die die spezifische Datenbanklogik für alle Methoden implementiert. Manchmal habe ich keine Schnittstelle verwendet und alle Methoden auf dem CustomerGateway statisch gemacht (ich weiß, ich weiß, das macht es weniger testbar), damit ich es so nennen kann:

Customer cust = CustomerGateway.GetCustomerByID(42);

Dies scheint das gleiche Prinzip für die Data Mapper- und Repository-Muster zu sein. Das DAO-Muster (das ist, glaube ich, dasselbe wie Gateway?) scheint auch datenbankspezifische Gateways zu fördern.

Vermisse ich etwas Es scheint ein bisschen seltsam, 3-4 verschiedene Möglichkeiten zu haben, genau dasselbe zu tun.

Wayne Molina
quelle

Antworten:

96

Ihre Beispielbegriffe; DataMapper, DAO, DataTableGateway und Repository haben alle einen ähnlichen Zweck (wenn ich einen verwende, erwarte ich, dass ich ein Kundenobjekt zurückerhalte), aber unterschiedliche Absichten / Bedeutungen und daraus resultierende Implementierung.

Ein Repository "verhält sich wie eine Sammlung, außer mit ausgefeilteren Abfragefunktionen" [ Evans, Domain Driven Design ] und kann als "Objekte in der Speicherfassade" betrachtet werden ( Repository-Diskussion) )

Ein DataMapper "verschiebt Daten zwischen Objekten und einer Datenbank, während sie unabhängig voneinander und vom Mapper selbst bleiben " ( Fowler, PoEAA, Mapper )

Ein TableDataGateway ist "ein Gateway (Objekt, das den Zugriff auf ein externes System oder eine externe Ressource kapselt) zu einer Datenbanktabelle. Eine Instanz verarbeitet alle Zeilen in der Tabelle " ( Fowler, PoEAA, TableDataGateway )

Ein DAO "trennt die Client-Schnittstelle einer Datenressource von ihren Datenzugriffsmechanismen / passt die Zugriffs-API einer bestimmten Datenressource an eine generische Client-Schnittstelle an", sodass "Datenzugriffsmechanismen unabhängig vom Code geändert werden können, der die Daten verwendet" ( Sun Blueprints) )

Das Repository scheint sehr allgemein zu sein und enthüllt keine Vorstellung von Datenbankinteraktion. Ein DAO bietet eine Schnittstelle, über die verschiedene zugrunde liegende Datenbankimplementierungen verwendet werden können. Ein TableDataGateway ist speziell ein Thin Wrapper um eine einzelne Tabelle. Ein DataMapper fungiert als Vermittler, der es dem Modellobjekt ermöglicht, sich unabhängig von der Datenbankdarstellung (im Laufe der Zeit) zu entwickeln.

Pierce Hickey
quelle
15
In Wahrheit gibt es keinen großen Unterschied zwischen DAO und TableDataGateway und in [Fowler, PoEAA] [1] sagen sie genau das: "[Alur et al.] [2] diskutiert das Datenzugriffsobjektmuster, das ein Table Data Gateway ist. Ich habe einen anderen Namen verwendet, teilweise weil ich dieses Muster als eine besondere Verwendung des allgemeineren Gateway (466) -Konzepts sehe und ich möchte, dass der Mustername dies widerspiegelt. " [1]: martinfowler.com/books/eaa.html [2]: books.google.pt/books/about/…
Miguel Gamboa
9
Guter Punkt. Mein Eindruck ist, dass die von PoEAA bereitgestellte Definition von TableDataGateway enger ist als DataAccessObject. Ersteres scheint eine Eins-zu-Eins-Zuordnung mit einer (relationalen) Datenbanktabelle zu implizieren, wobei ein DAO als Fassade für mehrere zugrunde liegende nicht relationale Ressourcen fungieren kann. Der Schwerpunkt in einem DAO liegt auf der Fähigkeit, den zugrunde liegenden Datenspeicher zu ersetzen. Der Schwerpunkt in TableDataGateway liegt auf der Kapselung von SQL-Operationen über eine einzelne Tabelle (nicht unbedingt neutral / portabel im Datenspeicher).
Pierce Hickey
31

In der Welt des Software-Designs besteht die Tendenz (zumindest glaube ich), neue Namen für bekannte alte Dinge und Muster zu erfinden. Und wenn wir ein neues Paradigma haben (das sich vielleicht geringfügig von bereits bestehenden unterscheidet), enthält es normalerweise eine ganze Reihe neuer Namen für jede Stufe. "Business Logic" wird also zu "Services Layer", nur weil wir sagen, dass wir SOA ausführen, und DAO wird zu Repository, nur weil wir sagen, dass wir DDD ausführen (und jeder von diesen ist eigentlich gar nichts Neues und Einzigartiges, aber wieder: neue Namen für bereits bekannte Konzepte, die im selben Buch zusammengefasst sind). Ich sage also nicht, dass all diese modernen Paradigmen und Akronyme genau dasselbe bedeuten, aber Sie sollten wirklich nicht zu paranoid sein. Meistens sind dies die gleichen Muster, nur aus verschiedenen Familien.

Dmitry Perets
quelle
4
@MladenMihajlovic, nur weil Sie nicht verstehen oder zustimmen, heißt das nicht, dass diese Antwort nicht gültig oder ereignisrichtig ist.
Cypher
2
@MladenMihajlovic das sagt diese Antwort nicht. Der letzte Satz fasst es zusammen.
Cypher
2
@Cypher Sind diese Muster meistens gleich? Nein sind sie nicht. Die Implementierung des Gateway-Musters unterscheidet sich von der Implementierung des Repository-Musters. Sie mögen für das ungeübte Auge gleich aussehen, sind es aber nicht. Auch, wie Mladen Mihajlovic richtig hervorhob, ist diese Antwort völlig falsch. Geschäftslogik und Serviceschicht sind zwei verschiedene Dinge.
Frederik Krautwald
1
@Cypher Es ist nicht wirklich eine Ansichtssache, sondern Fakten. Das Gateway-Muster wurde von Martin Fowler in seiner PoEAA formuliert und hängt hauptsächlich mit den Fassaden- oder Adaptermustern [GoF] zusammen. Der Unterschied besteht darin, dass das Gateway für eine bestimmte Verwendung geschrieben wurde und normalerweise keine Schnittstelle vorhanden ist. Das Gateway umfasst normalerweise nur zwei Objekte, und die Ressource, die verpackt wird, kennt das Gateway nicht. (Fortsetzung ...)
Frederik Krautwald
3
Dies ist eher ein Kommentar als eine Antwort.
Pétur Ingi Egilsson
31

Data Mapper vs Table Data Gateway Um es kurz zu machen:

  • Der Data Mapper empfängt das Domain Model-Objekt (Entity) als Parameter und implementiert damit die CRUD-Operationen
  • Das Table Data Gateway empfängt alle Parameter (als Grundelemente) für die Methoden und weiß nichts über das Domänenmodellobjekt (Entität).

    Am Ende fungieren beide als Vermittler zwischen den In-Memory-Objekten und der Datenbank.

  • Nascar
    quelle
    6
    Link ist abgestanden
    imel96
    1
    Aktualisierter Link: github.com/willdurand-edu/php-slides/blob/master/src/common/…
    Fernando Correia
    15

    Du hast einen guten Punkt. Wählen Sie diejenige aus, mit der Sie am besten vertraut sind. Ich möchte auf einige Dinge hinweisen, die zur Klärung beitragen können.

    Das Table Data Gateway wird hauptsächlich für eine einzelne Tabelle oder Ansicht verwendet. Es enthält alle Auswahlen, Einfügungen, Aktualisierungen und Löschungen. Der Kunde ist also in Ihrem Fall eine Tabelle oder eine Ansicht. Eine Instanz eines Tabellendaten-Gateway-Objekts behandelt also alle Zeilen in der Tabelle. Normalerweise bezieht sich dies auf ein Objekt pro Datenbanktabelle.

    Während Data Mapper unabhängiger von jeder Domänenlogik ist und weniger gekoppelt ist (obwohl ich glaube, dass es entweder eine Kopplung gibt oder keine). Es ist lediglich eine Zwischenschicht, um die Daten zwischen Objekten und einer Datenbank zu übertragen und sie gleichzeitig voneinander und vom Mapper selbst unabhängig zu halten.

    Normalerweise sehen Sie in einem Mapper Methoden wie Einfügen, Aktualisieren, Löschen und im Tabellendaten-Gateway finden Sie getcustomerbyId, getcustomerbyName usw.

    Das Datenübertragungsobjekt unterscheidet sich von den obigen zwei Mustern hauptsächlich, weil es ein Verteilungsmuster und kein Datenquellenmuster wie die obigen zwei Muster ist. Verwenden Sie es hauptsächlich, wenn Sie mit einer Remote-Schnittstelle arbeiten und Ihre Anrufe weniger gesprächig gestalten müssen, da jeder Anruf teuer werden kann. Entwerfen Sie daher normalerweise ein DTO, das über Kabel serialisiert werden kann und alle Daten zum Anwenden weiterer Geschäftsregeln oder zur Verarbeitung zum Server zurückführt.

    Ich bin mit Repository-Mustern nicht vertraut, da ich bis jetzt keine Gelegenheit hatte, sie zu verwenden, aber ich werde mir andere Antworten ansehen.

    Srikar Doddi
    quelle
    1

    Unten ist nur mein Verständnis.

    TableGateWay / RowDataGateWay : In diesem Zusammenhang verweist Gateway auf eine bestimmte Implementierung, bei der jedes " Domänenobjekt " jedem "Domänenobjekt-Gateway" zugeordnet ist. Wenn wir beispielsweise Person haben , verfügen wir über ein PersonGateway zum Speichern des Domänenobjekts Person in der Datenbank. Wenn wir Person, Mitarbeiter, Kunde usw. haben, haben wir PersonGateway, EmployeeGateway und CustomerGateway. Jedes Gateway verfügt über eine spezifische CRUD-Funktion für dieses Objekt und hat nichts mit einem anderen Gateway zu tun. Hier gibt es keinen wiederverwendbaren Code / Modul. Das Gateway kann weiter in RowDataGateway oder TableGateway unterteilt werden, je nachdem, ob Sie eine "ID" oder ein "Objekt" übergeben. Das Gateway wird normalerweise mit dem aktiven Datensatz verglichen. Es bindet Ihr Domänenmodell an das Datenbankschema.

    Repository / DataMapper / DAO : Sie sind dasselbe. Sie alle beziehen sich auf die Persistenzschicht, die Datenbankentitäten an das Domänenmodell überträgt. Im Gegensatz zum Gateway verbergen Repository / DataMapper / DAO die Implementierung. Sie wissen nicht, ob sich hinter Person ein PersonGateway befindet. Es kann sein, oder es kann nicht, es ist dir egal. Sie wissen lediglich, dass für jedes Domänenobjekt CRUD-Operationen unterstützt werden müssen. Es entkoppelt die Datenquelle und das Domänenmodell.

    Hao Lu
    quelle