Na pewno stęskniliście się za ciekawymi rozkminami na temat inżynierii oprogramowania więc wracamy dziś w kolejnej odsłonie. Problem, który chciałbym poruszyć jest związany z przekazywaniem danych do kontrolek w widoku we wzorcu MVP.
W najbardziej klasycznym ujęciu na prezenterze wywołana zostaje jakaś akcja. Prezenter uruchamia odpowiednie serwisy a następnie zebrane dane przesyła do warstwy widoku w celu ich prezentacji. Problem pojawia się właśnie w tym ostatnim punkcie - jak zrobić to przekazywanie z głową?
Załóżmy, że mam widok który składa sie z kilku komponentów, każdy z nich z jeszcze kilku i tak przez pare poziomów. Np. mamy okienko w którym jest kilka paneli, jeden z tych paneli zawiera jeszcze kilka innych paneli i na koniec ma pole tekstowe do którego właśnie ładuje sobie dane. W efekcie z punktu widzenia kodu mam taką śmieszną delegację metod bo prezenter wysyła dane do widoku, widok wysyła do odpowiedniego okienka, okienko do panelu, panel do swojego podpanelu a tamten dopiero do pola tekstowego. Kiedy na tym najniższym poziomie komponentów jest dużo to nagle te klasy wyżej mają po kilkanaście (lub więcej) delegowanych wywołań. Coś w stylu:
class View{
private final MainWindow window;
//
public void loadText(String text){
window.loadText(text);
}
}
class MainWindow{
private final MainPanel mainPanel;
//
public void loadText(String text){
mainPanel.loadText(text);
}
}
class MainPanel{
private final TextPanel textPanel;
//
public void loadText(String text){
textPanel.loadText(text);
}
}
class TextPanel{
private final TextField textField;
//
public void loadText(String text){
textField.loadText(text);
}
}
Jednym pomysłem byłoby spłaszczenie struktury, tzn władowanie tych komponentów na poziomie jednej klasy, ale efekt raczej odwrotny od zamierzonego bo mamy wtedy klasę mother-of-all-views
;) Niemniej nie bardzo jest to możliwe bo te komponenty są wielokrotnie re-używane więc ich separacja ma generalnie sens.
Od razu mówie że wiem że są technologie które ten problem rozwiązują poprzez wiązanie danych z komponentami za pomocą identyfikatorów (np. technologie webowe zwykle tak robią, robi tak też chyba WPF). Swing takich cudów nie posiada więc jeśli chciałbym coś takiego mieć to musiałbym to sam napisać i wydaje mi się to niekoniecznie eleganckie, chyba że ktoś ma pomysł jak można by coś takiego zaimplementować (w sposób sensowny więc nie poprzez pchanie jakiegoś Map<String, Object>
a potem rzutowanie tego objecta...)
Podkreślam tu że chodzi o MVP ponieważ w MVC zwykle istnieje jakieś powiązanie modelu z widokiem i aktualizacja następuje "automatycznie" za pomocą jakiegoś Observera. Niemniej w tym przypadku trudno mówić o jakimś "modelu" w sensie danych przechowujących stan aplikacji, jak w jakiejś grze komputerowej. Niemniej teoretycznie mógłbym tak zrobić, że komponenty rejestrują sie gdzieś jako obserwatorzy, tylko gdzie? W prezenterze?
@somekind @Koziołek @Krolik @niezdecydowany @karolinaa @msm @winerfresh @stryku @Patryk27 @katelx @WhiteLightning @datdata @spartanPAGE @Wizzie @Azarien @Satirev @MarekR22 @Afish @panryz @Wibowit @azalut @mychal @_Mateusz_ @krzysiek050
(wołam tych co ostatnio plus tych co sie wypowiadali więc jak kogoś nie ma to sam sobie winien bo mi ostatnio nic nie napisał :P)
karolinaaShalom