Пересмешивать объекты - объявлять все методы как виртуальные или использовать интерфейс? - PullRequest
12 голосов
/ 28 марта 2009

В .net, в отличие от Java, методы не являются виртуальными по умолчанию. Чтобы использовать большинство фальшивых объектных сред, вы должны либо пометить методы, которые вы хотите использовать в своем макете, как виртуальные, на «реальном» объекте, либо у вас должен быть интерфейс, который вы можете смоделировать, чтобы тестируемый класс принять вместо реализации.

Кажется плохой формой идти и отмечать каждый метод как виртуальный, но это также плохая форма для определения интерфейса для каждого отдельного класса.

Что лучше всего сделать?

Ответы [ 4 ]

11 голосов
/ 28 марта 2009

Если бы мне пришлось выбирать между двумя, я бы выбрал интерфейс. Интерфейс предназначен для определения контракта, который, по сути, должен придерживаться фиктивный объект. Маркировка метода как виртуального может иметь непредвиденные побочные эффекты. Это влияет на дизайн фактического класса насмешки. Интерфейс просто определяет имена методов и не влияет на реальный класс.

10 голосов
/ 28 марта 2009

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

0 голосов
/ 28 марта 2009

Лучше всего использовать голову. Подумайте о своем сценарии, если есть смысл использовать виртуальный, то сделайте это. Однако если интерфейс лучше подходит для вашей задачи, тогда сделайте это.

Так что на самом деле я вижу это как добавление новой функциональности

  • Наследование: используйте виртуальные методы.
  • Состав: использовать интерфейсы.

Я уверен, что здесь есть куча предостережений. Так что просто используйте свою голову и делайте то, что проще всего в вашем сценарии.

0 голосов
/ 28 марта 2009

Кто сказал, что вы издеваетесь над объектом, происходящим из той же иерархии классов?

Гораздо проще создать простой автономный класс с необходимым интерфейсом и создать экземпляры этого объекта.

Вы даже можете создать иерархию фиктивных классов и использовать ее для модульного тестирования.

...