2008-09-21 27 views
11

Một người cố vấn tôi tôn trọng cho thấy rằng một hạt đơn giản là một sự lãng phí thời gian - mà các đối tượng giá trị 'PHẢI' chứa một số logic nghiệp vụ để có ích.Có bao nhiêu logic nghiệp vụ nên các đối tượng Giá trị chứa?

Một mã khác nói rằng mã này khó duy trì và tất cả logic nghiệp vụ phải được mở rộng.

Tôi nhận thấy câu hỏi này là chủ quan. Hỏi dù sao - muốn biết câu trả lời từ nhiều quan điểm hơn.

Trả lời

6

Bạn nên gọi cho họ Transfer Objects hoặc Data transfer objects (DTO).

Đầu mô hình J2EE cùng này được gọi là 'đối tượng Giá trị' nhưng họ đã thay đổi tên vì nó đã nhầm lẫn với điều này

http://dddcommunity.org/discussion/messageboardarchive/ValueObjects.html

Để trả lời câu hỏi của bạn, tôi sẽ chỉ đặt logic tối thiểu để DTOs của tôi, logic được yêu cầu vì lý do hiển thị. Thậm chí tốt hơn, nếu chúng ta đang nói về ứng dụng web dựa trên cơ sở dữ liệu, tôi sẽ vượt ra ngoài các mẫu j2ee lõi và sử dụng Hibernate hoặc Java Persistence API để tạo mô hình miền hỗ trợ tải quan hệ lười biếng và sử dụng nó trong chế độ xem.

Xem Open session in view.

Bằng cách này, bạn không cần phải lập trình một bộ DTOs và bạn có tất cả các logic kinh doanh có sẵn để sử dụng trong quan điểm của bạn/điều khiển, vv

2

Sở thích cá nhân của tôi là đặt tất cả logic nghiệp vụ trong chính mô hình miền, đó là trong các đối tượng miền "đúng". Vì vậy, khi các đối tượng chuyển dữ liệu được tạo ra, chúng chủ yếu chỉ là một biểu diễn trạng thái (không thay đổi) của các đối tượng miền và do đó không chứa logic nghiệp vụ. Chúng có thể chứa các phương thức nhân bản và so sánh, nhưng thịt của mã logic nghiệp vụ vẫn nằm trong các đối tượng miền.

+0

Cảm ơn bạn :). Bạn vui lòng giải thích ý nghĩa của các đối tượng miền 'đúng' không? –

5

Điều đó tùy thuộc.

oops, tôi vừa mới thốt ra một lời sáo rỗng?

Các câu hỏi cơ bản để yêu cầu thiết kế một đối tượng là: logic quản lý dữ liệu của đối tượng sẽ được khác nhau hoặc cùng khi sử dụng/tiêu thụ bởi các đối tượng khác?

Nếu các khu vực sử dụng khác nhau gọi cho logic khác nhau, hãy từ bỏ nó. Nếu nó là như nhau không có vấn đề nơi đối tượng di chuyển đến, đặt nó cùng với lớp.

2

gì korros nói.

Đối tượng giá trị: = Một đối tượng đơn giản nhỏ, như tiền hoặc phạm vi ngày, có sự bình đẳng không dựa trên danh tính.

DTO: = Một đối tượng mang dữ liệu giữa các quy trình để giảm số lượng cuộc gọi phương thức.

Đây là những defintions do Martin Fowler đề xuất và tôi muốn phổ biến chúng.

20

Ý tưởng đưa dữ liệu và logic nghiệp vụ với nhau là thúc đẩy đóng gói và để hiển thị trạng thái nội bộ ít nhất có thể cho các đối tượng khác. Bằng cách đó, khách hàng có thể dựa vào một giao diện thay vì thực hiện.Xem nguyên tắc "Tell, Don't Ask"Law of Demeter. Việc đóng gói giúp dễ hiểu các dữ liệu của tiểu bang có thể dễ dàng hơn, dễ đọc hơn, dễ phân tách các lớp hơn và dễ kiểm tra đơn vị hơn.

