У меня есть класс полезности ContainerQuery
, который состоит из нуля или более ContainerQueryClause
объектов. После того как пользователь подготовил запрос (т.е. добавлены некоторые положения), интерфейс для моей структуры необходимо получить объект, который поддерживает:Свойство C# типа IEnumerable
interface IContainerQuery
{
public IEnumerable<ContainerQueryClause> Clauses { get; }
}
Что лучшей реализацией для IContainerQuery
и почему?
Вариант А)
class ContainerQuery
{
public IEnumerable<ContainerQueryClause> Clauses { get; set; }
}
Вариант б)
class ContainerQuery
{
public ContainerQuery()
{
Clauses = new List<ContainerQueryClause>();
}
public ICollection<ContainerQueryClause> Clauses { get; private set; }
}
Вариант C)
class ContainerQuery
{
public ContainerQuery(IEnumerable<ContainerQueryClause> clauses)
{
Clauses = clauses;
}
public IEnumerable<ContainerQueryClause> Clauses { get; private set; }
}
Вариант д)
Сочетание вышеуказанных подходов или полностью другой подход.
Примечание стороны 1: хотя ContainerQuery
в настоящее время выглядит как «это перечислимые дизъюнкты» Я хочу, чтобы смоделировать это ради будущего, как «имеет Перечислимый из положений».
Вопрос: Есть ли вообще лучший рисунок или рисунок для создания свойств типа IEnumerable<T>
? Если нет, какой подход подходит для ситуаций?
Бокового вопрос: ли вы создать интерфейс IContainerQuery
, чтобы ваша внутренняя структура использовать непреложную версию или только вы воздержитесь от этого, как «вашего внутреннего кода не настолько глуп, чтобы изменить запрос позже»?
Дополнительный контекст: пользователь создает новый запрос контейнера и хочет добавить некоторые предложения. Там нет фанки беглый интерфейс или что-то вроде этого. После передачи готового запроса в мою фреймворк, моя инфраструктура хочет только читать все предложения и не имеет права вносить в нее какие-либо изменения (для описания интерфейса).
На данный момент этого вопроса недостаточно. Иногда вам нужен сеттер, который позволяет заменять. Иногда вы хотите указать значение для построения, но не позже. В других случаях - для 'IEnumerable' в частности - вы фактически не хотите возвращать список вообще (как тип времени выполнения), а вместо этого возвращаете представление на него (например, 'ReadOnlyCollection'). Здесь нет единого размера. –
Я добавил дополнительный контекст, хотя говорить нечего. Надеюсь, этого достаточно, чтобы принять хотя бы решение для этого особого случая, если нет шансов на общую лучшую практику/образец. –
Не совсем. Мы не знаем, открыт ли этот интерфейс за пределами вашей сборки или какие ваши условные обозначения заключены вокруг «доверенного» кода внутри одной сборки, насколько ваш код вращается вокруг неизменяемости (например, ContainerQueryClause неизменяемый?) И т. Д. многие вещи, чтобы рассмотреть, в основном. –