2015-08-06 20 views
5

Tôi tự hỏi nếu thực hành tốt để tạo giao diện DAO mặc định thay vì tạo giao diện riêng cho từng lớp.Tạo giao diện DAO mặc định

public interface DAO { 

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

Bây giờ chúng tôi có thể triển khai giao diện này bằng nhiều lớp. Tất nhiên sự sollution này có nhược điểm của nó như downcasting trong khi lấy dữ liệu nhưng tôi nghĩ rằng nó vẫn hiệu quả hơn và mã rõ ràng. Đây có phải là cách tốt để đi không?

+1

Không. Bạn vừa mất an toàn kiểu của mình. – canton7

Trả lời

6

Đó là một cách tốt, nhưng ít nhất một sự cải thiện có thể được thực hiện sử dụng Generics:

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

Vì vậy, bây giờ bạn sẽ không cần bất kỳ đúc. Nhưng dù sao, bạn phải chắc chắn rằng tất cả các DAO sẽ ít nhất có những phương pháp đó. Nếu không, điều đó sẽ dẫn đến nhiều phức tạp hơn. Hơn nữa, nếu có một số DAO mà sẽ có chỉ chính xác các phương pháp đó, bạn sẽ kết thúc với khá nhiều mã sạch nhỏ gọn, ví dụ:

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

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

Note: Tôi đã thay thế Object[] với List<T> và không T[] như bạn không thể làm điều đó trong trường hợp của generics. Nhưng đó không phải là một khuyết điểm, tốt hơn là sử dụng các thùng chứa có sẵn.

+0

Vâng tôi đã sai lầm với mảng. Tôi không có ý định sử dụng mảng trong danh sách. –

2

No. Sau cấu trúc bên dưới sẽ sạch sẽ.

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

Tôi sẽ không làm điều đó. Điều gì nếu bạn có một bảng mà bạn chỉ đọc từ (có thể một số module/chương trình/etc cập nhật nó? Hoặc nếu nó chỉ là một số cài đặt mà bạn muốn thiết lập một lần bằng tay và sau đó quên?). Hoặc những gì nếu bạn muốn để có thể nhận được nhiều mục từ cùng một bảng (có thể bạn chỉ cần các id cho một số điều và đối tượng đầy đủ cho cái gì khác)? Trong khi nó có thể dễ dàng hơn để viết, tôi nghĩ rằng DAO giao tiếp khó sử dụng hơn.

Tôi cũng không thực sự nghĩ rằng khả năng đọc là tốt hơn. CarDAO.getItem(123) cho bạn biết ít hơn nhiều so với CarDAO.getCarById(123). Và bạn không phải quá tải nó nếu bạn muốn có được chiếc xe bằng cái gì khác (có, bạn chỉ có thể làm một cái gì đó mà không có trong giao diện, nhưng sau đó lợi ích của giao diện thậm chí còn nhỏ hơn).

Các vấn đề liên quan