2011-11-14 29 views
7

tôi đang bối rối về các cấu trúc tạo dịch vụ lớp và DAO lớp: trong một số ví dụ tôi thấy một số người tạo giao diện + thực hiện cho cả dịch vụ và DAO và trong các ví dụ khác tôi thấy người tạo thực hiện chỉ đặc biệt khi DAO kéo dài một lớp AbstractDao chứa phương pháp chung cho những DAO, do đó, tôi đang bối rối về những gì để đi cho, tại sao đến g o cho giải pháp này hoặc giải pháp khác, và thực hành tốt nhất (thường được sử dụng), xin vui lòng tư vấn cho.Tạo và lớp DAO (giao diện + implentation) hoặc implentation chỉ

Trả lời

6

Tôi đề xuất tạo giao diện cho dịch vụ và cho DAO. Rất thường xuyên bạn muốn thử dịch vụ trong các bài kiểm tra đơn vị mã, sử dụng serice này. Ngoài ra Spring, ví dụ, buộc bạn phải sử dụng giao diện khi bạn đang sử dụng một số proxy mùa xuân ví dụ cho các giao dịch. Vì vậy, bạn nên có một giao diện cho dịch vụ.

DAO là phần nội bộ hơn, nhưng tôi luôn cố gắng sử dụng giao diện để đơn giản hóa việc thử nghiệm.

+0

xin vui lòng bạn có thể cung cấp thêm chi tiết hơn nữa với ví dụ và tài liệu tham khảo, vì tôi cần thuận tiện cho một số đồng nghiệp. –

2

Tôi thích giao diện + hiện thực vì những lý do sau đây:

  • giao diện trở nên hợp đồng: họ cho bạn biết những gì có sẵn để gọi, và bạn không bao giờ lo lắng về việc thi hành, với điều kiện là kết quả dự kiến .
  • Bạn có thể tạo triển khai tùy chỉnh giao diện mà không cần phá vỡ các triển khai khác của cùng một giao diện (thường hữu ích khi viết kiểm tra đơn vị). Việc tùy chỉnh một lớp chỉ được triển khai có thể mang lại nhiều lỗi hơn bạn không thấy dễ dàng.
  • Nó tạo ra một khuôn khổ có thể được ghi lại.

Các lớp con được triển khai được sử dụng để tạo logic nghiệp vụ/ứng dụng phù hợp với hợp đồng giao diện.

+0

Còn nếu DAO mở rộng một BasicDao có chứa các phương thức chung cho các hoạt động CRUD, thì giao diện có quan trọng không, vì tôi có thể ghi đè các phương thức chung trong BasicDao? –

+0

Bạn có thể ghi đè phương thức nhưng chữ ký phương thức sẽ giống nhau. Về cơ bản, người dùng sẽ không biết rằng phương thức được phân lớp nhưng chỉ quan tâm đến dữ liệu được trả về từ Dịch vụ/DAO. –

+0

vì vậy nếu sử dụng một lớp AbstractDao chung với DAO, tốt hơn nên sử dụng giao diện. –

0

Giao diện + triển khai được sử dụng để có khớp nối lỏng lẻo. Bạn có thể linh hoạt thay đổi hoặc chuyển đổi triển khai dễ dàng mà không cần thay đổi lớn về mã.

Hãy suy nghĩ về một kịch bản mà bạn đang sử dụng Hibernate để lưu giữ lâu bền (DAO Layer) và bạn cần chuyển sang JPA hoặc iBatis hoặc bất kỳ ORM nào khác cho vấn đề đó.

Nếu bạn đang sử dụng giao diện, bạn có thể chỉ cần viết một triển khai cụ thể cho JPA và "cắm" nó thay cho Hibernate. Mã dịch vụ vẫn giữ nguyên.

+0

Còn nếu tôi đang sử dụng AbstractDao chứa các phương thức chung cho các hoạt động CRUD và tất cả các DAO mở rộng mà AbstractDao tôi đoán sẽ đủ hơn sử dụng giao diện với daos, hoặc tôi sẽ cần mở rộng BasicDao và triển khai giao diện cả hai? –

1

Tôi chỉ thực hiện triển khai lớp dịch vụ, không bận tâm với giao diện (ngoại trừ nơi tôi phải làm). Tôi có lẽ nên đi xung quanh để viết các giao diện, nhưng không có vấn đề cho đến nay. Tôi đang làm thử nghiệm đơn vị tốt mà không chế nhạo các lớp dịch vụ.

Ngoài ra, tôi không có lớp DAO, vì tôi đang sử dụng chế độ ngủ đông và có vẻ như quá mức cần thiết. Rất nhiều lý do của tôi dựa trên blog này, eloquently written by Bozho.

Tôi nghĩ rằng đó là quite debatable (dù có DAO và ngủ đông), tuy nhiên tôi khá hài lòng với quyết định của mình, tôi chuyển vào các đối tượng miền dày và sau đó thực hiện cuộc gọi đến phiên ngủ đông. Mỗi phương thức trên lớp dao theo nghĩa đen chỉ là một dòng (session.persist (mObject), hoặc tương tự).

Một đối số mà tôi nghe được là một lớp dao sẽ giúp thay đổi/xóa orm dễ dàng hơn sau này. Tôi không chắc chắn nếu thời gian dành mã hóa lớp dao ở nơi đầu tiên thêm vào thời gian mã hóa sự thay đổi, sẽ ít hơn mã hóa sự thay đổi mà không cần lớp dao riêng của mình. Tôi chưa bao giờ phải thay đổi công nghệ ORM ở bất kỳ nơi nào tôi làm việc để có một rủi ro nhỏ.

+0

để bạn sử dụng các phương thức ngủ đông bên trong lớp dịch vụ trực tiếp? –

+1

Tôi sẽ làm như vậy. Bắt đầu với việc triển khai và giới thiệu giao diện khi có nhiều triển khai sẽ xuất hiện. Tuy nhiên, nếu dịch vụ được hiển thị cho nhiều khách hàng ngay từ đầu - thì việc giới thiệu giao diện có vẻ hợp lý. –

+0

@fresh_dev yep, sẽ chỉnh sửa câu trả lời bằng một vài tham chiếu – NimChimpsky

0

Một lý do khác cho giao diện + thực hiện mô hình là proxy cho các giao diện được hỗ trợ bởi Java bản thân khi tạo proxy cho việc triển khai đòi hỏi sử dụng thư viện như cglib. Và proxy này là cần thiết để hỗ trợ giao dịch, vv

1

Từ quan điểm của tôi khi bạn nói Dịch vụ bạn nên có giao diện và nếu bạn không thể cung cấp hoặc sẽ không cung cấp đó, sau đó bạn không có hợp đồng giữa dịch vụ và người tiêu dùng và không còn là dịch vụ nữa, bạn có thể gọi nó là bất cứ điều gì khác

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