Komunikacja dwóch controllerów

0

Mam dwa controllery dla dwóch różnych okien. Chciałbym, żeby jeden z nich w jakiś pośredni sposób wywoływał metodę tego drugiego.
Program miałby działać w ten sposób:

  1. w pierwszym oknie kliknij przycisk "dodaj" -> wyskakuje nowe okienko obsługiwane przez inny controller.
  2. uzupełnij dane w nowym oknie, kliknij przycisk "gotowe" -> prześlij dane do pierwszego controllera, zamknij okno.
  3. controller pierwszego okna aktualizuje widok z otrzymanych danych.
    Przesyłane dane są w postaci obiektu jednej klasy. W jaki sposób mógłbym to rozwiązać? A gdyby zamiast wysyłania obiektu miedzy controllerami, stworzyłbym w klasie na której operuje propertisy i w ten sposób uaktualniał dane? Przeszłoby? Czy takie rozwiązanie byłoby w tym wypadku eleganckie?
0

I gdzie dokłdanie widzisz problem? Możesz po prostu w jednym z kontrolerów mieć referencje do drugiego, albo możesz w trakcie spawnowania tego okna przekazać jakiś callback który zostanie wywołany kiedy user kliknie "gotowe".

0

Na twoim miejscu żadnych referencji w kontrolerze do drugiego kontrolera bym nie robił, przy komunikacji w obie strony zaczyna robić się bajzel. Zamiast tego zastosuj wzorzec projektowy: Obserwator z synchronizowaniem wywołań jeżeli oba kontrolery pracują w różnych wątkach. Przykład implementacji znajdziesz w Google, jak wpiszesz: "Rusz głową. Wzorce projektowe" w okrojonym pdfie znajdziesz adres FTP to kodów z książki a w śród nich przykład Obserwatora.

0

@MrMadMatt jeśli dwukierunkowo to 100 razy lepiej jakiś message passing zrobić albo jakiś prosty event bus. Klasyczny observer to jest zwykle bardzo zły pomysł ;]

0

@Shalom: Bardzo chętnie poznam powód dla których to używanie obserwatora jest "bardzo złym pomysłem". ;) Osobiście korzystam z tego wzorca w zmodyfikowanej wersji na modłe sygnałów-slotów jak w QT, i nurtuje mnie pytanie: gdzie w takim razie może mi się to wyłożyć?

1

@MrMadMatt

  1. Debugowaine kodu opartego o klasycznego observera jest generalnie dość ciężkie. Podejśćie signal/slot czy też event bus to jest trochę inna bajka, bo tutaj masz zwykle jasno określone jedno miejsce które generuje event/sygnał i masz jasno określone w kodzie wszystkie miejsca które oczekują na dany event. W przypadku klasycznego observera tego nie ma. Ktoś gdzieśtam sie rejestruje z jakimś callbackiem o generycznej sygnaturze i bez debugera i podglądania zawartości kolekcji z obserwatorami nie da sie stwierdzić kto i gdzie będzie dane zdarzenie obsługiwał.
  2. Jest spore ryzyko wycieków pamięci, bo zarejestrować obserwatora jest łatwo, ale żeby potem pamietać o jego wyrejestrowaniu to już niekoniecznie.

Dopiero co niedawno koleżanka prezentowała na forum problem z tym związany -> Usuwanie z pamieci zagnieżdżonych obiektów Java
pamięć cieknie a zdebugować gdzie i jak ciężko ;]

1
MrMadMatt napisał(a):

Na twoim miejscu żadnych referencji w kontrolerze do drugiego kontrolera bym nie robił, przy komunikacji w obie strony zaczyna robić się bajzel. Zamiast tego zastosuj wzorzec projektowy: Obserwator z synchronizowaniem wywołań jeżeli oba kontrolery pracują w różnych wątkach. Przykład implementacji znajdziesz w Google, jak wpiszesz: "Rusz głową. Wzorce projektowe" w okrojonym pdfie znajdziesz adres FTP to kodów z książki a w śród nich przykład Obserwatora.

Naprawdę sądzisz, że bezpośrednia referencja zrobi mniejszy bajzel od Observera? Kolejka dla większych aplikacji - owszem. Ale oddzielne obserwatory niepotrzebnie tylko utrudnią czytanie kodu.

0
Shalom napisał(a):

I gdzie dokłdanie widzisz problem? Możesz po prostu w jednym z kontrolerów mieć referencje do drugiego

Właśnie tutaj. Nie wiem w jaki sposób dostać referencję konkretnie tego pierwszego kontrolera. We wcześniejszych aplikacjach które przyszło mi pisać sprawa była łatwiejsza, bo kontrolery które się ze sobą komunikowały łączył inny, który zawierał w sobie pozostałe.
Nie mam pojęcia jak się do tego zabrać. Jest możliwość przy tworzeniu nowego okna, dostanie się do konstruktora jego kontrolera?

MrMadMatt napisał(a):

zastosuj wzorzec projektowy: Obserwator z synchronizowaniem wywołań jeżeli oba kontrolery pracują w różnych wątkach.

Słyszałem właśnie, że książka o której mówisz jest bardzo dobra. Tylko, że na ten moment chciałbym się nauczyć w jaki prawidłowy sposób przekazywać referencję w takim przypadku.

0
Wielki Młot napisał(a):
Shalom napisał(a):

I gdzie dokłdanie widzisz problem? Możesz po prostu w jednym z kontrolerów mieć referencje do drugiego

Właśnie tutaj. Nie wiem w jaki sposób dostać referencję konkretnie tego pierwszego kontrolera. We wcześniejszych aplikacjach które przyszło mi pisać sprawa była łatwiejsza, bo kontrolery które się ze sobą komunikowały łączył inny, który zawierał w sobie pozostałe.
Nie mam pojęcia jak się do tego zabrać. Jest możliwość przy tworzeniu nowego okna, dostanie się do konstruktora jego kontrolera?

A masz na myśli okno Swingowe czy FXowe? Choć to bez znaczenia, w obu przypadkach da się to zrobić. Jeżeli o FXa chodzi to tutaj masz przykład jak można stworzyć obiekt kontrolera z parametrami własnymi i poprawnie ustawić go w FXMLLoader: https://stackoverflow.com/questions/40812769/javafx-fxmlloader-setcontrollercontroller-doesnt-load-scene

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