Чтобы зависеть от абстракции, а не от конкретного класса. Удобно делать моки при юнит тестировании. На класс можно навешать несколько интерфейсов, но нельзя унаследоваться одновременно от нескольких классов (в некоторых языках можно).
Ещё очень удобно становится писать конфигурируемый код для разных ситуаций и окружений. Например, если есть загрузка файлов, то можно её реализовать через локальную файловую систему и через AWS, и в зависимости от окружения выбирать нужную реализацию (чтобы не нагружать AWS тестовыми файлами при локальной работе). То же самое можно провернуть с отправкой писем, SMS, пуш уведомлений... Да даже все потенциальные запросы в БД можно временно подменить на фейковую реализацию, которую можно быстро написать.
Плюс к этому через интерфейсы (и полиморфизм) реализуются многие шаблоны проектирования, которые позволяют переиспользовать код при необходимости. Шаблонные методы там, стратегии, абстрактные фабрики, декораторы и прочее: что-то более полезное, что-то менее.
Чтобы зависеть от абстракции, а не от конкретного класса. Удобно делать моки при юнит тестировании. На класс можно навешать несколько интерфейсов, но нельзя унаследоваться одновременно от нескольких классов (в некоторых языках можно).
Комментарий недоступен
Ещё очень удобно становится писать конфигурируемый код для разных ситуаций и окружений. Например, если есть загрузка файлов, то можно её реализовать через локальную файловую систему и через AWS, и в зависимости от окружения выбирать нужную реализацию (чтобы не нагружать AWS тестовыми файлами при локальной работе). То же самое можно провернуть с отправкой писем, SMS, пуш уведомлений... Да даже все потенциальные запросы в БД можно временно подменить на фейковую реализацию, которую можно быстро написать.
Плюс к этому через интерфейсы (и полиморфизм) реализуются многие шаблоны проектирования, которые позволяют переиспользовать код при необходимости. Шаблонные методы там, стратегии, абстрактные фабрики, декораторы и прочее: что-то более полезное, что-то менее.