Cho phép giả định rằng tôi có một lớp POCO chứa foos
và bars
:POCOs và tiện ích phương pháp
public class Poco {
public IEnumerable<Foo> Foos { get { return foos; } }
public IEnumerable<Bar> Bars { get { return bars; } }
private List<Foo> foos;
private List<Bar> bars;
}
Trong ví dụ của tôi, tôi cần để có thể thêm và loại bỏ foos
và bars
:
public class Poco {
public IList<Foo> Foos { get { return foos; } }
public IList<Bar> Bars { get { return bars; } }
private List<Foo> foos;
private List<Bar> bars;
}
Nhưng cho phép nói rằng tôi cũng cần ràng buộc (tùy ý) rằng phải có một foo
trên bar
và cũng có một bar
mỗi foo
.
public class NotAPocoAnyMore {
public IEnumerable<Foo> Foos { get { return foos; } }
public IEnumerable<Bar> Bars { get { return bars; } }
private List<Foo> foos;
private List<Bar> bars;
public void Add(Foo f, Bar b) {...}
public void Remove(Foo f, Bar b) {...}
}
Câu hỏi của tôi là: Tôi có cố gắng làm việc để giữ POCO đơn giản và không cung cấp bất kỳ phương pháp tiện ích nào không? Ví dụ đầu tiên POCO là tốt đẹp bởi vì nó là bất biến, và POCO có lợi thế khác. Tuy nhiên, tôi không thể nhìn thấy một cách để giữ cho lớp này là một POCO và vẫn có cách để truy cập và sửa đổi nội dung theo cách được kiểm soát (ít nhất không phải là cách mà dường như không quá giết người).
Một số nghĩ rằng tôi đã có:
Nested class sửa đổi
public class Poco {
public IEnumerable<Foo> Foos { get { return foos; } }
public IEnumerable<Bar> Bars { get { return bars; } }
public PocoModifier Modifier { get { ... } }
private List<Foo> foos;
private List<Bar> bars;
public class PocoModifier {
private readonly Poco toModify;
public void Add(Foo f, Bar b) {...}
public void Remove(Foo f, Bar b) {...}
...
}
}
Công lớp lồng nhau? Không, cám ơn! Ngoài ra nó thực sự chỉ là giống như lớp không POCO chỉ với một ít làm tổ hơn.
Sử dụng bổ truy cập
public class Poco {
public IEnumerable<Foo> Foos { get { return foos; } }
public IEnumerable<Bar> Bars { get { return bars; } }
public PocoModifier Modifier { get { ... } }
internal List<Foo> foos;
internal List<Bar> bars;
}
public class PocoModifier {
private readonly Poco toModify;
public void Add(Foo f, Bar b) {...}
public void Remove(Foo f, Bar b) {...}
...
}
Hơi tốt hơn, nhưng đòi hỏi một đơn vị toàn bộ triển khai cho mỗi POCO.
Cá nhân tôi không ngại có các phương pháp tiện ích trên POCO của bạn (ngay cả khi chúng không thực sự là POCO nữa). Một tùy chọn khác là tạo một thư viện phương thức mở rộng riêng biệt hoặc PocoModifier tĩnh bên ngoài các POCO của bạn (vì vậy bạn không phải là các lớp lồng ghép), nhưng tính khả thi của nó phụ thuộc vào việc bạn đang để lộ POCO của mình cho một máy khách. – NWard
Với tôi nó có vẻ như bạn kéo logic kinh doanh vào thực thể của bạn. Viết logic nghiệp vụ trong một lớp riêng biệt. –
Cảm thấy như bạn đã thiết lập các hạn chế tùy ý cá nhân bạn quyết định ép buộc mã của bạn ... Có thể nếu bạn nghĩ về lý do tại sao bạn làm nó, bạn có thể tự quyết định ... Ghi chú bên: đối tượng đầu tiên của bạn không thực sự bất biến - bạn đang hiển thị danh sách để bắt đầu (yêu cầu truyền, nhưng ai sẽ dừng lại) và không hiển thị bất kỳ phương pháp nào khác ... –