Этот шаблон позволяет легко управлять зависимостями между компонентами, повышая модульность и упрощая тестирование.
Пример:
type Database interface {
Query(query string) string
}
type Deps atruct {
Database
// other interfaces...
}
type Service struct {
Deps
}
func NewService(deps Deps) *Service {
return &Service{Deps: deps}
}
func (s *Service) GetData() string {
return s.Database.Query("SELECT * FROM data")
}
type MySQL struct{}
func (db MySQL) Query(query string) string {
return "MySQL query result"
}
func main() {
service := NewService(Deps{
Database: MySQL{}
})
fmt.Println(service.GetData())
}
За счет гибкого расширения структуры зависимостей, не приходится менять API конструктора
NewService, следовательно сохраняется обратная совместимость и не требуется редактировать старые тесты.Эти шаблоны помогают мне писать гибкий, легко поддерживаемый код, который можно адаптировать под различные нужды проекта.
А какие шаблоны используете вы? Делитесь своими любимыми в комментариях! ⬇️⬇️⬇️
#golang #шаблоны