Является ли правило CollectionPropertiesShouldBeReadOnly FxCop несовместимым с платформой Spring? - PullRequest
2 голосов
/ 16 октября 2008

FxCop имеет правило CollectionPropertiesShouldBeReadOnly , которое жалуется, если у вашего класса есть какое-то свойство коллекции, которое могут устанавливать клиенты. Вместо этого предлагается сделать свойство доступным только для чтения и предоставить метод Clear () и методы Add () или AddRange () для изменения содержимого коллекции.

Я согласен, что это обеспечивает более чистый и более контролируемый интерфейс, но я изо всех сил стараюсь, чтобы этот интерфейс работал со средой Spring. Если я хочу настроить объект с коллекцией соавторов, я должен предоставить некоторое свойство коллекции, в которое будут добавлены соавторы. Я просмотрел документацию по Spring и не могу сказать, как Spring может вызвать метод AddRange (), я что-то упустил?

Пока я собираюсь исключить предупреждение с пометкой, что это необходимо для конфигурации Spring.

Обновление: , поскольку в последние два месяца я не получил ни одного клева здесь, я разместил тот же вопрос на форуме FxCop .

Ответы [ 2 ]

3 голосов
/ 30 декабря 2008

Если для свойства коллекции отображается только геттер, мы будем предполагать, что список рекомендуемых вами шаблонов FxCop используется и добавляется в коллекцию. Первый шаблон также поддерживается.

Для универсальных коллекций это работает, только если открытое свойство имеет тип IList. У нас есть JIRA проблема для следующего выпуска, чтобы исправить это. Кстати, это очень распространенный шаблон в библиотеках базовых классов (как вы, вероятно, знаете ...), где мы впервые столкнулись с необходимостью поддержки этого стиля в .NET 1.1 (который не страдает от ограничений, перечисленных выше) ,

Ура, Mark

2 голосов
/ 29 декабря 2008

Проблема настолько плоха, как вы думаете? Насколько я понимаю, FxCop будет жаловаться, если у вас есть свойство для чтения / записи, например:

public List<Foo> Items { get; set; }

... потому что пользователи вашего класса смогут сделать это:

myInstance.Items = new List<Foo>();

Очевидно, вы не хотите, чтобы пользователи вашего класса полностью переназначали список. Поэтому FxCop рекомендует этот шаблон:

private List<Foo> _items = new List<Foo>();
public List<Foo> Items { get { return _items; } }

Так что теперь пользователи вашего класса могут только добавлять и удалять элементы из вашего списка, а не перезаписывать его новым экземпляром списка.

Как Spring.NET реализует свойства своей коллекции? Они действительно читают / пишут как мой первый пример? Если это так, было бы интересно увидеть их варианты использования для такого шаблона, потому что он не выглядит правильным.

...