2013-04-18 12 views
7

Po stwierdzeniu, że całkowicie zignorowałem wzorzec MVC, próbowałem wykorzystać tę koncepcję w aplikacji z widokiem Swing. Przeczytałem już większość postów na temat MVC z Swingiem, ale nadal jestem nieco zdezorientowany, ponieważ jest to dla mnie zbyt skomplikowane, i myślę, że potrzebuję pewnych podstawowych wyjaśnień, więc nie ruszyłem na niewłaściwą ścieżka.MVC i Swing w aplikacji desktopowej

Zastanawiam się także, jak często używa się MVC w prawdziwych projektach. Wiele samouczków online pozbywa się kontrolera i miesza go z modelem, podczas gdy ja byłem zdezorientowany przez możliwości logiki biznesowej XSTL. Dlaczego chcesz adresować źródło danych z widoku JSP?

Te myśli na bok, moja właściwe pytanie brzmi:

Jeśli masz składnik Swing, należy detektor zdarzeń w tej klasie Swing zaktualizować stan komponentu poprzez wywołanie (? Statyczna może) metody w klasie kontrolera POJO, który z kolei otrzymuje odpowiednią logikę biznesową z modelu, który składa się z hierarchii klas POJO i powiązanej trwałości?

+3

Witamy w gnieździe szerszeni. Swing miesza paradygmat MVC, umożliwiając wirtualizację "VC" w jeden komponent. Dobro lub zło jest nieistotne, tak po prostu jest. To, co robi, to spróbować oddzielić dane od widoku. Są pewne szkoły myśli, że należy usunąć element "kontroli" z widoku do własnej klasy, osobiście uważam, że to tylko zwiększa złożoność i zachęca więcej problemów, niż to jest warte - IMHO. Ogólnie rzecz biorąc, twój widok/kontroler nigdy nie powinien być w stanie bezpośrednio zmienić danych, to jest odpowiedzialność za model - IMHO – MadProgrammer

+0

Ah, dziękuję. To sprawiło, że sprawy stały się bardziej jasne. Ale czy zgodziłbyś się, że ma sens wprowadzenie oddzielnego kontrolera, jeśli implementacja GUI prawdopodobnie się zmieni (na przykład SWT)? Szkoda, że ​​nie można upvote swój komentarz - nie mają jeszcze reputacji :) –

+0

Oddzielny regulator sens tylko wtedy, gdy API/ram działa w podobny sposób, mają jakiś rodzaj interfejsów. To powiedziawszy, jeśli napiszesz swojego kontrolera używając tego samego paradygmatu, w jakim zostały napisane modele (tj. Zacznij od interfejsu, przejdź do abstrakcyjnej implementacji, a następnie pozwól na wiele implementacji konkretnych), byłoby to możliwe. Musiałby to być rozważany akt balansowania, ale postrzegany, jako że chciałbym wszystko streścić, aby implementacja nie była znana tym, którzy go używają, tak, uznałbym to za rozsądny pomysł – MadProgrammer

Odpowiedz

10

Pracowałem jako wolny strzelec przez długi czas, a prawie 90% projektów dotyczyło Java Swing (aplikacje na komputery stacjonarne). Również wiele projektów obejmowało migrację z języków takich jak Visual Fox Pro do Java, to był ból, ponieważ trudną częścią jest nie myśleć w logice, która jest już zrobiona, najtrudniejszą częścią jest wziąć kod, który jest bałaganem i zmienić go do dobrze wyglądającego kodu zgodnego z dobrymi praktykami i wzorcami projektowymi, dlatego dobrym pomysłem jest stworzenie schematu lub mapy w swoim umyśle, w jaki sposób można oddzielić swój kod zgodnie z koncepcjami Modelu, widoku, kontrolera.

MVC, jak wspomniano, pomaga mieć atrakcyjny, łatwy w utrzymaniu i czytelny kod, a także postępować zgodnie z paradygmatami programowania i dobrymi praktykami.

Zobacz: Oczywiście, że część, która współdziała z użytkownikiem (interfejsem użytkownika), w przypadku Swing, okna, ramki, panele i cały kod, który obejmuje elementy graficzne potrzebne do aplikacji.

Kontroler: Zawiera rdzeń lub logikę biznesową, które utwierdziłeś dla swojej aplikacji, w tej "warstwie" powinieneś uwzględnić funkcjonalność i "jak moja aplikacja osiągnie cele?".

Model: Powiązane z danymi zarządzanie, na przykład, twoje jednostki i klasy, która reprezentuje dane, które chcesz zarządzać lub dać konserwacji.

Stosowanie MVC nie jest tak trudne, ale jak wspomniałem, może to być czasem problem, kiedy trzeba przenieść swój kod z nie stosującej się struktury MVC do aplikacji strukturalnej MVC. Łatwiej jest rozpocząć kodowanie za pomocą MVC.

Sposób, w jaki się do tego przyzwyczaję to użycie maven i oddzielenie mojej aplikacji w małe "moduły", oczywiście, nie potrzebujesz maven, po prostu uznałem to za przydatne w tym momencie, ale w każdym razie możesz spróbuj ćwiczyć lub przyzwyczaić się do MVC, oddzielając aplikację na małe projekty, na przykład:

