Lớp dịch vụ ứng dụng gọi các chức năng cơ sở dữ liệu. Kiến trúc xấu?


11

Kịch bản:

  • Ngăn xếp: Java, Spring, Hibernate.
  • Mô hình: Ứng dụng Máy khách-Máy chủ.
  • Mẫu: Model-View-Controller (MVC).

Các lớp lớp dịch vụ có ba hành vi:

  1. Một số dịch vụ có quy tắc kinh doanh trong các phương thức và ủy thác sự kiên trì cho ứng dụng. Giống:

    EntityManager.save (thực thể);

  2. Một số dịch vụ chỉ cần gọi một hàm cơ sở dữ liệu (truyền tham số) Giống như:

    CallableStatement cls = con.prepareCall ("{gọi cơ sở dữ liệu hàm (args)}");

  3. Một số dịch vụ có phương pháp với cả hai hành vi.

Những câu hỏi của tôi:

  1. Có bất kỳ vấn đề trong việc có các dịch vụ ứng dụng gọi - trực tiếp - chức năng cơ sở dữ liệu? Đây không phải là thực hành xấu? Điều gì sẽ là một mô hình kiến ​​trúc áp dụng cho một dự án như thế này?
  2. Có bất kỳ vấn đề trong việc kết hợp hành vi trong cùng một dịch vụ không? Chẳng hạn như giao dịch và tính nhất quán?
  3. Trong trường hợp bảo trì, việc đóng gói này có làm cho nhà phát triển mơ hồ rằng anh ta cũng nên thay đổi các chức năng trong cơ sở dữ liệu không? Làm thế nào để tránh điều này?
  4. Liệu kịch bản này xảy ra trong các ứng dụng khác trên toàn thế giới hay đó chỉ là một lỗi kiến ​​trúc?

Câu hỏi này tương tự nhưng không hoàn toàn giống nhau .. softwareengineering.stackexchange.com/questions/180012/
mẹo

Câu trả lời:


7

Có bất kỳ vấn đề trong việc có các dịch vụ ứng dụng gọi - trực tiếp - chức năng cơ sở dữ liệu? Đây không phải là thực hành xấu?

Tôi nghĩ có. Bạn đang đặt một kiến ​​thức về các cơ sở dữ liệu bên trong dịch vụ ứng dụng. Thay đổi cơ sở dữ liệu theo bất kỳ cách nào (thay đổi công cụ lưu trữ hoặc thậm chí đổi tên trường hoặc tạo chỉ mục) có thể yêu cầu bạn thay đổi dịch vụ ứng dụng và vi phạm SRP .

Điều gì sẽ là một mô hình kiến ​​trúc áp dụng cho một dự án như thế này?

Xem bình luận dưới đây.

Có bất kỳ vấn đề trong việc kết hợp hành vi trong cùng một dịch vụ không? Chẳng hạn như giao dịch và tính nhất quán?

Tôi không tin rằng có một vấn đề kỹ thuật, nhưng có một vấn đề hợp lý. Bạn chỉ cần trộn hai cách tiếp cận trong ứng dụng làm cho nó mơ hồ, ít cấu trúc, khó thích ứng với các thay đổi. Xem ý kiến ​​trên về việc vi phạm SRP cũng.

Trong trường hợp bảo trì, việc đóng gói này có làm cho nhà phát triển mơ hồ rằng anh ta cũng nên thay đổi các chức năng trong cơ sở dữ liệu không?

Chắc chắn là có.

Làm thế nào để tránh điều này?

Đặt các phương thức và hàm, trực tiếp làm việc với cơ sở dữ liệu vào một mức độ trừu tượng riêng biệt (có thể là lớp DAO hoặc mẫu kho lưu trữ đơn giản - tùy thuộc vào độ phức tạp của ứng dụng của bạn)

Liệu kịch bản này xảy ra trong các ứng dụng khác trên toàn thế giới hay đó chỉ là một lỗi kiến ​​trúc?

