Какова цель обертывания универсального интерфейса? - PullRequest
0 голосов
/ 24 февраля 2010

Я видел в проекте много интерфейсов, которые просто обернули универсальный класс.

Пример:

public interface IAssertionViewModelMapper : IMapper<Assertion, AssertionViewModel>
{}

public interface ISearchPageViewModelMapper : IMapper<IList<Tag>, SearchPageViewModel>
{}

Может ли кто-нибудь объяснить, почему они это сделали? Я имею в виду, что могу просто реализовать интерфейс IMapper.

Ответы [ 3 ]

3 голосов
/ 24 февраля 2010

Microsoft Code Analysis (a.k.a. FxCop) содержит правило против этого. Однако создание нового интерфейса, подобного этому, имеет несколько преимуществ:

  1. Новое имя может лучше описать назначение интерфейса (однако, псевдонимы в C # могут делать то же самое).
  2. Это сэкономит вам несколько минут, когда для этого интерфейса потребуются новые методы, потому что вы уже определили его.
  3. Это может сделать вашу кодовую базу более согласованной, когда большинство интерфейсов, производных от IMapper<T, TViewModel>, фактически определяют новые методы. Интерфейсы легко определить, даже если они не определяют новых членов.
3 голосов
/ 24 февраля 2010

Иногда команды решают, что они не хотят полагаться на встроенные реализации, которые могут быть изменены и устарели. Таким образом, они оборачивают все, классы, интерфейсы, типы и используют их в своем проекте. Они надеются, что однажды, когда поддержка некоторых компонентов инфраструктуры будет прекращена, они просто адаптируют свои оболочки без переписывания всего программного обеспечения.

Это также тот случай, когда я работаю. Абсолютно все было упаковано около десяти лет назад, и мы используем только наши специальные обертки. Как вы можете догадаться, время показало, что большая часть этого никогда не была нужна. Ни одно время не было действительно сэкономлено, когда что-то осуждается. Нам по-прежнему приходилось адаптировать некоторый код, который занимал много времени, но обертки не помогали никоим образом. Скорее наоборот, обертки являются постоянными препятствиями, поскольку они еще не полностью обернули вещи, поэтому нам приходится время от времени расширять обертки.

1 голос
/ 24 февраля 2010

Это создает новый тип интерфейса. Так что, если вы объявите ссылку:

IAssertionViewModelMapper avmm = null;

Вы не можете назначить объект этому, если он реализует IMapper<Assertion, AssertionViewModel>. Они бывают разных типов и имеют совместимость присваивания только в одном направлении: производная может быть назначена базе.

Так что, если кто-то попробует этот трюк, чтобы сократить свой код, например, используя typedef в C, то он, возможно, сохранит некоторую путаницу в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...