Java Project 1: model danych aplikacji (zawiera cały kod związany z zarządzaniem danymi: podmioty, dtos, fasola, daos)

Java Projekt 2: application-core-kontroler (zawiera wszystkie logiki biznesowej i funkcjonalność, można użyć wzoru elewacji tutaj, jeśli chcesz, aby Twój kod bardziej „przezroczyste”, gdy odnoszą się do widoku)

Java Projekt 3: application-view-ui (zawiera wszystkie panele, ramy i elementy graficzne)

Pracując w ten sposób pomógł mi (i zmusił mnie), aby przyzwyczaić się do oddzielenia mój kod i pilnować co naprawdę ma znaczenie dla projektu, nad którym pracuję. Na przykład, jeśli jestem na modelu danych aplikacji, koncentruję się na modelu danych, nie myślę logiki biznesowej ani interfejsu graficznego.

Długie wyjaśnienie, może ktoś mógłby zrobić to lepiej, ale mam nadzieję, że mogłem ci pomóc lub przynajmniej dałem ci z tym rękę.

Pozdrawiamy.

+0

Dziękuję! Potrzebuję trochę czasu, żeby to przemyśleć, zanim jednak uznam, że jest to akceptowana odpowiedź. Logika biznesowa wydaje się logiczna, ale zrozumiałem, że nie jest to dobry pomysł i powinien być częścią modelu. –

+1

nie martw się, jesteśmy tu, aby Ci pomóc. Wspomniałeś o dobrej sprawie i zgadzam się z tobą, że model powinien zawierać pewną logikę, ale ta logika powinna dotyczyć tylko dostępu do danych i podmiotów, którymi się posługujesz, jak DAOS. W kontrolerze możesz mieć inne procesy, takie jak obliczanie wynagrodzeń, delegowanie odpowiedzialności. I znowu, jak pisałeś, kontroler użyje modelu do zarządzania lub mapowania danych. Możesz dodać dodatkowe wzory, takie jak fasada (tak jak wspomniałem), aby oddzielić nieco więcej logiki biznesowej od widoku. –

+1

@MarceloTataje: Więc kiedy porówna to do typowej aplikacji sieciowej Java, kontroler zostanie zmapowany do warstwy serwisowej, modelu do warstwy DAO i warstwy View to Web? Pytam o to, ponieważ będę konwertował mój projekt aplikacji internetowej do aplikacji komputerowej Java. –

3

Firs URL dla podstawowego zrozumienia MVC

http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

Teraz podejścia do wdrożenia go w aplikacji Swing. Nie należy mylić funkcjonalności kontrolera z funkcjonalnością słuchaczy.

  1. Kontrolki interfejsu użytkownika i związane z nim odbiorniki należy zdefiniować w klasach widoków.
  2. W każdym przypadku, gdy konieczne jest wywołanie logiki biznesowej, należy wywołać klasę kontrolera. Podobnie jak pobieranie pewnej wartości z bazy danych.
  3. Klasa kontrolera powinna rozmawiać z twoim modelem, aby pobrać dane i manipulować nimi, jeśli to konieczne.
  4. Klasy modeli powinny działać na danych.

Pomysł użycia MVC polega na zredukowaniu redundantnego kodu i łatwiejszego w zarządzaniu kodu. Jeśli więc robisz jakieś obliczenia/manipulacje, to możesz je przenieść do Kontrolerów. Kontrolery mogą być wywoływane z różnych widoków wymagających tych samych rzeczy. Podobnie model może być używany przez wiele kontrolerów do pobierania danych.

+0

Podejrzewam, że jest to tak zwany gruby kontroler. Widziałem kilka komentarzy mówiących, że kontroler powinien być tak cienki, jak to możliwe, więc myślę, że wszystko, co może być obsługiwane w modelu, powinno być tam obsługiwane. Być może wciąż jestem w tym zagmatwanym stanie, ale przeczytam nieco więcej, zanim zaakceptuję twoją odpowiedź. –

+0

Czy uważasz, że linia myślenia jest błędna: "Szybko odkryliśmy, że podział ten nie sprawdził się w praktyce, ponieważ widok i elementy kontrolera elementu wymagały ścisłego połączenia (na przykład bardzo trudny do napisania ogólny kontroler, który nie znał szczegółów dotyczących widoku), więc zwinęliśmy te dwie jednostki w jeden obiekt interfejsu użytkownika ("interfejs użytkownika") "(http://www.oracle.com/technetwork/java/ architecture-142923.html) –

+1

Zgadzam się, że trudno jest osiągnąć czysty model MVC. Dzieje się tak głównie dlatego, że działa na modelu słuchaczy. Nadal jednak uważam, że wiele kodu można przenieść do kontrolerów, jeśli nie wszystkich. W skrócie, jeśli kochasz MVC, powinieneś być w stanie zastosować się do niego jak najbliżej :-) –

Powiązane problemy