Gdy mam jednostki w mojej domenie z listami rzeczy, czy powinny one być ujawniane jako ILists czy IEnumerables? Np. Order ma kilka OrderLines.
Gdy mam jednostki w mojej domenie z listami rzeczy, czy powinny one być ujawniane jako ILists czy IEnumerables? Np. Order ma kilka OrderLines.
Odpowiedzi:
IEnumerable<T>
reprezentuje serię elementów, które możesz iterować (na przykład używając foreach), podczas gdy IList<T>
jest to kolekcja, do której możesz dodawać lub usuwać.
Zazwyczaj będziesz chciał móc modyfikować zamówienie, dodając lub usuwając do niego OrderLines, więc prawdopodobnie chcesz, aby Order.Lines był plikiem IList<OrderLine>
.
Mimo to należy podjąć pewne decyzje dotyczące projektowania ram. Na przykład, czy powinno być możliwe dodanie tego samego wystąpienia OrderLine do dwóch różnych zamówień? Prawdopodobnie nie. Biorąc więc pod uwagę, że chcesz mieć możliwość sprawdzenia, czy OrderLine należy dodać do zamówienia, możesz rzeczywiście chcieć wyświetlić właściwość Lines jako jedyną IEnumerable<OrderLine>
i udostępnić metody Add (OrderLine) i Remove (OrderLine), które mogą obsługiwać ta walidacja.
IReadOnlyList
lub, IReadOnlyCollection
jeśli potrzebujesz zmaterializowanej listy, ale nie chcesz jej dodawać ani usuwać.
IReadOnlyList
nie ma sensu.
W większości przypadków korzystam z IList przez IEnumerable, ponieważ IEnumerable nie ma metody Count i nie można uzyskać dostępu do kolekcji za pośrednictwem indeksu (chociaż jeśli używasz LINQ, możesz obejść to za pomocą metod rozszerzających).
ElementAt
metodą?