2011-01-25 33 views
10

Mã kích hoạt câu hỏi này là Dịch vụ trong cơ sở mã của công ty tôi chứa bốn DAO khác nhau. Tôi đã không nghĩ nhiều về điều này cho đến khi tôi thấy rằng Dịch vụ này đã trở nên bị xáo trộn với các phương pháp thuộc về một Dịch vụ hoàn toàn khác. Lý do cho việc tạo ra các phương pháp không được bảo đảm bên trong Dịch vụ này đơn giản chỉ vì DAO cần thiết là thành viên riêng của lớp Dịch vụ này.Mối quan hệ giữa Dịch vụ và DAO có phải là một hoặc một hay nhiều?

Đây có phải là sơ suất của nhà phát triển hay sai trong hầu hết các trường hợp có nhiều DAO cho mỗi lớp dịch vụ?

Lưu ý: Tôi nhận thấy rằng có vẻ hợp lý khi có nhiều hơn một DAO cho mỗi lớp Dịch vụ miễn là chúng được chứa trong cùng một cơ sở dữ liệu. Nhưng có DAO từ nhiều cơ sở dữ liệu có vẻ như nó có thể gây ra vấn đề.

Trả lời

14

Tôi thấy không có gì sai khi có nhiều DAO cho mỗi lớp dịch vụ. Khi tôi lần đầu tiên bắt đầu phát triển web cách đây nhiều năm, tôi có một dịch vụ DAO vì đó dường như là cách tiếp cận hợp lý và đơn giản nhất. Sau đó, tôi bắt đầu thấy các vấn đề trong đó có các API tương tự giữa các DAO phục vụ các dịch vụ khác nhau. Vì vậy, giải pháp "chưa trưởng thành" của tôi là quảng cáo các API phổ biến này cho một số DAO gốc để được kế thừa bởi các DAO này. Khi dự án phát triển, nó đã đến một điểm mà thừa kế không còn ý nghĩa gì nữa, bởi vì tôi có những tình huống mà 80% DAO trẻ em cần API đó nhưng 20% ​​không, nhưng chúng vẫn thừa kế từ cùng một bậc cha mẹ DAO vì họ chia sẻ các API tương tự khác. Bạn thấy vấn đề ở đây? Ý tôi là, trong Java, bạn chỉ có thể kế thừa từ một phụ huynh, vì vậy tôi đã kết thúc việc bổ sung các API mà "có thể" được sử dụng bởi "đa số" các DAO trong DAO gốc, hoàn toàn vi phạm nguyên tắc thừa kế ngay từ đầu.

Hiện tại, tất cả các lớp DAO của tôi đều có trách nhiệm/nhiệm vụ cụ thể. DAO có thể gọi một DAO khác (ví dụ, LoggingDAO được hầu hết DAO sử dụng để ghi lại các hành động của người dùng). Bằng cách này, thay vì có một DAO phục vụ một dịch vụ cụ thể, DAO cung cấp một danh sách các hoạt động có thể có lợi cho dịch vụ. Dịch vụ sẽ "sử dụng" bất kỳ DAO nào để nó thực hiện nhiệm vụ.

Hy vọng lời giải thích này sẽ hữu ích.

+0

Có. Trong trường hợp của tôi, tôi nghĩ rằng tôi đã đối phó với việc phát triển sơ suất nơi mọi người đang chuyển công cụ vào Dịch vụ dựa trên các lĩnh vực DAO của nó thay vì dựa trên ý định của Dịch vụ. – stevebot

+0

Ahh, các vấn đề về sự đa hình và tính đa hình phụ ... tất cả những điều đó sang một bên, giai thoại hay ;-) –

+0

Theo tôi, một Dịch vụ cung cấp một bộ dịch vụ cụ thể để xử lý một số hành động của người dùng. Các dịch vụ này có thể hoặc không thể sử dụng một DAO (s) để thực hiện công việc. Một DAO, mặt khác, cung cấp thông tin liên lạc giữa Dịch vụ và một cơ sở dữ liệu, nhưng nó không nên biết bất cứ điều gì về những gì yêu cầu của người dùng là tất cả về. Nếu nhà phát triển kết hợp cả hai thứ này lại với nhau, thì tôi không thấy điểm có Dịch vụ và DAO vì bạn chỉ có thể kết hợp tất cả lại với nhau, điều này thật tệ vì bạn không thể sử dụng lại toàn bộ mã. :) – limc

4

Một đến nhiều là tốt miễn là nó có ý nghĩa để chia nhỏ các DAO.

Một vài lý do tôi có thể nghĩ về nơi nó làm cho tinh thần để chia một DAO:

  • Cơ sở dữ liệu khác nhau. Nếu bạn đang xử lý một tài khoản và một cơ sở dữ liệu bán hàng, bạn có thể muốn tách DAO thành một SalesDAO và một AccountingDAO. Điều này sẽ giúp bảo trì dễ dàng hơn.
  • Sử dụng lại. Bạn có thể có một vài phương pháp có thể được tái sử dụng trên nhiều địa điểm và chia tách những phương thức sẽ cho phép sử dụng lại tốt hơn.
+0

+1 ... well nói. – limc

+0

@stevebot, cảm ơn chỉnh sửa – jzd

1

Tại một công ty tôi làm việc tại, họ có thiết kế đẹp nơi dịch vụ được gọi là bộ điều khiển và bộ điều khiển có thể gọi một lớp khác mà tôi không thể nhớ được, nhưng sau đó sẽ gọi DAO. Vì vậy, họ có cấp độ truy cập có thể gọi nhiều DAO, để thực hiện một chức năng bậc cao hơn, vì vậy, nếu bạn muốn làm một đơn đặt hàng, nó có thể yêu cầu nhiều bảng, và có lẽ một số hệ thống, bộ điều khiển sẽ gọi phương thức doOrder.

Đây là thiết kế đẹp vì nó giữ được cảm giác tách biệt và thực hiện thử nghiệm đơn vị đơn giản hơn, vì bạn có thể kiểm tra từng lớp.

Nếu dịch vụ của bạn có thể gọi nhiều DAO, khi đó việc kiểm tra đơn vị có thể khó khăn hơn, khi bạn làm cho lớp dịch vụ phức tạp hơn.

Vì vậy, khi bạn thiết kế các lớp của mình, hãy xem xét việc tạo lớp mới để đơn giản hóa thiết kế có thể phát hiện ra lỗi hoặc ngăn chặn lỗi hay không.

UPDATE:

Lớp thiếu là điều phối viên, và các quy tắc được rằng mỗi điều phối xử lý với một DAO, và có thể làm bất cứ biến đổi đó là cần thiết, nhưng logic kinh doanh là trong bộ điều khiển. Vì vậy, một điều phối viên có thể nói chuyện với bất kỳ điều phối viên khác, để có được thông tin, và những điều phối viên sẽ đi đến DAO.

+0

Tuy nhiên, nếu bạn đã tạo một lớp đại biểu để gọi nhiều DAO, bạn về cơ bản đã chuyển gánh nặng cho đại biểu này. Nếu thử nghiệm một dịch vụ với nhiều cuộc gọi DAO là khó khăn, điều này sẽ không khó khăn như vậy để kiểm tra đơn vị lớp đại biểu sau đó? – limc

+0

@limc - Tôi nhận ra phần còn lại của các quy tắc và tên, thực sự đơn giản hơn. Mùa xuân đã được sử dụng, vì vậy bạn có thể trao đổi trong các lớp giả, vì vậy nếu bạn muốn kiểm tra bộ điều khiển, bạn sẽ giả lập điều phối viên. –

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