2015-08-06 33 views
5

Mi chiedo se sia una buona pratica creare un'interfaccia DAO predefinita invece di creare la propria interfaccia per ogni classe.Creazione di un'interfaccia DAO predefinita

public interface DAO { 

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

Ora possiamo implementare questa interfaccia in più classi. Naturalmente questa soluzione ha i suoi lati negativi come il downcasting durante il recupero dei dati, ma penso che sia ancora più efficiente e chiaro. E 'un buon modo per andare?

+1

No. Hai appena perso la sicurezza del tuo tipo. – canton7

risposta

6

E 'un buon modo, ma almeno un miglioramento può essere fatto utilizzando farmaci generici:

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(); 
} 

Così ora non avranno bisogno di alcun casting. Ma comunque, devi assicurarti che tutti i DAO abbiano almeno quei metodi. Altrimenti ciò porterà a più complessità. Inoltre, se ci sono alcuni DAO che avranno esattamente questi metodi, si finisce con più o meno codice pulito compatto, ad esempio:

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

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

Nota: ho sostituito il Object[] con List<T> e non T[] come non puoi farlo in caso di generici. Ma questo non è un contro, è meglio usare contenitori integrati.

+0

Sì, ho incasinato l'array. Non intendevo usare array su una lista. –

2

No. La seguente struttura sarà pulita.

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

Non lo farei. Cosa succede se si ha una tabella da cui si legge solo (magari qualche altro modulo/programma/etc lo aggiorna? O se si tratta solo di alcune impostazioni che si desidera impostare una volta manualmente e poi dimenticare?). O se vuoi essere in grado di ottenere più oggetti dalla stessa tabella (forse hai solo bisogno degli id ​​per alcune cose e l'oggetto completo per qualcos'altro)? Mentre potrebbe essere più facile scrivere, penso che i DAO interfacciati siano più difficili da usare.

Inoltre, non penso che la leggibilità sia meglio. CarDAO.getItem(123) ti dice molto meno di CarDAO.getCarById(123). E non devi sovraccaricarlo se vuoi ottenere Cars da qualcos'altro (sì, potresti semplicemente creare qualcosa che non è nell'interfaccia, ma il vantaggio dell'interfaccia è ancora più piccolo).