Programowanie obiektowe Wykład 7 Marcin Młotkowski 8 kwietnia 2015
Plan wykładu Z życia programisty, część 1 1 Z życia programisty, część 1 2 3 Z życia programisty, część 2 Model View Controller MVC w u Marcin Młotkowski Programowanie obiektowe 2 / 44
Etap 1 Z życia programisty, część 1 Specyfikacja Zaprogramować system do obsługi biblioteki. Marcin Młotkowski Programowanie obiektowe 3 / 44
Z życia programisty, część 1 Fragment implementacji public class Ksiazka { private String tytuł; private String autor; private int wydanie; public Ksiazka(String t, String a, int w) { this.tytuł = t; this.autor = a; this.wydanie = w; } public String tostring() { return "Książka " + this.tytuł + " " + this.autor; } } Marcin Młotkowski Programowanie obiektowe 4 / 44
Etap 2 Z życia programisty, część 1 Rozszerzenie specyfikacji Ale żeby jeszcze dało się edytować dane w okienku! Marcin Młotkowski Programowanie obiektowe 5 / 44
Z życia programisty, część 1 Implementacja w Javie public class Ksiazka { private String tytuł; private String autor; private int wydanie; public Ksiazka(String t, String a, int w) {... } public String tostring() {... } public void Edycja() {... } } Marcin Młotkowski Programowanie obiektowe 6 / 44
Plan wykładu Z życia programisty, część 1 1 Z życia programisty, część 1 2 3 Z życia programisty, część 2 Model View Controller MVC w u Marcin Młotkowski Programowanie obiektowe 7 / 44
Z życia programisty, część 1 Wprowadzenie do biblioteki Najważniejsze informacje istotnie ulepszona wersja AWT (Abstract Window Toolkit); niezależność wyglądu i innych mechanizmów od systemu operacyjnego; wsparcie dla internacjonalizacji. Intensywnie korzysta z mechanizmów obiektowych: klas, obiektów i dziedziczenia. Marcin Młotkowski Programowanie obiektowe 8 / 44
Z życia programisty, część 1 Z czego składa się Część widoczna Okna, kontrolki i menu Obsługa kliknięć Zdarzenia i słuchacze. Marcin Młotkowski Programowanie obiektowe 9 / 44
Gdzie jest? Z życia programisty, część 1 import javax.swing.*; import java.awt.*; import java.awt.event.*; Marcin Młotkowski Programowanie obiektowe 10 / 44
Hierarchia klas Z życia programisty, część 1 javax.swing.* JComponent Frame JLabel JTextComponent JFrame JTextField Marcin Młotkowski Programowanie obiektowe 11 / 44
Z życia programisty, część 1 Szybkie rozwiązanie Marcin Młotkowski Programowanie obiektowe 12 / 44
Okno główne Z życia programisty, część 1 JFrame frame = new JFrame("Edycja książki"); frame.setdefaultcloseoperation(jframe.exit_on_close); Marcin Młotkowski Programowanie obiektowe 13 / 44
Okno główne Z życia programisty, część 1 JFrame frame = new JFrame("Edycja książki"); frame.setdefaultcloseoperation(jframe.exit_on_close); Container kontener = frame.getcontentpane(); GridLayout layout = new GridLayout(4, 2); kontener.setlayout(layout); Marcin Młotkowski Programowanie obiektowe 13 / 44
Edycja autora Z życia programisty, część 1 JLabel autor_etykieta = new JLabel("Autor"); kontener.add(autor_etykieta); JTextField autor = new JTextField(this.autor, 40); kontener.add(autor); Marcin Młotkowski Programowanie obiektowe 14 / 44
Edycja tytułu Z życia programisty, część 1 JLabel tytuł_etykieta = new JLabel("Tytuł"); kontener.add(tytuł_etykieta); JTextField tytuł = new JTextField(this.tytuł, 40); kontener.add(tytuł); Marcin Młotkowski Programowanie obiektowe 15 / 44
Edycja wydania Z życia programisty, część 1 JLabel wydanie_etykieta = new JLabel("Wydanie"); kontener.add(wydanie_etykieta); JTextField wydanie = new JTextField(Integer.toString(this.wydanie), 40); kontener.add(wydanie); Marcin Młotkowski Programowanie obiektowe 16 / 44
Z życia programisty, część 1 Przycisk zapisu danych JButton b = new JButton("Zapisz"); b.addactionlistener(this); kontener.add(b); Marcin Młotkowski Programowanie obiektowe 17 / 44
Z życia programisty, część 1 Zakończenie budowania okna edycji frame.pack(); frame.setvisible(true); Marcin Młotkowski Programowanie obiektowe 18 / 44
Z życia programisty, część 1 Reakcja na kliknięcie public class Ksiazka implements ActionListener { public void actionperformed(actionevent e) { } // np. pobranie z kontrolki wpisanych danych: JTextfield.getText(); } public void Edycja() { b.addactionlistener(this); } Marcin Młotkowski Programowanie obiektowe 19 / 44
Wynik Z życia programisty, część 1 Marcin Młotkowski Programowanie obiektowe 20 / 44
Z życia programisty, część 1 Zdarzenie Kliknięcie myszką, naciśnięcie klawisza, upłynięcie czasu, zakończenie jakiejś operacji. Kontrolka Kontrolka związana ze zdarzeniem, np. kliknięty przycisk. Obsługa zdarzenia Akcja (metoda) wykonywana po zaistnieniu zdarzenia. Marcin Młotkowski Programowanie obiektowe 21 / 44
Z życia programisty, część 1 Subskrypcja zdarzeń w u Kontrolka "przyjmująca zdarzenia" Kontrolka ma listę klas, które implementują interfejs ActionListener. Po każdym zdarzeniu wszystkie elementy listy są informowane o zaistnieniu zdarzenia. Słuchacz Implementuje metodę actionperformed(actionevent), która jest wywoływana w momencie wystąpienia zdarzenia. Marcin Młotkowski Programowanie obiektowe 22 / 44
Z życia programisty, część 1 Implementacja nasłuchu public class Ksiazka implements ActionListener { public void actionperformed(actionevent e) {... } public void Edycja() {... JButton b = new JButton("Zapisz"); b.addactionlistener(this);... } } Marcin Młotkowski Programowanie obiektowe 23 / 44
Słuchacze Z życia programisty, część 1 Obiekty mogą rejestrować Słuchaczy (dowolną ich liczbę); informacja o zmianach jest rozsyłana przez obiekt do wszystkich słuchaczy; w u Słuchacz implementuje interfejs EventListener i pochodnych, w tym ActionListener. Marcin Młotkowski Programowanie obiektowe 24 / 44
Z życia programisty, część 1 Implementacja słuchacza, 1. podejście public class Ksiazka implements ActionListener { b.addactionlistener(this); } Marcin Młotkowski Programowanie obiektowe 25 / 44
Z życia programisty, część 1 Implementacja słuchacza, 2. podejście public class Ksiazka { class MyListener implements ActionListener { public void actionperformed(actionevent e) {... } } }... b.addactionlistener(new MyListener());... Marcin Młotkowski Programowanie obiektowe 26 / 44
Z życia programisty, część 1 Implementacja słuchaczy, 3. podejście Klasa anonimowa b.actionlistener( new ActionListener() { public void actionperformed(actionevent evt) {... } } ); Marcin Młotkowski Programowanie obiektowe 27 / 44
Z życia programisty, część 1 Własności klasy anonimowej można definiować "w locie" i nie trzeba wymyślać nazwy; klasa anonimowa ma dostęp do zmiennych obiektu macierzystego. Marcin Młotkowski Programowanie obiektowe 28 / 44
Plan wykładu Z życia programisty, część 1 Z życia programisty, część 2 Model View Controller MVC w u 1 Z życia programisty, część 1 2 3 Z życia programisty, część 2 Model View Controller MVC w u Marcin Młotkowski Programowanie obiektowe 29 / 44
Z życia programisty, część 1 Rozwój oprogramowania Z życia programisty, część 2 Model View Controller MVC w u Ale żeby działało na komórce/palmtopie/... Marcin Młotkowski Programowanie obiektowe 30 / 44
Z życia programisty, część 1 Rozwój oprogramowania Z życia programisty, część 2 Model View Controller MVC w u Ale żeby działało na komórce/palmtopie/... Implementacja public class Ksiazka { public void Edycja() {... } public void EdycjaWersjaKomórkowa() {... } public void EdycjaWersjaPalmtop() {... } } Marcin Młotkowski Programowanie obiektowe 30 / 44
Wynik Z życia programisty, część 1 Z życia programisty, część 2 Model View Controller MVC w u implementacja "właściwej" klasy Książka: 15 wierszy; implementacja edycji (tylko ): 40 wierszy Marcin Młotkowski Programowanie obiektowe 31 / 44
Refleksja Z życia programisty, część 1 Z życia programisty, część 2 Model View Controller MVC w u Czy klasa Ksiazka ma dobrą nazwę? Marcin Młotkowski Programowanie obiektowe 32 / 44
Z życia programisty, część 1 Co jest w środku klasy Ksiazka? Z życia programisty, część 2 Model View Controller MVC w u implementacja funkcjonalności związanej z modelowaniem książki kod odpowiedzialny za interakcję ze środowiskiem okienkowym Marcin Młotkowski Programowanie obiektowe 33 / 44
Z życia programisty, część 1 Z życia programisty, część 2 Model View Controller MVC w u Reguła programowania obiektowego Zasada pojedynczej odpowiedzialności Klasa powinna mieć wyłącznie jeden obszar odpowiedzialności. Marcin Młotkowski Programowanie obiektowe 34 / 44
Wprowadzenie Z życia programisty, część 1 Z życia programisty, część 2 Model View Controller MVC w u Wzorzec projektowy MVC: Model View Controller jeden z pierwszych wzorców projektowych zaprojektowany dla biblioteki graficznej Marcin Młotkowski Programowanie obiektowe 35 / 44
Z życia programisty, część 1 Interakcja z otoczeniem Z życia programisty, część 2 Model View Controller MVC w u Edycja książki Książka - autor: String - tytuł: String - wydanie: int Marcin Młotkowski Programowanie obiektowe 36 / 44
MVC Z życia programisty, część 1 Z życia programisty, część 2 Model View Controller MVC w u Model Dane oraz zależności między nimi View Widok danych (ekran, drukarka, html) Controller "Coś" co modyfikuje stan Modelu (np. przyciski na ekranie). Marcin Młotkowski Programowanie obiektowe 37 / 44
Z życia programisty, część 1 Współdziałanie elementów Z życia programisty, część 2 Model View Controller MVC w u Kontroler ma referencję do Modelu i na podstawie akcji użytkownika (naciśnięcie klawisza) wywołuje odpowiednie metody modyfikujące stan Modelu. Widok (lub Widoki) nasłuchują zmian w Modelu i aktualizują wygląd w przypadku modyfikacji. Marcin Młotkowski Programowanie obiektowe 38 / 44
MVC w u Z życia programisty, część 1 Z życia programisty, część 2 Model View Controller MVC w u Edycja książki Książka - autor: String - tytuł: String - wydanie: int Marcin Młotkowski Programowanie obiektowe 39 / 44
Ulepszanie kodu Z życia programisty, część 1 Z życia programisty, część 2 Model View Controller MVC w u Rozdzielenie klasy na dwie klasy: public class Ksiazka {... } public class KsiazkaWidok { public KsiazkaWidok(Ksiazka k) {... } } Marcin Młotkowski Programowanie obiektowe 40 / 44
Podsumowanie Z życia programisty, część 1 Z życia programisty, część 2 Model View Controller MVC w u Rozdzielenie klas względem odpowiedzialności daje naturalny podział kodu; zastosowanie wzorca MVC lub podobnego daje możliwość niezależnej implementacji klas modelu i skojarzonych z nimi interfejsów graficznych; definiowanie podklasy modelu może naturalnie być odzwierciedlone w podklasie interfejsu. Marcin Młotkowski Programowanie obiektowe 41 / 44
Z życia programisty, część 1 Z życia programisty, część 2 Model View Controller MVC w u Ocena dotychczasowego rozwiązania rozdzielono obiekt od jego "edytora"; uruchomienie edytora wymaga przesłania danych z obiektu (modelu) do edytora; zakończenie pracy edytora wymaga przesłania poprawionych danych z edytora do obiektu. Marcin Młotkowski Programowanie obiektowe 42 / 44
Z życia programisty, część 1 Marzenie programisty Z życia programisty, część 2 Model View Controller MVC w u Powiązanie kontrolek (takich jak JTextField) bezpośrednio z danymi. Marcin Młotkowski Programowanie obiektowe 43 / 44
Z życia programisty, część 1 Rozwiązanie w u Z życia programisty, część 2 Model View Controller MVC w u Koncepcja dokumentu: dokument jest kontenerem na tekst; zarówno na prosty tekst jak i na ustrukturalizowane dokumenty (html, xml) dokumenty można podłączać jako obserwatory do kontrolek, wtedy transfer danych z kontrolki do dokumentu jest automatyczny; dalsze informacje: javax.swing.text.abstractdocument i podklasy. Marcin Młotkowski Programowanie obiektowe 44 / 44