Tak, zdecydowanie czegoś brakuje . Gotos byłby zwykle używany, jak powiedziałeś, do wykonania jednokierunkowego przekazania kontroli.
Jednak wydarzenia tego nie robią. Kiedy kod uruchamia zdarzenie, doskonale wie, że po opublikowaniu zdarzenia (lub przetworzeniu, umieszczeniu w kolejce, odpaleniu itp.) Wykonanie kodu zostanie wznowione w następnym wierszu kodu, który wygenerował zdarzenie.
Zastosowanie goto tworzy bardzo ścisłe powiązanie między kodem, który wywołuje tę instrukcję, a kodem po stronie odbierającej. Deweloper musi posiadać dogłębną znajomość obu miejsc, aby móc korzystać z goto.
Z drugiej strony, kod uruchamiający zdarzenia zwykle nie wiedziałby ani nie obchodziło, kto jest zainteresowany słuchaniem tego zdarzenia. Nie mogło być słuchaczem. Lub może być 100 słuchaczy lub 0. Ci słuchacze mogą być w tym samym programie, w którym uruchomiono zdarzenie, mogą być w zupełnie innej aplikacji lub mogą znajdować się na innym komputerze. Jeśli chodzi o wydawcę, to po wygenerowaniu zdarzenia jego praca jest wykonywana.
Jeśli jesteś ze mną do tej pory, to, co opisałem powyżej, jest idealnym przypadkiem wzoru pub / sub. Niestety w prawdziwym świecie rzeczy nie zawsze są idealne i zdarzają się przypadki, w których wydawcy generują zdarzenie, subskrybent zostaje wywołany, zmienia cały szereg stanów i do czasu, gdy wykonanie kodu wraca do wydawcy, „świat” wydaje się mieć został wywrócony do góry nogami. I jestem pewien, że napotkałeś to w przeszłości, ponieważ ten warunek często pojawia się, gdy wzór pub / sub jest wdrażany w bardzo prosty sposób (np. Poprzez użycie delegatów lub zdarzeń w C # lub wskaźników funkcji / interfejsu w C / C ++).
Ale ten problem niekoniecznie jest wzorcem pub / sub, ale raczej jego implementacją. Właśnie dlatego wiele systemów polega na kolejkach, dlatego gdy wydarzenie jest publikowane, jest ono po prostu w kolejce, aby można je było później wywołać, dając wydawcy szansę na zakończenie wykonywania, gdy świat jest cały czas nietknięty. Po zakończeniu pracy wydawcy pętla zdarzeń (inaczej pętla wysyłania) wyskoczy ze zdarzeń i wywoła subskrybentów.
return
,try/catch
,break
,continue
,switch
- to wszystkogoto
z różnymi poziomami ograniczeń zbudowany w Goto uważane za szkodliwe jest szkodliwe dla myślenia o tym, jak prace kod..