2015-08-06 14 views
5

Zastanawiam się, czy dobrą praktyką jest tworzenie domyślnego interfejsu DAO zamiast tworzenia własnego interfejsu dla każdej klasy.Tworzenie domyślnego interfejsu DAO

public interface DAO { 

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

Teraz możemy wdrożyć ten interfejs przez wiele klas. Oczywiście to rozwiązanie ma swoje minusy, takie jak downcasting podczas pobierania danych, ale myślę, że jest jeszcze bardziej wydajny i czysty. Czy to dobry sposób na odejście?

+1

Nie. Właśnie straciłeś bezpieczeństwo swojego typu. – canton7

Odpowiedz

6

Jest to dobry sposób, ale przynajmniej jeden poprawa może być wykonane przy użyciu rodzajowych:

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

Więc teraz nie trzeba będzie żadnych odlewów. Ale w każdym razie musisz upewnić się, że wszyscy DAO będą przynajmniej mieli te metody. W przeciwnym razie doprowadzi to do większej złożoności. Ponadto, jeśli istnieją pewne DAOs które będą miały właśnie dokładnie te metody, można skończyć z prawie zwartej czystego kodu, np:

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

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

Uwaga: Mam otrzymuje Object[] z List<T> i nie T[] jako nie można tego zrobić w przypadku leków generycznych. Ale to nie jest wadą, lepiej jest użyć wbudowanych pojemników.

+0

Tak, popsułem tablicę. Nie chciałem używać tablicy nad listą. –

2

Nie. Poniższa struktura będzie czysta.

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

Nie zrobiłbym tego. Co jeśli masz stół, z którego tylko czytasz (może jakiś inny moduł/program/etc go aktualizuje? Lub czy to tylko niektóre ustawienia, które chcesz ustawić ręcznie, a potem zapomnieć?). A jeśli chcesz mieć możliwość uzyskania wielu przedmiotów z tej samej tabeli (może potrzebujesz tylko identyfikatorów dla niektórych rzeczy i całego obiektu dla czegoś innego)? Choć może to być łatwiejsze do napisania, myślę, że z DAO z interfejsem są trudniejsze w użyciu.

Ja także nie uważam, że czytelność jest lepsza. CarDAO.getItem(123) mówi o wiele mniej niż CarDAO.getCarById(123). I nie musisz przeciążać go, jeśli chcesz, aby Samochody były czymś innym (tak, możesz zrobić coś, czego nie ma w interfejsie, ale wtedy korzyść z interfejsu jest jeszcze mniejsza).

Powiązane problemy