Sobes.tech
Middle — Senior

Czy możesz podać przykłady rozwiązań architektonicznych, które okazały się błędne lub nieefektywne, i wyjaśnić dlaczego?

sobes.tech AI

Odpowiedź od AI

Niepoprawne lub nieefektywne rozwiązania architektoniczne w Go często wiążą się z niewłaściwym stosowaniem zasad języka i wzorców:

  • Zbyt duża monolityczna struktura. Gdy cały kod jest skupiony w jednym pakiecie lub pliku, utrudnia to utrzymanie i testowanie.
  • Brak interfejsów do abstrakcji. W Go interfejsy umożliwiają łatwą wymianę implementacji, ale jeśli ich nie używamy, kod staje się sztywny.
  • Użycie zmiennych globalnych do przechowywania stanu. Prowadzi to do problemów z konkurencyjnością i testami.
  • Nieprawidłowe zarządzanie gorutynami. Na przykład uruchamianie gorutyn bez kontroli ich zakończenia lub bez kontekstu, co powoduje wycieki zasobów.
  • Nadmierne użycie kanałów tam, gdzie wystarczą proste funkcje. Kanały są dobre do synchronizacji, ale ich niewłaściwe użycie komplikuje kod.

Przykład złego rozwiązania — uruchomienie gorutiny bez kontekstu i kontroli:

func process() {
    go func() {
        // nieskończona pętla bez możliwości zatrzymania
        for {
            // praca
        }
    }()
}

Lepszym rozwiązaniem jest użycie kontekstu do anulowania:

func process(ctx context.Context) {
    go func() {
        for {
            select {
            case <-ctx.Done():
                return
            default:
                // praca
            }
        }
    }()
}