Я подозреваю, что допустил ошибку школьника и ищу уточнения. Многие классы в моем решении (C #) - осмелюсь сказать, что большинство - я закончил тем, что написал соответствующий интерфейс для. Например, интерфейс «ICalculator» и класс «Calculator», который его реализует, хотя я вряд ли заменю этот калькулятор другой реализацией. Кроме того, большинство этих классов находятся в том же проекте, что и их зависимости - они действительно должны быть internal
, но в конечном итоге стали public
побочным эффектом реализации их соответствующих интерфейсов.
Я думаю, что эта практика создания интерфейсов для всего произошла из нескольких заблуждений:
1) Первоначально я думал, что интерфейс необходим для создания макетов модульного теста (я использую Moq), но с тех пор я обнаружил, что класс может быть смоделирован, если его члены virtual
, и у него есть конструктор без параметров (поправьте меня, если Я не прав).
2) Первоначально я думал, что интерфейс необходим для регистрации класса в IoC Framework (Castle Windsor), например
Container.Register(Component.For<ICalculator>().ImplementedBy<Calculator>()...
когда на самом деле я мог просто зарегистрировать конкретный тип против себя:
Container.Register(Component.For<Calculator>().ImplementedBy<Calculator>()...
3) Использование интерфейсов, например параметров конструктора для внедрения зависимостей, приводит к «слабой связи».
Так я сошел с ума от интерфейсов ?! Мне известны сценарии, в которых вы «обычно» используете интерфейс, например, публикуете публичный API или что-то вроде «подключаемой» функциональности. Мое решение имеет небольшое количество классов, которые подходят для таких вариантов использования, но мне интересно, если все другие интерфейсы не нужны, и должны быть удалены? Что касается пункта 3) выше, не буду ли я нарушать "слабую связь", если я буду делать это?
Изменить : - Я просто играю с Moq, и мне кажется, что методы должны быть открытыми и виртуальными, и иметь открытый конструктор без параметров, чтобы иметь возможность их издеваться. Похоже, у меня не может быть внутренних классов?