Я использую тестовый подход к созданию своего кода. Это часто приводит к тому, что я создаю интерфейсы, где я хочу предоставить макет или фиктивную реализацию как часть моего тестового устройства.
Обычно я не создавал бы никакого кода, если бы он не имел отношения к моим тестам, и поскольку вы не можете легко протестировать интерфейс, только реализацию, которая заставляет меня создавать интерфейсы, если они мне нужны при предоставлении зависимостей для тестового примера.
Я также буду иногда создавать интерфейсы при рефакторинге, чтобы удалить дублирование или улучшить читаемость кода.
Вы всегда можете выполнить рефакторинг своего кода, чтобы ввести интерфейс, если узнаете, что он вам нужен позже.
Единственное исключение из этого было бы, если бы я разрабатывал API для выпуска третьей стороне - там, где стоимость внесения изменений в API высока. В этом случае я могу попытаться предсказать тип изменений, которые мне могут понадобиться в будущем, и выработать способы создания моего API, чтобы минимизировать будущие несовместимые изменения.