2011-08-29 49 views
38

Điều gì sẽ là cách tốt nhất để thiết kế một lớp DAO?Làm thế nào để thiết kế một lớp DAO?

Approach # 1:Thiết kế lớp DAO như một đối tượng.

class Customer { 
//customer class 
} 

class CustomerDAO { 
    public void saveCustomer(Customer customer) { 
    //code 
    } 

    public Customer getCustomer(int id) { 
    //code 
    } 
} 

//Client code 
class client { 
    public static void main(String[] args) { 

    CustomerDAO customerDAO = new CustomerDAO(); 
    Customer customer = new Customer(); 
    customerDAO.saveCustomer(customer); 
    } 
} 

Cách tiếp cận # 2:lớp Thiết kế DAO với các phương pháp tĩnh (lớp aka tĩnh)

class Customer { 
//customer class 
} 

class CustomerDAO { 
    public static void saveCustomer(Customer customer) { 
    //code 
    } 

    public static Customer getCustomer(int id) { 
    //code 
    } 
} 

//Client code 
class client { 
    public static void main(String[] args) { 

    Customer customer = new Customer(); 
    CustomerDAO.saveCustomer(customer); 
    } 
} 

Trong phương pháp # 1, tôi phải tạo một đối tượng của lớp DAO trong tất cả các mã khách hàng (tùy chọn khác là để vượt qua các tài liệu tham khảo của DAO tất cả các xung quanh). trong khi tiếp cận # 2, tôi không phải tạo đối tượng và các phương thức tĩnh có thể được thiết kế mà không theo dõi trạng thái.

Vậy cách tiếp cận nào là tốt nhất trong thiết kế các lớp DAO?

+4

Sử dụng phương pháp # 1 và tiêm tham chiếu đến nó sử dụng một container IOC như Spring –

+3

Thật lạ khi không ai đề cập đến một hướng dẫn tốt và thông tin như vậy bởi [BalusC] (http://stackoverflow.com/users/157882/balusc): [DAO tutorial - the dat một lớp] (http://balusc.blogspot.com/2008/07/dao-tutorial-data-layer.html). Đọc nó và bạn sẽ tìm thấy câu trả lời cho nhiều DAO thiết kế và thực hiện các câu hỏi liên quan. – informatik01

Trả lời

37

Tôi khuyên bạn nên tiếp cận # 1, nhưng sẽ sử dụng Spring để tiêm phụ thuộc hơn là tạo DAO trực tiếp.

Bằng cách này, để kiểm tra đơn vị mã máy khách, bạn có thể thay thế DAO giả, và xác minh rằng các DAO chính xác được gọi với các đối số thích hợp. (Mockito hữu ích ở đây.)

Nếu bạn sử dụng các phương pháp tĩnh, thì việc kiểm tra đơn vị sẽ khó khăn hơn nhiều, vì các phương thức tĩnh không thể bị ghi đè.

+5

+1 Tôi quá lười để tự mình viết câu trả lời này. Nhưng nó sẽ là khá giống với điều này :-) –

+0

Điều gì xảy ra nếu một trong những khách hàng (người dùng) từ đối tượng DAO đại diện cho khách hàng đăng nhập hiện tại (người dùng). Bạn có cung cấp phương thức như getCurrentCustomer() hay nó sẽ trong suốt đối với lớp DAO và người dùng này luôn được lấy theo id? – Piotr

+1

@Piotr Tôi nghĩ rằng DAO không nên được quan tâm đến từ người mà yêu cầu có nguồn gốc. –

6

Tôi cũng sẽ chọn tùy chọn 1 nhưng tôi cũng khuyên bạn nên lập trình cho giao diện. Tạo một giao diện để thiết lập các chức năng mà DAO cung cấp và sau đó bạn có thể triển khai các lớp có các lớp khác nhau tùy theo nhu cầu của bạn.

public interface CustomerDao { 
    public void saveCustomer(Customer customer); 

    public Customer getCustomer(int id); 
} 

Sau đó, bạn có thể có class SimpleCustomerDao implements CustomerDAO {/*code here*/}.

Trong main của bạn (và ở khắp mọi nơi khác mà bạn cần nó), bạn sẽ có:

//Note that you have an interface variable and a real class object 
CustomerDao customerDao = new SimpleCustomerDao(); 

Bạn có thể tìm ra những lợi ích để làm điều này!

Và có, nếu bạn sử dụng Spring hoặc Guice thì hãy sử dụng tính năng Dependency Injection!

5

Tham khảo bài viết làm thế nào để viết một DAO chung (sử dụng Spring AOP): Don't repeat the DAO!

Bạn có thể tìm thấy ví dụ về triển khai DAO chung cho đống công nghệ của bạn (chỉ cần google "Đừng lặp lại my_technology DAO") .

+0

Cảm ơn bạn đã tham khảo. – nibin012

0

tôi sẽ thích phương pháp tiếp cận Layered, và gì Cách tiếp cận này chỉ đơn giản là cho chúng tôi biết là:

  1. Bạn đang có mô hình của bạn lớp Customer
  2. Bạn đang có một hợp đồng với khách hàng thông qua giao diện CustomerDAO

    public interface CustomerDAO{ 
    
        public void saveCustomer(Customer customer); 
        public Customer getCustomer(int id); 
    } 
    
  3. Bạn đang có triển khai cụ thể như CustomerDAOImpl

    public class CustomerDAOImpl extends CustomerDAO{ 
    
        public void saveCustomer(Customer customer){ 
         saveCustomer(customer); 
        } 
    
        public Customer getCustomer(int id){ 
         return fetchCustomer(id); 
        } 
    } 
    

Rồi Viết Manager để Quản lý những hay Encapsulating một số DAO khác như:

public class ManagerImpl extends Manager{ 
    CustomerDAO customerDAOObj; 

    // maybe you need to collect 
    // all the customer related activities here in manger 
    // because Client must not bother about those things. 

    UserBillingDAO userBillingDAOObj; 

    public void saveCustomer(Customer customer){ 
     customerDAOObj.saveCustomer(customer); 
    } 

    public Customer getCustomer(int id){ 
     return customerDAOObj.fetchCustomer(id); 
    } 

    // Note this extra method which is defined in 
    //UserBillingDAO which I have not shown, but you are exposing 
    //this method to your Client or the Presentation layer. 

    public boolean doBillingOFCustomer(id) { 
     return userBillingDAOObj.doBilling(id); 
    } 
} 

Bây giờ các lớp trình bày hoặc các lớp chính sẽ chứa mã như thế này:

public static void main(String... ar){ 
    Manager manager = new ManagerImpl(); 
    manager.saveCustomer(); 
    // or manager.doBillingOfCustomer(); // etc 
} 
+0

'public void saveCustomer (Khách hàng của khách hàng) {saveCustomer (khách hàng); } 'LOL + bạn có lỗi như' khách hàng công khai getCustomer (int id); 'và sau đó' customerDAOObj.fetchCustomer'. Chưa kể đến định dạng của bạn ... Sửa chữa những thứ đó - -1 cho đến lúc đó –

11

Để có nhiều trừu tượng hơn:

interface IDAO<T> { 

    public save(T t); 
    public T getById(int id); 
    //...etc 

} 

sau đó

và DAO khác miền

public UniversityDao implements IDAO<University>{ 

    public save(University u){ 
     //Code here 
     } 
    public University getById(int id){ 
     //Code here 
    } 
} 

Bây giờ các lớp trình bày hoặc các lớp chính sẽ chứa mã như thế này:

IDAO dao; 
dao=new CustomerDao(); 
//... 
dao=new UniversityDao(); 
Các vấn đề liên quan