2009-03-24 29 views

Trả lời

1

giá trị kiểu

13

Để mở rộng một chút về câu trả lời của awhite thẻ là một loại giá trị Tại sao? Bởi vì nó không có ý nghĩa để có

var tag1 = new Tag("DDD"); 
var tag2 = new Tag("DDD"); 
Assert.AreNotEqual(tag1, tag2); 

rõ họ cần phải bình đẳng với nhau vì một thẻ không có bản sắc ngoại trừ nhãn của nó. Mặt khác, câu hỏi và câu trả lời chắc chắn là các thực thể

+0

Cảm ơn bạn. Tôi không thể tự nói tốt hơn. –

+0

Không phải là thẻ gắn nhãn bản sắc của riêng mình? –

+0

Các loại giá trị không phải của nó không có thông tin nhận dạng rằng tất cả các phiên bản của một loại cụ thể có cùng một mã định danh –

2

Chỉ cần cân nhắc thêm: Thẻ có thể được chuẩn hóa, "DDD" phải bằng "ddd" và "DdD" và trong hầu hết các hệ thống thẻ, không gian được thay thế bằng " _ "gạch dưới. Ngoài ra, tôi đoán người tạo sẽ được theo dõi cho hệ thống huy hiệu.

+2

Đó là những cân nhắc đáng giá. Hãy để tôi chỉ ra rằng một loại giá trị (tag) có thể tham khảo một thực thể (người dùng) –

5

Thẻ SO rất có thể là một thực thể. Thẻ có thể được tạo, hợp nhất, xóa và đổi tên. Có các tính năng như 'thẻ tương tự', thẻ của người dùng, vv Một số chức năng này, đặc biệt là vòng đời, sẽ yêu cầu nhận dạng. Ví dụ DDD cổ điển trong đó Người thay đổi tên của họ vẫn là cùng một người, cùng một danh tính. Tương tự với các thẻ mà người dùng có thể quyết định đổi tên "thiết kế theo hướng miền" thành "DDD" và nó vẫn sẽ giống nhau. Thẻ cũng cần các thuộc tính bổ sung như tag.Id, tag.Name, tag.CreatedOn, tag.CreatedBy, tag.Locked vv Có thể có một kho lưu trữ thẻ tương ứng có thể thực thi quy tắc duy nhất của tên.

Để tóm tắt, SO Tag không phải là đối tượng giá trị DDD vì nó có thể thay đổi và có vòng đời. Quan trọng hơn, Tag không chỉ là một đặc điểm của một câu hỏi (đây là những gì tôi nghĩ đã bị bỏ qua bởi các câu trả lời khác). Nó tham gia vào nhiều mối quan hệ hơn thế. Nói cách khác, Thẻ không chỉ là tổng của các thuộc tính của nó là mà còn có 'nhận dạng khái niệm'. Mặt khác, TagName là một ví dụ hoàn hảo về Value Object. Mục đích duy nhất của nó trong cuộc sống là mô tả một thực thể khác (Tag). TagName không chỉ là một chuỗi có thể có một vài quy tắc được xây dựng như độ dài tối đa và so sánh không phân biệt chữ hoa chữ thường. Nó cũng có thể có ý nghĩa để chỉ cần sử dụng String để thay thế.

Mã hiển thị câu hỏi có thể sử dụng một cái gì đó như thế này:

IList<TagName> tags = question.GetTags(); 

Mã rằng các thẻ nội dung câu hỏi có thể trông như thế này:

void TagQuestion(Question q, TagName tagName) { 
    Tag tag = _tagsRepository.FindByName(tagName); 
    if (tag == null) { 
     tag = CreateNewTag(/* capture creator, date, other rules*/); 
    } 
    q.AddTag(tag); 
} 
+2

Chưa kể rằng trên thẻ SO có tóm tắt và toàn bộ wiki được liên kết với chúng ... –

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