2013-04-25 33 views
8

Chúng tôi có 3 lớp ứng dụng mà mỗi cuộc gọi từ lớp dịch vụ đi đến lớp kinh doanh và peresist bởi lớp dữ liệu. Các thành phần của mỗi lớp chỉ có thể gọi lớp dưới đây;Trong kiến ​​trúc nhiều lớp, tôi có thể bỏ qua lớp kinh doanh để thực hiện các hoạt động không?

Tuy nhiên, vì chúng tôi có hàng trăm thực thể và chúng tôi có rất nhiều dịch vụ liên quan đến operatins crud nên nhiều contoverseries lớn lên trong nhóm của chúng tôi.

Một số người tin rằng vì lợi ích của việc bảo trì và dễ phát triển, tốt hơn nên gọi truy cập dữ liệu từ các dịch vụ crud chỉ hoạt động crud và bỏ qua lớp kinh doanh. Ngược lại, một số người nói rằng chúng ta phải tạo trình bao bọc để truy cập dữ liệu của từng thực thể trong lớp nghiệp vụ và gọi các trình bao bọc này từ các dịch vụ và không bao giờ cho phép các dịch vụ gọi lớp truy cập dữ liệu.

Trong ý tưởng của bạn, chúng tôi nên thực hiện theo cách nào? Có ok cho các dịch vụ crud để gọi truy cập dữ liệu và bỏ qua lớp kinh doanh không?

Trả lời

5

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.

+2

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

+1

@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

+0

Đ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! –

0

Nếu bạn chỉ có các hoạt động CRUD, bạn có thể sử dụng Dịch vụ dữ liệu để xuất bản tập dữ liệu của bạn dưới dạng dịch vụ web. Một ví dụ điển hình là WSO2 Data Services http://wso2.com/products/data-services-server/

3

Theo tôi, việc gọi dịch vụ CRUD bỏ qua lớp nghiệp vụ sẽ bắt đầu chuyển đổi lớp dịch vụ hiện tại thành lớp kinh doanh khi bạn tăng chức năng. Vì vậy, lớp dịch vụ của bạn sẽ hoạt động như lớp kinh doanh, nếu bạn ổn với nó.

Trong hầu hết các trường hợp, bạn đối phó với một thực thể và có thể điều đó có thể liên quan đến nhiều cuộc gọi crud lớp dữ liệu, trên một bản cập nhật chẳng hạn. Một lớp kinh doanh được khuyến khích cho mục đích này. Và lớp kinh doanh là nơi để thực hiện bất kỳ quy tắc kinh doanh, bộ nhớ đệm hoặc gọi các dịch vụ kinh doanh khác nếu cần thiết. Điều này sẽ giữ cho lớp trên đơn giản và đi qua.

+0

Mối quan tâm chính của tôi là không cho phép lớp dịch vụ trở thành lớp kinh doanh. bên cạnh như @ kostja nói và tôi nghĩ rằng nó đúng "có một đối tượng kinh doanh mà không có gì khác nhưng proxy DAO là một mùi". Tôi thực sự quan tâm đến quyết định của bạn nếu bạn phải đi theo con đường mà bạn sẽ tiếp cận? proxy các doa trong lớp kinh doanh hoặc gọi dao từ lớp dịch vụ? –

+0

Nếu bạn nghĩ rằng có thể có bất cứ điều gì khác bạn muốn làm khác hơn là kêu gọi hoạt động crud bây giờ hoặc trong tương lai tôi hỗ trợ mạnh mẽ đi qua một lớp kinh doanh. Điều đó quy định số lượng mã hoặc tái cấu trúc bạn sẽ cần phải thực hiện sau này. Nếu bạn nghĩ rằng đó là một khả năng từ xa thì chỉ cần sử dụng DAO mà không cần bất kỳ proxy nào. Chỉ có bạn mới có thể phán xét điều đó. – techuser

+0

Vì vậy, bạn đồng ý với việc bỏ qua lớp Doanh nghiệp trong các Hoạt động của cuộc trò chuyện. do đó bạn đang nói thiết kế ứng dụng xuyên vì mục đích đơn giản không phải là một vấn đề? tuy nhiên kinh nghiệm của tôi cho thấy nếu tôi loại bỏ tham chiếu DA từ dự án của lớp dịch vụ, các nhà phát triển mã sạch hơn nhiều để cho phép họ truy cập DA trong Lớp dịch vụ! họ có thể lạm dụng quyền truy cập và trộn doanh nghiệp trong ServiceLayer! bạn không nghĩ vậy sao? –

1

Tôi sẽ không bỏ qua lớp doanh nghiệp. Mặc dù nó có thể giống như bạn chỉ proxy các cuộc gọi cho DAL vào BL, và mặc dù điều này có thể là một trường hợp hoạt động CRUD rất đơn giản, BL có thể đóng gói logic xác nhận cần thiết cho hoạt động. Logic xác thực có thể được thực hiện trên BL và proxy thành DAL sẽ chỉ được thực hiện nếu các điều kiện hợp lệ được đáp ứng.

+0

Điều gì sẽ xảy ra nếu các lớp và tầng của bạn tương ứng? –

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