Senior
Разкажете случай на използване на интерфейси в производствената логика от гледна точка на архитектурата
sobes.tech AI
Отговор от AI
В производствената логика в Go интерфейсите често се използват за постигане на слака свързаност между компонентите и улесняване на тестовете.
Например, в архитектурата на приложението може да се дефинира интерфейс за слоя за достъп до данни:
// UserRepository описва методите за работа с потребители
type UserRepository interface {
GetUserByID(id int) (*User, error)
SaveUser(user *User) error
}
В бизнес логиката (слоя за услуги) приемаме този интерфейс, без да зависим от конкретна реализация (например база данни или mock за тестове):
func NewUserService(repo UserRepository) *UserService {
return &UserService{repo: repo}
}
func (s *UserService) GetUserProfile(id int) (*UserProfile, error) {
user, err := s.repo.GetUserByID(id)
if err != nil {
return nil, err
}
// допълнителна логика
return &UserProfile{User: user}, nil
}
Този подход позволява:
- Лесно да сменяте реализацията на репозитория (например, превключване между бази данни или използване на mock за тестове).
- Да изолирате бизнес логиката от детайлите на съхранението на данни.
- Да подобрите четливостта и поддръжката на кода.
В производството това помага за създаване на гъвкави и мащабируеми приложения с ясно разделение на отговорностите.