2015-08-06 5 views
5

Ich frage mich, ob es eine gute Übung ist, eine Standard-DAO-Schnittstelle zu erstellen, anstatt für jede Klasse eine eigene Schnittstelle zu erstellen.Erstellen einer Standard-DAO-Schnittstelle

public interface DAO { 

    public void addItem(); 
    public void updateItem(); 
    public void removeItem(); 
    public Object getItem(int id); 
    public Object[] getAll(); 
} 

Jetzt können wir diese Schnittstelle durch mehrere Klassen implementieren. Natürlich hat diese Lösung Nachteile, wenn man Daten abruft, aber ich denke, es ist immer noch effizienter und Code klar. Ist das ein guter Weg?

+1

Nein. Sie haben gerade Ihre Sicherheit verloren. – canton7

Antwort

6

Es ist ein guter Weg, aber zumindest eine Verbesserung getan werden kann, die Verwendung von Generika:

public interface DAO<T> { 
    public void addItem(T item); 
    public void updateItem(T item); 
    public void removeItem(T item); 
    public T getItem(int id); 
    public List<T> getAll(); 
} 

So, jetzt werden Sie kein Casting benötigen. Wie auch immer, Sie müssen sicherstellen, dass alle DAOs mindestens diese Methoden haben. Sonst wird das zu mehr Komplexität führen. Außerdem, wenn es einige DAOs sind, die eben genau diese Methoden haben, werden Sie mit so ziemlich kompakt sauberen Code am Ende, zB:

public interface UserDAO extends DAO<User> { 
    // And that is basically it :) 
} 

public class UserDAOImpl implements UserDAO { 
    // Your implementations here 
    // ... 
} 

Hinweis: Ich habe die Object[] mit List<T> ersetzt und nicht T[] als Bei Generika ist das nicht möglich. Aber das ist kein Nachteil, es ist besser, integrierte Container zu verwenden.

+0

Ja, ich habe mit Array versaut. Ich wollte Array nicht über eine Liste verwenden. –

2

Nein. Die folgende Struktur wird sauber sein.

interface DAO { 
    void insert(); 
    void update(); 
    Object read(Integer id); 
    void delete(); 
} 

class DAOImpl implements DAO { 
    void insert(){} 
    void update(){} 
    Object read(Integer id){} 
    void delete(){} 
} 

class ItemDAO extends DAOImpl{ 
    public void addItem(Item i){ 
    insert(i); 
    } 
    public void updateItem(Item i){ 
    update(i); 
    } 
    public void removeItem(Item i){ 
    delete(i); 
    } 
    public Object getItem(int id){ 
    read(id); 
    } 
} 
1

Ich würde es nicht tun. Was ist, wenn Sie eine Tabelle haben, von der Sie nur lesen (vielleicht ein anderes Modul/Programm/etc aktualisiert es? Oder wenn es nur einige Einstellungen sind, die Sie einmal manuell einstellen und dann vergessen?). Oder was, wenn Sie in der Lage sein möchten, mehrere Elemente aus der gleichen Tabelle zu bekommen (vielleicht brauchen Sie nur die IDs für einige Dinge und das vollständige Objekt für etwas anderes)? Auch wenn es einfacher zu schreiben ist, sind die DAOs mit Schnittstelle schwieriger zu verwenden.

Ich glaube auch nicht wirklich Lesbarkeit ist besser. CarDAO.getItem(123) sagt Ihnen viel weniger als CarDAO.getCarById(123). Und Sie müssen es nicht überladen, wenn Sie Autos durch etwas anderes bekommen möchten (ja, Sie könnten gerade etwas machen, das nicht in der Schnittstelle ist, aber dann ist der Nutzen der Schnittstelle noch kleiner).