После повторного рассмотрения этого ответа я решил немного его изменить.
Нет, не рекомендуется извлекать интерфейсы для каждого класса.Это на самом деле может быть контрпродуктивным.Однако интерфейсы полезны по нескольким причинам:
- Поддержка тестов (макеты, заглушки).
- Абстракция реализации (продолжение на IoC / DI).
- Вспомогательное оборудованиетакие вещи, как совместная и противоположная поддержка в C #.
Для достижения этих целей интерфейсы считаются хорошей практикой (и фактически необходимы для последнего пункта).В зависимости от размера проекта вы обнаружите, что вам, возможно, никогда не понадобится общаться с интерфейсом или что вы постоянно извлекаете интерфейсы по одной из вышеуказанных причин.
Мы поддерживаем большое приложение, некоторые его части великолепны, а некоторые страдают от недостатка внимания.Мы часто оказываемся рефакторинговыми, чтобы вытащить интерфейс из типа, чтобы сделать его тестируемым или, таким образом, мы можем изменить реализации, одновременно уменьшая влияние этого изменения.Мы также делаем это, чтобы уменьшить эффект «связывания», который конкретные типы могут случайно наложить, если вы не строго придерживаетесь своего публичного API (интерфейсы могут представлять только публичный API, поэтому для нас по своей сути становятся довольно строгими).
ТоСказано, что можно абстрагировать поведение без интерфейсов и тестировать типы без необходимости использования интерфейсов, поэтому они не являются требованием к вышесказанному.Просто большинство фреймворков / библиотек, которые вы можете использовать для поддержки этих задач, будут эффективно работать с интерфейсами. Я оставлю свой старый ответ для контекста.
Интерфейсы определяют публичный контракт.Люди, реализующие интерфейсы, должны выполнять этот контракт.Потребители видят только государственный контракт.Это означает, что детали реализации были абстрагированы от потребителя.
В настоящее время для немедленного использования это Unit Testing .Интерфейсы легко подделать, заглушки, подделки, назовите это.
Еще одно непосредственное использование - Внедрение зависимостей .Зарегистрированный конкретный тип для данного интерфейса предоставляется типу, потребляющему интерфейс.Тип не заботится конкретно о реализации, поэтому он может абстрактно запрашивать интерфейс.Это позволяет вам изменять реализации, не влияя на большой объем кода (область воздействия очень мала, пока контракт остается неизменным).
Для очень небольших проектов я не беспокоюсь, для средних проектов я склоненбеспокоиться о важных основных пунктах, и для больших проектов, как правило, существует интерфейс почти для каждого класса.Это почти всегда для поддержки тестирования, но в некоторых случаях внедренное поведение или абстракция поведения для уменьшения дублирования кода.