Прежде всего: это вообще хорошая идея не быть догматичной о ничего.
Подумайте об этом так: когда вы строите дом, вы не должны выбирать один гвоздь, который вы собираетесь использовать, - вы не можете использовать гвозди для всего, и они были специально спроектированы в разных размерах, чтобы вы могли выбрать тип, который наилучшим образом соответствует вашим конкретным потребностям и материалам, когда они вам понадобятся.
Так как и когда использовать интерфейс полностью зависит от типа, структуры и предполагаемого использования вашего класса. Конечно, вам не обязательно будет использовать один интерфейс для каждого класса - особенно если вы не цените SRP и не уменьшаете свои классы и не ограничиваетесь одной ответственностью. Но иногда вы можете это сделать, и иногда вы даже найдете веские причины для внедрения более одного интерфейса в одном классе.
Важная информация о интерфейсах заключается в том, что вы используете их в аннотациях из конкретной реализации, независимо от того, сколько различных реализаций у вас будет. Существует множество возможных причин для этого, например. позволяя кому-то обрабатывать экземпляр для вас (например, сервер приложений, этот подход часто используется для фреймворков, btw), развязывать компоненты для улучшения управления зависимостями, а не забывать модульное тестирование (гораздо проще обмануть объект, когда ваш код имеет только ссылки на интерфейс) и т. д. Это не то, что должно решаться на основе того, сколько раз API будет реализован, но при выборе лучшего способа сохранить ваш код в чисто структурированном, слабо связанном и читаемом.
Чтобы решить, что делать, начните с изучения того, как вы строите дом: ознакомьтесь с SOLID principles и попробуйте применить их хорошо - вы узнаете намного больше об абстракциях и интерфейсах, и что они должны быть используется для. У них также не будет ответа на все, но оттуда вы можете начать делать свои собственные наблюдения и, возможно, изобретать свои собственные принципы, чтобы справиться с тем, что они не покрывают. Они, безусловно, хорошее место для начала.
Это зависит. Определение хорошо документированного интерфейса означает, что пользователи фреймворка не подвергаются внутренней обработке, и у них может возникнуть соблазн обойти и взять под контроль самих себя. Если единственный путь в API через интерфейс, вы защищаете фреймворк. Это также означает, что если вы захотите, вы измените базовую реализацию фреймворка (для работы с другой базой данных или сервисом), не оказывая отрицательного влияния на пользователей работы с фреймами. Никогда не предполагайте, что вещи не изменятся. У них очень плохая привычка делать это. – MadProgrammer