5

Tôi đã đọc một cuốn sách về thiết kế điều khiển tên miền, nó có tiêu đề Mẫu, Nguyên tắc và Thực tiễn về Thiết kế Điều khiển Miền (PPPDDD). Tôi đã rất thích đọc nó cho đến nay, và nó mang lại rất nhiều hiểu biết về DDD trong thế giới .NET. Tuy nhiên, có một điều làm phiền tôi rất nhiều. Trong chương 21 (mẫu Repository), tác giả thực hiện hai yêu cầu sau đây:Mẫu kho lưu trữ là thủ tục, không phải là OOP?

yêu cầu bồi thường 1:

Các kho không phải là một đối tượng. Nó là một ranh giới thủ tục và một hợp đồng rõ ràng đòi hỏi nhiều nỗ lực khi đặt tên các phương thức trên nó như là các đối tượng trong mô hình miền của bạn.

yêu cầu bồi thường 2:

Các kho là hợp đồng giữa mô hình miền và các cửa hàng kiên trì. Nó chỉ nên được viết dưới dạng miền và không có ý nghĩ về khung kiên trì cơ bản. Xác định ý định và làm cho nó rõ ràng; không xử lý hợp đồng kho lưu trữ như mã hướng đối tượng.

Vì vậy, mẫu lưu trữ không phải là OOP, mà là thủ tục? Bạn có đồng ý với những tuyên bố của tác giả cuốn sách này không? Tại sao phải rõ ràng về các phương thức lưu trữ, chẳng hạn như findByUsername (string Username) làm cho thủ tục lưu trữ trong tự nhiên?

Tôi muốn viết mã OO, không phải mã thủ tục. Nếu kho chứa là thủ tục, nó sẽ giết chết mục đích của tôi bằng cách sử dụng mẫu này. Tôi thực sự hy vọng những gì tác giả nói là không đúng sự thật, bạn nghĩ sao?

btw, tôi đã cung cấp ảnh chụp nhanh của bộ phận, trong đó tác giả cuốn sách khẳng định kho được thủ tục dưới đây, hãy nhìn vào họ nếu nó giúp: Book Snapshot Book Snapshot2

+2

Tác giả ngụ ý đơn giản là bạn không nên thiết kế hợp đồng kho lưu trữ với OCP trong đầu, cho phép truyền các đối tượng truy vấn tùy ý. – plalx

+0

Đúng, mặc dù tác giả đưa ra một số tuyên bố kỳ lạ, điểm chính của họ có vẻ là "khi thực hành DDD không triển khai mẫu IRepository không linh hoạt, thay vào đó sử dụng các phương thức truy vấn rõ ràng mô hình các yêu cầu dữ liệu của miền". –

Trả lời

6

Kho không phải là đối tượng. Đây là ranh giới thủ tục

Tôi hoàn toàn không đồng ý với điều này. Kho lưu trữ là tập hợp các thứ.

Nếu bạn GetAll() thì Add() một thứ gì đó vào một lần nữa và sau đó GetAll() một lần nữa, bạn sẽ không nhận được kết quả tương tự. Điều bạn đang nói đến đã thay đổi

=> Nó có trạng thái nội bộ hoặc ít nhất là cách nó hoạt động với thế giới bên ngoài.

ẩn trạng thái bên trong, a.k.a. đóng gói nó, bởi vì tất cả những gì bạn có thể truy cập là giao diện chứ không phải chi tiết liên tục bên dưới.

Bạn có thể gửi thư đến một Kho lưu trữ (gọi các phương thức của nó) và có một "cuộc thảo luận" dài có tiềm năng với cùng một kho lưu trữ.

Biểu mẫu đối tượng hoàn toàn phù hợp với loại công việc mà Kho lưu trữ thực hiện.

Việc sử dụng từ thủ tục trong cuốn sách là khó xử lúc tốt nhất, gây hiểu lầm lúc xấu nhất. Thực tế là nó có một hợp đồng rõ ràng không có gì để làm với một phong cách lập trình thủ tục.

+0

Tôi đồng ý với bạn, khi tôi đọc thêm từ cuốn sách, có vẻ như tác giả đã lạm dụng thủ tục từ. Mặc dù nó rất khó hiểu, và yeah Repository là và nên là một đối tượng. –

4

Tôi nghĩ rằng tác giả muốn nhấn mạnh một số điểm, nhưng trong khi làm như vậy tạo ra sự nhầm lẫn. Ví dụ:

Kho không phải là đối tượng.

Nếu không phải là đối tượng thì sao? Cuốn sách có vẻ như trong ngữ cảnh của .NET, vì vậy chắc chắn tác giả không có nghĩa là chúng ta nên tạo các hàm kho lưu trữ tĩnh. Điều đó sẽ chỉ là vô lý.

Tôi có thể đảm bảo với bạn, một kho lưu trữ là đối tượng .NET bình thường.

Điều đó đang được nói, bạn không "thấy" nhiều tính chất hướng đối tượng của nó khi sử dụng nó. Kho lưu trữ là một đối tượng giống như dịch vụ xuất hiện "phẳng", nghĩa là nó không hiển thị cấu trúc đối tượng điều hướng, chỉ là các phương thức.Điều này được nêu bởi tác giả trong câu

không điều trị hợp đồng kho như hướng đối tượng đang

tuyên bố khác,

Xác định mục tiêu và làm cho nó rõ ràng

thường bị bỏ qua trong trải nghiệm của tôi. Thường thì việc triển khai kho chung chung có thể xử lý tất cả các loại đối tượng miền được tạo. Trong khi điều này có vẻ như một ý tưởng tốt lúc đầu, nó không phải là trong tinh thần của DDD. Bạn nên tạo kho với phương pháp tìm kiếm rõ ràng rằng có ý nghĩa trong ngữ cảnh miền của bạn.

Vì vậy, với điều đó, tôi nghĩ rằng nỗi sợ của bạn về mã thủ tục có lẽ là không hợp lý. C# là một ngôn ngữ mô hình hỗn hợp, và lập trình trong ngôn ngữ nhỏ thường là lập trình thủ tục, bắt buộc. Với các tính năng ngôn ngữ mới hơn, ngày càng trở nên đơn giản để tiếp cận các vấn đề tương tự với lập trình chức năng (ví dụ, tôi cũng là một người hâm mộ lớn), ví dụ: với LINQ, nhưng điều đó không làm cho các kiểu thủ tục xấu. Và lập trình trong lớn vẫn xảy ra theo cách hướng đối tượng.

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