Интерфейсы полезны, если вы хотите издеваться над взаимодействием между объектом и одним из его соавторов.Однако в интерфейсе для объекта с внутренним состоянием меньше значения.
Например, у меня есть служба, которая ведет переговоры с репозиторием, чтобы извлечь какой-либо объект домена, чтобы каким-то образом его обработать.
Определенное значение дизайна при извлечении интерфейса из репозитория. Моя конкретная реализация репозитория вполне может быть тесно связана с NHibernate или ActiveRecord. Связывая мою службу с интерфейсом, я получаю четкое разделение от этой детали реализации. Просто так случается, что я могу также написать супер быстрые автономные модульные тесты для моего сервиса теперь, когда я могу передать ему макет IRepository.
Учитывая предмет домена, который вернулся из репозитория и на который действует мой сервис, стоимость меньше. Когда я пишу тест для своего сервиса, я хочу использовать реальный объект домена и проверить его состояние. Например. после вызова service.AddSomething() Я хочу проверить, что что-то было добавлено в объект домена. Я могу проверить это путем простой проверки состояния объекта домена. Когда я тестирую свой объект домена изолированно, мне не нужны интерфейсы, поскольку я собираюсь выполнять операции над объектом и проверять его на его внутреннем состоянии. например действительно ли мои овцы есть траву, если она спит?
В первом случае нас интересует взаимодействие. Интерфейсы помогают, потому что мы хотим перехватить вызовы, проходящие между тестируемым объектом и его сотрудниками с помощью mocks. Во втором случае нас интересует состояние. Интерфейсы здесь не помогают. Попытайтесь осознать, проверяете ли вы состояние или взаимодействие и позволяете им влиять на ваш интерфейс или нет решения интерфейса.
Помните, что (при условии, что у вас есть копия Resharper) очень дешево извлечь интерфейс позже. Также дешево удалить интерфейс и вернуться к более простой иерархии классов, если вы решите, что вам не нужен этот интерфейс в конце концов. Моим советом было бы начать без интерфейсов и извлечь их по требованию, когда вы обнаружите, что хотите высмеять взаимодействие.
Когда вы приносите IoC на картинку, тогда я бы хотел извлечь больше интерфейсов, но попытайтесь сохранить крышку на сколько классов вы запихиваете в свой контейнер IoC. В общем, вы хотите, чтобы эти ограничения были ограничены в основном объектами службы без гражданства.
Итак, теперь все ... переключают компьютеры и читают код друг друга! –