Nếu không có logic nghiệp vụ để thực hiện, không có lý do gì để thực thi lớp kinh doanh. Kiến trúc 3 tầng không phải là một giao thức phức tạp, chỉ là một thực hành tốt nhất được hình thành giả định xử lý kinh doanh.
Trong ứng dụng hiện tại, chúng tôi thường truy cập DAO trực tiếp từ bộ điều khiển JSF khi không có quy trình nghiệp vụ nào liên quan. Ý tưởng được đưa ra bởi một số java champion, người nhấn mạnh ý tưởng rằng sự đơn giản là tối quan trọng.
Nếu bạn lo lắng về những sửa đổi trong tương lai có thể yêu cầu thêm logic nghiệp vụ. Tôi nghĩ về vấn đề theo cách này: Logic kinh doanh bổ sung sẽ được thêm vào lớp nghiệp vụ, bao gồm cả truy cập dữ liệu, vì vậy không có sự khác biệt ở đây.
Mã CRUD chủ yếu là rất đơn giản. Vì vậy, sự thay đổi trong dịch vụ sẽ phải định tuyến lại một cuộc gọi duy nhất hoặc một vài cuộc gọi fron DAO đến một EJB - một phép tái cấu trúc đơn giản. Bản thân mã CRUD vẫn sẽ vẫn còn, nhưng sẽ được đẩy vào EJB - một phép tái cấu trúc đơn giản khác.
Đây không phải là hoàn hảo, nhưng IMO tốt hơn sau đó thay thế: có một lớp indirection trống. Điều này làm tăng tính phức tạp mà không phục vụ mục đích nào. Đối tượng kinh doanh sẽ không làm gì ngoài việc chuyển tiếp các cuộc gọi đến DAO.
Có hai code smells mà tôi cho rằng áp dụng trong trường hợp này: độ phức tạp và feature envy.
Tôi không nói rằng DA trong lớp kinh doanh bằng cách nào đó là một mùi mã. Những gì tôi có nghĩa là có một đối tượng kinh doanh mà không không có gì khác nhưng proxy DAO là một mùi. Nó cũng giống như sự phức tạp - một cấu trúc dữ liệu/lớp kiến trúc bổ sung không phục vụ mục đích riêng - dường như có một DAL trong ứng dụng của bạn rồi.
Một khía cạnh khác cho việc xem xét của bạn sẽ là - điều đáng ngạc nhiên khi nhà phát triển thấy dịch vụ sử dụng DAO trực tiếp? Có 5 dịch vụ mà 2 người trong số họ truy cập DAO trực tiếp là khác nhau từ việc có 100 dịch vụ mà chỉ có một dịch vụ truy cập trực tiếp vào DAO. Trong trường hợp đầu tiên, sự đơn giản mã sẽ lớn hơn độ phức tạp khái niệm (2 khái niệm cho một điều), trong trường hợp thứ hai, tôi thà gắn bó với lớp nghiệp vụ - sự ngạc nhiên (còn gọi là hiệu ứng WTF);) thực hiện nó một cách khác biệt chỉ một lần sẽ là quá lớn.
Như thường lệ, tinh thể rõ ràng! Mặc dù câu hỏi là tự mâu thuẫn trong tự nhiên ('làm thế nào tôi có thể luôn bỏ qua tầng giữa trong một ứng dụng dựa vào nó'). – skuntsel
@skuntsel - cảm ơn :) Vâng, nếu DAO được coi là một phần của lớp kinh doanh thì bạn được sửa với 3 lớp - đối với tôi DAO là một phần của DAL, vì vậy tôi sẽ mất một lớp bằng lời nói giá rẻ lừa;) – kostja
Điều gì xảy ra nếu sau này bạn phải thêm một số doanh nghiệp trước khi thực hiện các hoạt động CRUD? nếu bạn thêm mã nghiệp vụ trong lớp Dịch vụ sai bởi vì các dịch vụ không nên có mã nghiệp vụ, vì vậy bạn phải thêm doanh nghiệp trong Lớp kinh doanh, thay đổi Dịch vụ để kinh doanh và thực hiện công việc của nó. kinh doanh. đó là một vấn đề tôi tin! –