Senior
Opowiedz przypadek użycia interfejsów w logice produkcyjnej z punktu widzenia architektury
sobes.tech AI
Odpowiedź od AI
W logice produkcyjnej w Go interfejsy są często używane do osiągnięcia słabego powiązania komponentów i ułatwienia testowania.
Na przykład, w architekturze aplikacji można zdefiniować interfejs dla warstwy dostępu do danych:
// UserRepository opisuje metody pracy z użytkownikami
type UserRepository interface {
GetUserByID(id int) (*User, error)
SaveUser(user *User) error
}
W logice biznesowej (warstwa serwisowa) przyjmujemy ten interfejs, nie zależąc od konkretnej implementacji (np. bazy danych lub mocka do testów):
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
}
// dodatkowa logika
return &UserProfile{User: user}, nil
}
Takie podejście pozwala:
- Łatwo zmieniać implementację repozytorium (np. przełączać się między bazami danych lub używać mocków do testów).
- Izolować logikę biznesową od szczegółów przechowywania danych.
- Poprawić czytelność i utrzymanie kodu.
W produkcji pomaga to tworzyć elastyczne i skalowalne aplikacje z wyraźnym podziałem odpowiedzialności.