FxCop — используйте свойства там, где это уместно

У меня есть интерфейс на уровне службы с несколькими методами, начинающимися с правила Get и FxCop Использовать свойства, где это уместно, жалуется, что вместо этого я должен рассмотреть возможность использования свойств.

Я пытался использовать SuppressMessageAttribute, но когда он определен в интерфейсе, он не влияет на методы-члены. Нужно ли помещать SuppressMessageAttribute в каждый метод или есть способ подавить CA1024 для всего типа?

[SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate"]
public interface IProjectService
{
    // Information and statistics about projects
    IList<ProjectInfo> GetProjects();
    ProjectsDashboard GetProjectsDashboard();

    // Project's settings
    ProjectSettings GetProjectSettings(Guid id);

    void SaveProjectSettings(ProjectSettings settings);
}

person Jozef Izso    schedule 17.02.2009    source источник


Ответы (3)


Вам нужно будет добавить атрибут для каждого метода.

person Sesh    schedule 17.02.2009

Я понимаю необходимость использования методов здесь. Хотя это правда, что эти методы, вероятно, не изменяют состояние, использование метода намекает на длительную/внешнюю операцию, что, вероятно, имеет место при использовании методов класса обслуживания.

Разве вы не можете переименовать свои методы в LoadProjectSettings?

В противном случае вам действительно придется добавить атрибут к каждому методу или отключить правило.

person Bertvan    schedule 17.02.2009
comment
Префикс Load — хорошая идея, но может быть невозможно переименовать методы, когда кто-то другой уже реализовал интерфейс. Это всего лишь мой личный проект, поэтому я могу его реорганизовать. Но лично мне больше всего нравится версия Get. - person Jozef Izso; 17.02.2009
comment
Что ж, если вы хотите назвать это нарушением правил FxCop, вам просто придется смириться с предупреждением. Либо отключить его вообще, либо отключать каждый раз при использовании на месте :) - person Bertvan; 17.02.2009
comment
Я думаю, что это правило действительно хорошее, но я просто не хочу использовать интерфейсы слоев :) Не, почему Scope=member не работает :( - person Jozef Izso; 17.02.2009

К сожалению, вам придется применять его ко всем методам.

Кроме того, я не вижу причин для использования ваших методов Get. Почему бы просто не иметь свойства только для чтения, по крайней мере, для ProjectsDashboard и IList<ProjectInfo>. Они не кажутся мне реализациями, которые изменяют состояние реализации, и, вероятно, в любом случае должны быть свойствами.

Похоже, что ProjectSettings также должен возвращать индексированную коллекцию.

person casperOne    schedule 17.02.2009
comment
Уровень службы вызывает методы уровня данных, поэтому эти методы могут иметь разные результаты, даже если вызывающая сторона не изменяет состояние объекта. Вызов их может быть дорогим, поэтому я использовал методы там. - person Jozef Izso; 17.02.2009