Sobes.tech
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.