Wiele nieporozumień między „przekazywaniem wiadomości” a „oparte na zdarzeniach” dotyczy szczegółów architektonicznych a implementacyjnych. Widziałem (i pisałem) systemy sterowane zdarzeniami, które faktycznie używają komunikatów dostarczonych przez system operacyjny do ich realizacji. Zgaduję, że naprawdę odnosisz się do pomysłów architektonicznych.
Jak wiele osób już zauważyło, „przekazywanie wiadomości” i „oparte na zdarzeniach” nie są wystarczająco dobrymi warunkami, aby uniknąć dwuznaczności.
Jakie są względne zalety systemu „przekazywania wiadomości” w porównaniu z systemem „opartym na zdarzeniu”.
Przekazywanie wiadomości
Zacznę od zgadywania, że kiedy mówisz o systemie przekazywania wiadomości, mówisz o systemie, w którym jeden obiekt przekazuje wiadomość do określonego innego obiektu. Kiedy myślę o systemie opartym na tym paradygmacie, bardziej ogólnie myślę o systemie, w którym obiekt, który wykrywa coś, wie, o kim trzeba powiedzieć. (Nie precyzuję, skąd to wie, tylko że wie.)
Ten rodzaj architektury jest bardzo dobry dla systemów, w których producenci i konsumenci są dobrze znani. Albo producent wiadomości wie, kto musi ją otrzymać, albo konsument musi wiedzieć, od kogo otrzymać wiadomość.
Jeśli piszesz aplikację bankową, można się spodziewać, że naprawdę chcesz wiedzieć, do kogo wysyłasz swoje transakcje i do kogo.
Na podstawie zdarzenia
Drugi system, o którym myślę, że myślisz, kiedy mówisz, że system „oparty na zdarzeniu” to taki, w którym obiekt wywołuje „zdarzenie”, nie wiedząc, kto (jeśli ktokolwiek) zareaguje na to.
Ten rodzaj architektury opartej na zdarzeniach jest bardzo dobry dla systemów, w których producent nie dba o to, kto zużywa zdarzenie lub gdzie konsument tak naprawdę nie dba o to, kto wyprodukował zdarzenie.
Ogólnie rzecz biorąc, systemy te są świetne tam, gdzie nie znasz relacji między konsumentami a producentami i gdzie oczekujesz, że związek będzie dynamiczny.
Jednym z używanych przeze mnie systemów był system, w którym aplikacja składała się z dynamicznie konfigurowanych modułów (wtyczek), które były ładowane w czasie wykonywania. Gdy moduł został załadowany, rejestrowałby zdarzenia, na których mu zależało. W rezultacie powstał system, w którym bardzo łatwo było rozszerzyć funkcjonalność.
Na przykład powiedzmy, że warunek A wywołał Zdarzenie EA, które normalnie spowodowało odpowiedź RA. Obiekt, który spowodował odpowiedź RA, po prostu zarejestrował się, aby otrzymać zdarzenie EA i działał na nim, gdy dotarł. Powiedzmy, że chcemy dodać nową odpowiedź do EA o nazwie RA_1. Aby to zrobić, po prostu dodajemy nowy obiekt, który szuka EA i generuje odpowiedź RA_1.
Oto kilka przykładów (używając terminologii):
- „przekazywanie wiadomości” : Twój szef każe ci wypełnić arkusz czasu pracy.
- „sterowane zdarzeniami” : Sekretarz działu wysyła wiadomość e-mail do wszystkich, przypominając im, że ich harmonogramy są dzisiaj wymagane.