Các đối tượng kiên trì-không biết gì có thể thực hiện tải lười biếng?


12

Sự thiếu hiểu biết dai dẳng là một ứng dụng của nguyên tắc trách nhiệm duy nhất, trong thực tế có nghĩa là các Đối tượng miền ( DO ) không nên chứa mã liên quan đến sự kiên trì, thay vào đó chúng chỉ nên chứa logic miền.

a) Tôi giả sử điều này có nghĩa là mã liên hệ với các lớp thấp hơn (tức là các lớp bền vững) nằm ngoài mô hình miền trong các lớp khác ( OC ) của lớp logic nghiệp vụ?

b) Nếu giả định của tôi theo a) là đúng, thì DO , giả sử Customer, không bao giờ chứa các phương thức như GetCustomershay GetCustomerByID?

c) Nếu các giả định của tôi theo a)b) là chính xác và giả sử Customerđối tượng miền sử dụng tải lười biếng cho một số thuộc tính của nó, thì tại một số điểm Customerlogic bên trong phải liên hệ với OC , từ đó lấy ra dữ liệu bị loại bỏ. Nhưng nếu Customercần liên hệ với OC để nhận dữ liệu bị hủy, thì chúng tôi thực sự không thể khẳng định rằng Đối tượng miền không chứa logic liên quan đến tính bền bỉ?!

Cảm ơn bạn

TRẢ LỜI jkohlhepp

1) Tôi giả sử OrderProviderCustomerProvidercác lớp được chứa trong lớp logic nghiệp vụ?

2) Tôi thu thập từ câu trả lời của bạn rằng các giả định của tôi theo b) có đúng không?

3)

... Tôi sẽ kiểm tra xem liệu một số trường đơn hàng tư nhân đã được điền hay nếu nó là null. Nếu nó là null ...

Nhưng theo như tôi có thể nói, ngay khi mã miền cần kiểm tra xem ordertrường riêng có được điền hay không và nếu không, liên hệ với OrderProvider, chúng tôi đã vi phạm nguyên tắc PI ?!

Câu trả lời:


4

Tôi tin rằng bạn đã đúng trong các giả định của bạn A và B xung quanh sự thiếu hiểu biết dai dẳng.

Làm thế nào bạn có thể thực hiện tốt nhất việc lười tải các đối tượng cơ sở dữ liệu phụ thuộc rất nhiều vào vấn đề và việc triển khai cụ thể của bạn. Tuy nhiên, tôi sẽ cố gắng trả lời chung chung về cách tải lười biếng trong khi vẫn duy trì sự tách biệt mối quan tâm giữa các lớp logic và tính bền vững.

Tôi có xu hướng thực hiện sự thiếu hiểu biết dai dẳng bằng cách sử dụng các lớp sau:

  • Các lớp miền - ví dụ: Khách hàng
  • Các lớp nhà cung cấp / kho lưu trữ - ví dụ: CustomerProvider
  • Các lớp truy vấn cơ sở dữ liệu chung - ví dụ: DatabaseQuery

Lớp DatabaseQuery sẽ chịu trách nhiệm sử dụng trình điều khiển cơ sở dữ liệu để truy vấn cơ sở dữ liệu và tập hợp dữ liệu kết quả thành một tập kết quả chung như DataTable. CustomerProvider sẽ chịu trách nhiệm sử dụng lớp DatabaseQuery để thực thi SQL dựa trên cơ sở dữ liệu và sử dụng các kết quả của SQL đó để tập hợp các cá thể của Khách hàng. Khách hàng sẽ là đối tượng miền "thuần túy" chứa dữ liệu và logic liên quan đến khách hàng.

Về việc các lớp nhà cung cấp nên ở tầng doanh nghiệp hay tầng dữ liệu, tôi không có ý kiến ​​mạnh mẽ. Tôi có thể thấy một trường hợp cho cả hai. Phần quan trọng là bạn phân tách trách nhiệm giữa các lớp.

Vì vậy, bây giờ hãy thảo luận về tải lười biếng. Giả sử tôi muốn Khách hàng có một bộ sưu tập Đơn hàng, nhưng tôi không muốn rút Đơn hàng ra khỏi cơ sở dữ liệu trừ khi người tiêu dùng cố gắng truy cập chúng. Tôi sẽ tạo một tài sản trên Khách hàng gọi là Đơn hàng. Trong getter của tài sản đó, tôi sẽ kiểm tra xem liệu một số trường đơn đặt hàng riêng đã được điền hay nếu nó là null. Nếu nó là null, hãy tải các đơn đặt hàng từ cơ sở dữ liệu bằng OrderProvider. Nếu không, chỉ cần trả lại bộ sưu tập đã được tải.

Theo tôi, nhu cầu Khách hàng liên hệ với OrderProvider không vi phạm PI. Khách hàng vẫn không biết làm thế nào để nhận được đơn đặt hàng. Nó chỉ biết rằng nó lấy chúng từ OrderProvider. Có thể có những lý do khác để tách khách hàng khỏi OrderProvider, nhưng tôi không nghĩ PI là vấn đề ở đây.

Điều này giả định rằng bạn đang thực hiện sự thiếu hiểu biết bằng tay. Nếu bạn đang sử dụng khung ORM như Entity Framework hoặc Hibernate, thì những khung đó thường có các tính năng để hỗ trợ tải tự động lười biếng.


xin chào, trong trường hợp bạn tìm thấy thời gian - Tôi đã chỉnh sửa bài đăng của mình để trả lời câu trả lời của bạn
user1483278

1
@ user1483278 Tôi đã chỉnh sửa câu trả lời của mình để hy vọng giải quyết những câu hỏi đó.
RationalGeek

PI có nghĩa là gì?
Kugel

Sự thiếu hiểu biết dai dẳng
RationalGeek

2

Bạn chỉ có một số lớp dây kết nối các đối tượng miền (giả sử, một cái gì đó gọi là "kho lưu trữ"). Bạn có thể thực hiện tải lười biếng hoặc bất kỳ loại sơ đồ kết hợp bộ đệm nào bạn muốn và các đối tượng miền không phải là khôn ngoan hơn. Bạn đang phân tách trách nhiệm của việc điền các đối tượng miền khỏi các đối tượng miền.

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.