Ответ
Плюсы:
- Гибкость: легко подменять реализации без изменения кода бизнес-логики.
- Тестируемость: можно использовать моки/стабы для изолированного тестирования.
- Слабая связанность: уменьшает зависимость от конкретных реализаций.
Минусы:
- Сложность: избыток интерфейсов может усложнить архитектуру.
- Нагрузка на рантайм: в Go интерфейсы разрешаются динамически (незначительный оверхед).
- Риск "интерфейсного взрыва": создание интерфейсов "на всякий случай" без реальной необходимости.
Пример:
type Storage interface {
Save(data string) error
}
type DBStorage struct{}
func (d *DBStorage) Save(data string) error { /*...*/ }
type BusinessLogic struct {
storage Storage
}
func (b *BusinessLogic) Process(data string) error {
return b.storage.Save(data)
}
Здесь BusinessLogic зависит только от интерфейса, что позволяет подменить DBStorage на другую реализацию (например, для тестов).