2015-08-06 16 views
5

Her sınıf için kendi arabirimi oluşturmak yerine varsayılan DAO arabirimini oluşturmak iyi bir uygulama olup olmadığını merak ediyorum.Varsayılan bir DAO arabirimi oluşturma

public interface DAO { 

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

Şimdi bu arabirimi birden çok sınıfta uygulayabiliriz. Tabii ki, bu bilgi alma, veriyi alırken dezavantajlı gibi gözüküyor ama bence hala daha verimli ve kod açık. Bu gitmek için iyi bir yol mu?

+1

Hayır. Tür güvenliğinizi yeni kaybettiniz. – canton7

cevap

6

Bu iyi bir yoldur, ama en az bir iyileşme eşdeğer ilaç kullanımıyla yapılabilir:

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

Yani şimdi herhangi casting gerek kalmayacaktır. Ama yine de, tüm DAO'ların en azından bu yöntemlere sahip olmasını sağlamalısınız. Aksi takdirde bu daha karmaşıklığa yol açacaktır.

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

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

Not: sadece tam bu yöntemleri olacaktır bazı DAOs varsa Üstelik, hemen hemen kompakt temiz kod, örneğin ile sona erecek ben List<T> ile Object[] değil T[] olarak yerini almıştır Jenerikler durumunda bunu yapamazsınız. Ama bu bir eksiler değil, yerleşik konteynerleri kullanmak daha iyidir.

+0

Evet diziyle karıştırdım. Bir liste üzerinde dizi kullanmak istemedim. –

2

Hayır. Aşağıdaki aşağıdaki yapı temiz olacaktır.

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

Bunu yapmazdım. Sadece okuduğunuz bir tablonuz varsa (belki başka bir modül/program/vb. Güncelleştirir mi? Ya da sadece bir kez ayarlamak istediğiniz bazı ayarlar ve sonra unutmak?). Ya da aynı tablodan birden fazla öğe alabilmeniz için ne istersen (belki de sadece bazı şeylerin ve başka bir şey için tüm nesnenin kimliğine ihtiyacın var)? Yazmak daha kolay olsa da, arayüzlü DAO'ların kullanımı daha zor olduğunu düşünüyorum.

Ayrıca okunabilirliğin daha iyi olduğunu düşünmüyorum. CarDAO.getItem(123), CarDAO.getCarById(123)'dan çok daha azını size bildirir. Arabaları başka bir şeye göre almak istiyorsanız, aşırı yüklemeniz gerekmez (evet, sadece arayüzde olmayan bir şey yapabilirsiniz, ancak daha sonra arayüzün yararı daha da küçüktür).