Tôi nghĩ trong thế giới của chúng ta mọi thứ xảy ra;)


Nếu tôi hiểu chính xác, có thể có một vấn đề kỹ thuật ở chỗ nếu các cập nhật xảy ra trong các chức năng / lưu trữ procs và cũng thông qua ORM, trạng thái của một giao dịch nhất định rất khó để giải thích. Mặc dù ứng dụng có thể hoạt động ở trạng thái hiện tại, một thay đổi nhỏ có thể dẫn đến một số vấn đề thực sự lớn. Kinh nghiệm của tôi với Hibernate là nếu bạn không để nó quản lý toàn bộ bộ bảng mà nó hoạt động, bạn sẽ gặp rất nhiều vấn đề gây phiền nhiễu.
JimmyJames 7/12/2016

câu trả lời hay và súc tích. SRP là điều đầu tiên tôi nghĩ đến khi lần đầu tiên nhìn vào mã. Một số đồng nghiệp nói rằng phương pháp này không vi phạm SRP do thực tế là nó chỉ gọi hàm cơ sở dữ liệu. Nhưng một số chức năng đó chọn, chèn và cập nhật. Vì vậy, nó có hay không vi phạm SRP? (có lẽ đây là một câu hỏi khác để thảo luận riêng rẽ?)
linuxunil 7/12/2016

1
+1 cho dòng đó tôi nghĩ trong thế giới của chúng ta mọi thứ xảy ra;)
linuxunil

@linuxunil SRP nên được tôn trọng trên tất cả các cấp độ kiến ​​trúc. Trong trường hợp của tôi, tôi có nghĩa là SRP ở cấp độ dịch vụ, không phải ở cấp độ phương thức. @ JimmyJames Yep. Hầu hết các ORM không hoạt động tốt với các thủ tục được lưu trữ. Nhưng đôi khi lưu trữ proces là cần thiết.
Vladislav Rastrusny

3

Theo những gì bạn nói có một lớp dịch vụ nên mô hình kiến ​​trúc có vẻ phù hợp là Layered Architecture. Tham khảo thêm

Vâng, đó thường là một thực tiễn xấu khi thực hiện các cuộc gọi cơ sở dữ liệu trực tiếp trên một lớp khác ngoài lớp truy cập dữ liệu, theo cách đó, lớp nghiệp vụ chỉ truy cập một sự trừu tượng hóa của cơ sở dữ liệu.

Đối với các hành vi trộn, sử dụng một số mẫu thiết kế làm mẫu DAO hoặc mẫu Kho lưu trữ có thể giúp ủy thác các trách nhiệm đó do đó cải thiện mã đó.

Một số ưu điểm của việc sử dụng mẫu thiết kế và ORM là khả năng đọc mã của bạn, việc đóng gói các trách nhiệm vì vậy nếu quyền truy cập cơ sở dữ liệu của bạn thay đổi thì lớp doanh nghiệp của bạn sẽ không thay đổi nhiều.


Không chắc chắn tại sao điều này đã được bỏ phiếu. Câu trả lời này khuyến nghị táchliên quan đến các mối quan tâm khác nhau . Cảm thấy như một hiệu trưởng lập trình ở đây ... không chắc đó là gì ... Đàn ông. Giá như tôi có thể nghĩ ra cái tên. +1 BTW
Greg Burghardt

Nó không phải là một trong những nguyên tắc vững chắc sao?
J. Pichardo 7/12/2016

3
Không. "S" trong RẮN là Hiệu trưởng Trách nhiệm của S ingle (SRP). Nhưng Tách biệt các mối quan tâm, mà bạn đang đề xuất, là một lý do hợp lệ để tách logic dịch vụ khỏi logic truy cập dữ liệu. Câu trả lời khác của Vladislav đề cập đến Hiệu trưởng Trách nhiệm duy nhất. Thành thật mà nói, SRP và Tách biệt mối quan tâm kết hợp tốt với nhau, như rượu vang và phô mai.
Greg Burghardt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.