Ruslan Stelmachenko
Просто "так повелось" ) Я сам противник таких пустых интерфейсов без всякого смысла. Очень часто такое вижу.
Оправдать можно разве что "чтобы было все в едином стиле". Потому что если у вас есть определенная структура пакетов, и все уже написанные сервисы имеют интерфейсы, которые лежат в определенном пакете и т.д. - то да, новый сервис без интерфейса будет выделяться из паттерна и это будет еще хуже, чем бессмысленное наличие интерфейса. Так что тут меньшее из зол надо выбирать.
Но если такого паттерна нет, то воодить его без причины смысла я не вижу. В 99% случаев у сервисов одна реализация. А если их больше, то это обычно сразу видно. Обычно интерфейсы полезны для кассов в либах, а не в конечном аппликейшен-коде. К тому же, если вдруг в будущем понадобится сделать 2ю реализацию, никто не мешает сделать класс интерфейсом (Extract Interface), а реализацию перенести в новый класс. Вот в этот момент это будет уже оправдано. И вполне обратно совместимо. Особенно если это код конечного приложения, а не либы.
Не самом деле не просто повелось.
Это подход тотальной инкапскляции.
И при проектировании в таком модходе приятно думать только об интерфейсах, без деталей реализации.
И в TDD, когда дизайн в коде, пишут интерфейсы и заглуш км к ним в тестах сначала.
Когда уже всё спроектировано вглубь, то интерфейсы действительно как бойлерплейт смотрятся. И интересны толькл для редких апи, где действительно захочется иметь несколько реализаций.
Еще моките вроде легче с интерфейсами жить для юнит-тестов.