Ich habe ein Projekt, in dem ich zwei Klassen habe, für die beide ein Datenbankzugriffsobjekt erforderlich ist, das dieselbe Tabelle aktualisiert. Die Einschränkungen des Frameworks und des Projekts machen es so, dass ich diese beiden Klassen nicht kombinieren kann. Ich habe unten einen Fall erstellt, der zeigt, wie das Setup ist. Klasse A muss in der Lage sein, den Datensatz zu aktualisieren und zu lesen, während Klasse B in der Lage sein muss, den Datensatz zu aktualisieren und zu löschen.
Wenn ich die Klassen so verwende, wie sie sind, funktioniert es einwandfrei, aber ich habe ein Problem damit, dass jede der Klassen Funktionen benötigt, deren Implementierung nicht verwendet wird. Um beispielsweise Klasse A zu verwenden, muss ich ein Dao übergeben, das die Löschfunktion implementiert, obwohl sie niemals aufgerufen wird. Ebenso muss ich Klasse B ein Dao übergeben, das die Lesefunktion implementiert, aber niemals aufgerufen wird.
Ich dachte darüber nach, es durch Schnittstellen zu erreichen, die andere erben (IReadDao, IUpdateDao, IDeleteDao sind die Daos, von denen geerbt werden würde), aber dieser Ansatz würde grundsätzlich eine andere Schnittstelle für jede Funktionskombination erfordern (IUpdateAndRead, IReadAndDelete, IReadAndUpdate ... )
Ich möchte eine Schnittstelle für das Dao verwenden, da ich die Anwendung nicht mit der Datenbank koppeln möchte. Gibt es ein Muster oder eine Methode, um das zu erreichen, was ich will, von dem jeder weiß? Danke im Voraus.
class IDao {
void update(ModelDao model);
void delete(String guid);
ModelDao read(String guid);
}
Class A {
private IDao dao;
public A(IDao dao) {
this.dao = dao;
}
public void doStuff() {
ModelDao model = new ModelDao();
...
dao.update(model);
}
public void readThenDoSomething(String id) {
ModelDao model = dao.read(id);
...
}
}
Class B {
private IDao dao;
public B(IDao dao) {
this.dao = dao;
}
public void makeUpdate() {
ModelDao model = new ModelDao();
...
dao.update(model);
}
public void delete(String id) {
dao.delete(id);
}
}
quelle
I
vonSOLID
). Vielleicht möchten Sie ein bisschen darüber lesen.Antworten:
Laut Christophers Kommentar ist es wahrscheinlich etwas besser, die Schnittstellen zu trennen . So benötigen Sie mindestens würden
IReadDao
,IDeleteDao
undIUpdateDao
. Beachten Sie, dass Sie nicht unbedingt drei Klassen benötigen. Sie können eine große DAO-Klasse haben, die alle drei Schnittstellen implementiert, wenn es sinnvoll ist, die Codebasis auf diese Weise zu kombinieren.Um kombinatorische Explosion zu vermeiden (zB die Notwendigkeit , ein zu vermeiden
IReadUpdate
,IDeleteUpdate
etc. Schnittstelle) Sie die Schnittstellen separat in Konstruktor Injektion zur Verfügung stellen können (können Sie das gleiche Objekt doppelt so unterschiedliche Parameter übergeben), oder bieten ein einzelnes Objekt Unterstützung von zwei oder mehr Schnittstellen in einem generischen Methodenaufruf mitextends
.Konstruktorinjektion:
Setter-Injektion mit generischer Methode:
quelle
dao
beiden zugewiesen sind .