Wątek przeniesiony 2023-12-13 13:36 z Java przez Riddle.

Jak zaprojektować zdarzenia?

0

Chce zrobić system zdarzeń w jakimś programie ale jak zrobić coś takiego bo nie mam pomysłu w głowie żeby też nie bylo w kodzie jakiegoś syfu ifow itp.
Mam trzy klasy Car, AutoPilot, Kierowca
Przykład klasy Car

class Car {
   public void openDoor() {
       // Otwieranie drzwi
      // Odpalaj zdarzenie eventManagerem
      eventManager.callEvent(DoorOpenedEvent); // i odpali się zdarzenie ze dzwi zostało otwarte ale w zależności od tego kto wylała te metodę jaka jakaś jest inna implementacja 

   }
}

class AutoPilot {
  public void start() {
     car.openDoor(); //dzwi otwiera klasa AutoPilot więc DoorOpenedEvent ma mieć implementację dla klasy AutoPilot
  }
}

class Kierowca {
  public void start() {
     car.openDoor(); // dzwi otwiera klasa Kierowca więc DoorOpenedEvent ma mieć implementację dla klasy Kierowca
     // Mogę niby przekazać parametrem klasę ale to na czy dobre podejście car.openDoor(this) bo bym musiał ify robić tam kto wywołuje 
  }
}

teraz mam problem jak to zaprojektować żeby nie było brzydkich ifow Itp. Nie chcę też zbytnio przekazywać parametrem do openDoor() instancji klasy która to wywołuje bo znowu muszę tam ifowac nw ogólnie jak to rozplanować żeby nie było burdelu w kodzie. Ktoś ma jakiś pomysł jak najlepiej stworzyć szkielet czegoś takiego

0

A po co konkretnie chcesz to zrobić?

Jeśli Kierowca i AutoPilot mają emitować eventy, ale w taki sposób że na event od jednego ma być jedna reakcja, a na event od drugiego inna - to po co w ogóle emitować ten event? Czemu AutoPilot i Kierowca nie mogą po prostu wywołać tych metod które muszą?

Wygląda to trochę tak jakbyś chciał dodać na siłę obostrzenie na kod które nie jest potrzebne.

Jeśli potrzebujesz zrobić DependencyInversion to najprosćiej chyba byłoby emitować dwa osobne eventy - po co emitować ten sam, skoro ma być inaczej handlowany?

0

Chodzi po prostu o to że mam np klasę zdarzenia tego DoorOpenedEvent czyli że dzwi zostały otwarte i się coś odpala tam. Tylko że właśnie chce żeby to było zależne od tego kto wywołał car.openDoor() albo klasa AutoPilot albo ta druga Kierowca i jak np klasa Kierowca odpala car.openDoor() to się odpala zdarzenie tam w metodzie openDoor() ale właśnie dla tej klasy która to wywołała czyli odpala się zdarzenie DoorOpenedEvent z implementacja dla klasy Kierowca analogicznie do drugiej. To może dosyć dziwne jest ale ja po prostu taki system jakiś potrzebuje. Bo mam klasę właśnie taką AutoPilot która przyjmuje różne zadania "taski" np taski zrobcos<parametry> i to przechodzi przez parser i zwraca jakaś metodę która to odpala i np zrobcos odpala metodę car.openDoor() z tymi parametrami i ja chce odpalić właśnie zdarzenie w openDoor() dla klasy AutoPilot bo np inną klasa może odpalić też te metodę i wtedy odpala się DoorOpenedEvent ale dla danej klasy.

Mogę np przekazać parametrem car.openDoor(Autopilot albo Kierowca) noi tam już mam dostęp kto to wywołał ale znowu muszę ify jakieś robić

class Car {
   public void openDoor(KtoWywolal) {
       // Otwieranie drzwi
       if KtoWywolal=== AutoPilot
      // Odpalaj zdarzenie eventManagerem
      eventManager.callEvent(DoorOpenedEvent); 
      Else if KtoWywolal=== Kierowca
       eventManager.callEvent(DoorOpenedEvent);  odpala się inpmentafjs dla klasy Kierowca 

   }
}

I te ifowanie brzydko wygląda i nw właśnie czy jakiś inny sposób jest.

0

To o czym mówisz, że nie podobają Ci się if to brzmi jak problem z Dependency Inversion.

Obejrzyj sobie ten filmik: youtu.be/zHiWqnTWsn4?si=EUSPDtYO5j-tPK99&t=3600 (od 059 do końca) - 22 minuty.

0

Jak dla mnie to nie powinno mieć znaczenia kto wywołał metodę openDoor a szczególnie w przypadku, kiedy efektem końcowym ma być wywołanie eventu DoorOpenedEvent. Jeśli potrzebujesz to rozróżnić to jak dla mnie potrzebujesz odrębnych metod dla obu "wołaczy".

Może napisz dlaczego wg Ciebie potrzebujesz tego rozróżnienia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1