Ngoài logic nghiệp vụ (thường vào các lớp "Dịch vụ" hoặc "Người quản lý"), hãy đặt câu hỏi như "dữ liệu này được sử dụng ở đâu?" và "Nó có thể ở trong trạng thái nào?" rất khó trả lời. Nó cũng là một cách tư duy thủ tục, được bao bọc trong một vật thể. Điều này có thể dẫn đến một số anemic domain model.

Hành vi bên ngoài không phải lúc nào cũng xấu. Ví dụ: một service layer có thể dàn xếp các đối tượng miền, nhưng không lấy trách nhiệm thao tác của nhà nước. Hoặc, khi bạn chủ yếu làm đọc/ghi vào một DB ánh xạ độc đáo với các biểu mẫu đầu vào, có thể bạn không cần một mô hình miền - hoặc đối tượng đau đớn/ánh xạ quan hệ trên đầu nó đòi hỏi - ở tất cả.

Chuyển đối tượng thường phân phối các lớp kiến ​​trúc từ nhau (hoặc từ hệ thống bên ngoài) bằng cách cung cấp thông tin trạng thái tối thiểu mà lớp gọi cần, không lộ bất kỳ logic nghiệp vụ nào.

Điều này có thể hữu ích, ví dụ như khi chuẩn bị thông tin cho quan điểm: chỉ cần cung cấp cho các quan điểm thông tin cần thiết, và không có gì khác, vì vậy nó có thể tập trung vào cách để hiển thị các thông tin, chứ không phải là thông tin để hiển thị. Ví dụ, TO có thể là một tập hợp của một số nguồn dữ liệu.

Một lợi thế là lượt xem và đối tượng miền của bạn được tách riêng. Việc sử dụng các đối tượng miền của bạn trong JSP có thể làm cho miền của bạn khó khăn hơn trong việc tái cấu trúc và thúc đẩy việc sử dụng băm và định vị bừa bãi (do đó phá vỡ đóng gói).

Tuy nhiên, cũng có một chi phí liên quan đến việc có rất nhiều Đối tượng chuyển và thường có nhiều trùng lặp. Một số dự án tôi đã kết thúc với TO's về cơ bản là phản ánh các đối tượng miền khác (mà tôi xem là một mẫu chống).

1

Tôi đồng ý với Panagiotis: phiên mở trong dạng xem tốt hơn nhiều so với sử dụng DTO. Nói cách khác, tôi thấy rằng một ứng dụng đơn giản hơn nhiều nếu bạn lưu lượng truy cập trong các đối tượng miền của mình (hoặc một số kết hợp của chúng) từ lớp xem của bạn xuống hết cỡ.

Điều đó nói rằng, thật khó để kéo ra, bởi vì bạn sẽ cần phải làm cho trùng hợp HttpSession của bạn với đơn vị của lớp kiên trì của bạn làm việc. Sau đó, bạn sẽ cần phải đảm bảo rằng tất cả các sửa đổi cơ sở dữ liệu (tức là tạo, cập nhật và xóa) là cố ý. Nói cách khác, bạn không muốn nó là trường hợp lớp xem có một đối tượng miền, một trường được sửa đổi và sửa đổi được duy trì mà không có mã ứng dụng cố ý lưu thay đổi. Một vấn đề khác quan trọng cần giải quyết là đảm bảo rằng ngữ nghĩa giao dịch của bạn là thỏa đáng. Thông thường việc tìm nạp và sửa đổi một đối tượng miền sẽ diễn ra trong một bối cảnh giao dịch và không khó để làm cho lớp ORM của bạn yêu cầu một giao dịch mới. Những gì thách thức là một giao dịch lồng nhau, nơi bạn muốn bao gồm ngữ cảnh giao dịch thứ hai trong ngữ cảnh giao dịch đầu tiên được mở. Nếu bạn không ngại điều tra cách một Java API không xử lý các vấn đề này, nó đáng xem Rails 'Active Record, cho phép các trang máy chủ Ruby làm việc trực tiếp với mô hình miền và duyệt các liên kết của nó.

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