Gần đây tôi đã tình cờ nghe mọi người nói rằng các đối tượng truyền dữ liệu (DTO) là một mô hình chống .
Tại sao? Các lựa chọn thay thế là gì?
Gần đây tôi đã tình cờ nghe mọi người nói rằng các đối tượng truyền dữ liệu (DTO) là một mô hình chống .
Tại sao? Các lựa chọn thay thế là gì?
Câu trả lời:
Một số dự án có tất cả dữ liệu hai lần . Một lần là đối tượng miền, và một lần là đối tượng truyền dữ liệu.
Sự trùng lặp này có chi phí rất lớn , vì vậy kiến trúc cần phải nhận được lợi ích rất lớn từ sự tách biệt này để có giá trị.
DTO không phải là một mô hình chống. Khi bạn gửi một số dữ liệu qua mạng (giả sử, đến một trang web trong cuộc gọi Ajax), bạn muốn chắc chắn rằng bạn tiết kiệm băng thông bằng cách chỉ gửi dữ liệu mà đích sẽ sử dụng. Ngoài ra, thường thì thuận tiện cho lớp trình bày có dữ liệu ở định dạng hơi khác so với đối tượng kinh doanh gốc.
Tôi biết đây là một câu hỏi hướng Java, nhưng trong các ngôn ngữ .NET, các kiểu ẩn danh, tuần tự hóa và LINQ cho phép các DTO được xây dựng nhanh chóng, giúp giảm việc thiết lập và sử dụng chúng.
DTO một AntiPotype trong EJB 3.0 nói:
Bản chất nặng của Đậu Entity trong thông số kỹ thuật EJB trước EJB 3.0, dẫn đến việc sử dụng các mẫu thiết kế như Đối tượng truyền dữ liệu (DTO). Các DTO đã trở thành các đối tượng nhẹ (đáng lẽ là hạt đậu thực thể ở vị trí đầu tiên), được sử dụng để gửi dữ liệu qua các tầng ... giờ đây, thông số EJB 3.0 tạo ra mô hình Entity bean giống như đối tượng Java cũ (POJO). Với mô hình POJO mới này, bạn sẽ không còn cần phải tạo DTO cho từng thực thể hoặc cho một tập hợp các thực thể ... Nếu bạn muốn gửi các thực thể EJB 3.0 trên tầng, hãy thực hiện chúng chỉ cần thực hiện java.io.Serialiazable
Tôi không nghĩ rằng các DTO là một mô hình chống lại mỗi se, nhưng có các phản hạt liên quan đến việc sử dụng các DTO. Bill Dudney đề cập đến vụ nổ DTO là một ví dụ:
http://www.softwaresummit.com/2003/speaker/DudneyJ2EEAntiPotypes.pdf
Ngoài ra còn có một số lạm dụng DTO được đề cập ở đây:
http://anirudhvyas.com/root/2008/04/19/abuses-of-dto-potype-in-java-world/
Chúng có nguồn gốc do ba hệ thống cấp (thường sử dụng EJB làm công nghệ) làm phương tiện để truyền dữ liệu giữa các tầng. Hầu hết các hệ thống Java hiện đại dựa trên các khung công tác như Spring đều có chế độ xem đơn giản hóa thay thế bằng cách sử dụng POJO làm đối tượng miền (thường được chú thích bằng JPA, v.v.) trong một tầng duy nhất ... Việc sử dụng DTO ở đây là không cần thiết.
Những người theo chủ nghĩa thuần túy OO sẽ nói rằng DTO là chống mẫu vì các đối tượng trở thành biểu diễn bảng dữ liệu thay vì các đối tượng miền thực.
Một số người coi DTO là một mô hình chống do lạm dụng có thể có của họ. Chúng thường được sử dụng khi chúng không nên / không cần phải như vậy.
Bài viết này mơ hồ mô tả một số lạm dụng.
Nếu bạn đang xây dựng một hệ thống phân tán, thì DTOs chắc chắn không phải là một mô hình chống. Không phải ai cũng sẽ phát triển theo nghĩa đó, nhưng nếu bạn có một ứng dụng Xã hội mở (ví dụ) thì tất cả đều chạy JavaScript.
Nó sẽ đăng tải dữ liệu lên API của bạn. Điều này sau đó được giải tuần tự hóa thành một số dạng đối tượng, điển hình là đối tượng DTO / Request. Điều này sau đó có thể được xác nhận để đảm bảo dữ liệu được nhập là chính xác trước khi được chuyển đổi thành một đối tượng mô hình.
Theo tôi, nó được coi là một mô hình chống vì nó được sử dụng sai. Nếu bạn không xây dựng một hệ thống phân tán, rất có thể bạn không cần chúng.
Mục đích của Đối tượng truyền dữ liệu là lưu trữ dữ liệu từ các nguồn khác nhau và sau đó chuyển dữ liệu vào cơ sở dữ liệu (hoặc Mặt tiền từ xa ) cùng một lúc.
Tuy nhiên, mẫu DTO vi phạm Nguyên tắc Trách nhiệm duy nhất , vì DTO không chỉ lưu trữ dữ liệu mà còn chuyển dữ liệu từ hoặc đến cơ sở dữ liệu / mặt tiền.
Sự cần thiết phải tách các đối tượng dữ liệu khỏi các đối tượng kinh doanh không phải là một antipotype, vì có lẽ nó được yêu cầu để tách lớp cơ sở dữ liệu .
Thay vì DTO, bạn nên sử dụng Mẫu tổng hợp và Kho lưu trữ, phân tách bộ sưu tập các đối tượng ( Tổng hợp ) và truyền dữ liệu ( Kho lưu trữ ).
Để chuyển một nhóm đối tượng, bạn có thể sử dụng mẫu Đơn vị công việc , chứa một bộ Kho lưu trữ và bối cảnh giao dịch; để chuyển từng đối tượng trong tổng hợp riêng trong giao dịch.
DTO trở thành một điều cần thiết và không phải là BỆNH NHÂN khi bạn có tất cả các đối tượng miền của mình tải các đối tượng liên quan EAGERly.
Nếu bạn không tạo DTO, bạn sẽ có các đối tượng được chuyển không cần thiết từ lớp doanh nghiệp sang lớp máy khách / web của bạn.
Để hạn chế chi phí cho trường hợp này, thay vì chuyển DTO.
Câu hỏi không nên là "tại sao", mà là " khi nào ".
Chắc chắn đó là mô hình chống khi chỉ sử dụng kết quả là chi phí cao hơn - thời gian chạy hoặc bảo trì. Tôi đã làm việc trên các dự án có hàng trăm DTO giống hệt với các lớp thực thể cơ sở dữ liệu. Mỗi lần bạn muốn thêm một trường mà bạn quảng cáo để thêm id như bốn lần - vào DTO, thành thực thể, để chuyển đổi từ DTO sang các lớp hoặc thực thể miền, chuyển đổi ngược lại, ... Bạn đã quên một số vị trí và dữ liệu nhận được không nhất quán
Nó không chống mẫu khi bạn thực sự cần sự đại diện khác nhau của các lớp miền - phẳng hơn, giàu hơn, hẹp hơn, ...
Cá nhân tôi bắt đầu với lớp tên miền và vượt qua nó, với kiểm tra thích hợp ở đúng nơi. Tôi có thể chú thích và / hoặc thêm một số lớp "người trợ giúp" để tạo ánh xạ, vào cơ sở dữ liệu, cho các định dạng tuần tự hóa như JSON hoặc XML ... Tôi luôn có thể chia một lớp thành hai nếu tôi cảm thấy cần.
Đó là về quan điểm của bạn - Tôi thích xem một đối tượng miền là một đối tượng duy nhất đóng nhiều vai trò khác nhau, thay vì nhiều đối tượng được tạo từ nhau. Nếu vai trò duy nhất mà một đối tượng có là vận chuyển dữ liệu, thì đó là DTO.
Tôi nghĩ mọi người có nghĩa là nó có thể là một mô hình chống nếu bạn triển khai tất cả các đối tượng từ xa dưới dạng DTO. DTO chỉ đơn thuần là một tập hợp các thuộc tính và nếu bạn có các đối tượng lớn, bạn sẽ luôn chuyển tất cả các thuộc tính ngay cả khi bạn không cần hoặc không sử dụng chúng. Trong trường hợp sau thích sử dụng mẫu Proxy.