Projektuję pakiet, w którym chcę zapewnić interfejs API w oparciu o wzorzec obserwatora: oznacza to, że istnieją punkty, w których chciałbym emitować sygnał, który wyzwoli zero lub więcej zainteresowanych stron. Te zainteresowane strony niekoniecznie muszą wiedzieć o sobie nawzajem.Czy istnieje preferowany sposób projektowania interfejsów API sygnałów lub zdarzeń w programie Go?
Wiem, że mogę zaimplementować taki interfejs API od podstaw (np. Przy użyciu kolekcji kanałów lub funkcji wywołania zwrotnego), ale zastanawiałem się, czy istnieje preferowany sposób tworzenia takich interfejsów API.
W wielu językach i frameworkach, z którymi grałem, istnieją standardowe sposoby tworzenia interfejsów API, które zachowują się tak, jak tego oczekują użytkownicy: np. funkcje g_signal_*
dla aplikacji opartych na glib, zdarzeń i addEventListener()
dla aplikacji DOM JavaScript lub delegatów multiemisji dla .NET.
Czy jest coś podobnego do Go? Jeśli nie, to czy istnieje inny sposób struktury tego typu API, który jest bardziej idiomatyczny w Go?
myślę, że to odpowiedź obejmuje kilka przypadków użycia, ale na pewno bym chciał usłyszeć więcej opinii/odpowiedzi na ten temat. Kanały nakładają na dzwoniącego trochę więcej ("obserwatora"), ponieważ musi on uruchomić goroutine, które czeka na tym kanale. Jeśli ta sama funkcja może obsłużyć wiele "zdarzeń", może to być uciążliwe. Jako przeciw-przykład, callbacks są używane w sieci/http dla procedur obsługi HTTP. Istnieją przypadki użycia, w których bardziej sensowne są IMHO. – mna
Użyłem tylko terminu "wzorzec obserwatora", ponieważ jest to termin, który ludzie mogą zrozumieć: nie piszę swoich programów, najpierw rozbijając je na nazwane wzorce projektowe, jeśli to właśnie robisz. Jeśli chodzi o sugestie dotyczące interfejsu API, widzę, jak funkcja zwracająca kanały po stronie czytelnej może działać po stronie subskrypcji, ale w jaki sposób modelowałbyś pasujący interfejs API wypisać? –
Kanały są porównywalne pod względem równości i są obiektami pierwszej klasy. Aby zrezygnować z subskrypcji, wystarczy przekazać kanał z powrotem do przeglądarki, może on znaleźć swój kanał i podjąć odpowiednie działania w celu zakończenia subskrypcji. – Sonia