Programowanie obiektowe

Podobne dokumenty
Programowanie obiektowe

Programowanie w języku Java

Aplikacja wielowątkowa prosty komunikator

Aplikacja wielow tkowa prosty komunikator

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie obiektowe

Programowanie obiektowe i zdarzeniowe

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Java. Programowanie Obiektowe Mateusz Cicheński

Programowanie obiektowe

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie obiektowe

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie obiektowe

Wykład 7: Pakiety i Interfejsy

W powyższym kodzie utworzono wyliczenie dni tygodnia.

Wstęp. Ale po co? Implementacja

Kurs WWW. Paweł Rajba.

Współbieżność w środowisku Java

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

MeetingHelper. Aplikacja Android ułatwiająca przekazywanie materiałów pomiędzy uczestnikami spotkania. Instrukcja obsługi dla programisty

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Java: interfejsy i klasy wewnętrzne

Aplikacja Sieciowa wątki po stronie klienta

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Języki i metody programowania Java. Wykład 2 (część 2)

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Język JAVA podstawy. Wykład 4, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Polimorfizm. dr Jarosław Skaruz

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Programowanie obiektowe

Dokumentacja do API Javy.

Podstawy programowania obiektowego

Java Język programowania

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Projektowanie aplikacji internetowych laboratorium

Programowanie w Javie wykład 8 Interfejsy

Wykład 4: Klasy i Metody

Aplikacje w środowisku Java

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

public enum Environment { Development("Deweloperskie"), Test("Testowe"), Production("Produkcyjne"); private String name;

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Wykład 5: Więcej o Klasach i Metodach

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Przypomnienie o klasach i obiektach

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Kurs programowania. Wykład 9. Wojciech Macyna

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

Komunikacja z użyciem gniazd aplikacje klient-serwer

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

PRZETWARZANIE ROZPROSZONE ZADAN` Mariusz Gil 4Developers 2012, Poznań

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Programowanie obiektowe

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Programowanie obiektowe

PHP 5 język obiektowy

Programowanie MorphX Ax

Kurs programowania. Wykład 8. Wojciech Macyna

Aplikacje RMI Lab4

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Wywoływanie metod zdalnych

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Laboratorium - Poznawanie FTP

Akademia ETI. Wprowadzenie do programowania w Javie PG Java User Group Przemysław Kulesza

Komunikator internetowy w C#

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Podejście obiektowe do budowy systemów rozproszonych

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Zaawansowane programowanie w języku C++ Klasy w C++

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Aplikacje w środowisku Java

Diagramy klas. dr Jarosław Skaruz

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

Dawid Gierszewski Adam Hanasko

1 Atrybuty i metody klasowe

Specyfikacja projektów zaliczeniowych

Programowanie obiektowe

Transkrypt:

Programowanie obiektowe Wykład 14: Typ wyliczeniowy. Przykład. Podsumowanie. Po co typ wyliczeniowy? Zbiór wartości określony przez użytkownika Symboliczne nazwy wartości Automatyczna kontrola 1

Przykład 1 public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY public class EnumTest { Day day; public EnumTest(Day day) { this.day = day; public void tellitlikeitis() { switch (day) { case MONDAY: System.out.println("Mondays are bad."); break; case FRIDAY: System.out.println("Fridays are better."); break; case SATURDAY: case SUNDAY: System.out.println("Weekends are best."); break; default: System.out.println("Midweek days are so-so."); break; public static void main(string[] args) { EnumTest firstday = new EnumTest(Day.MONDAY); firstday.tellitlikeitis(); EnumTest thirdday = new numtest(day.wednesday); thirdday.tellitlikeitis(); EnumTest fifthday = new EnumTest(Day.FRIDAY); fifthday.tellitlikeitis(); EnumTest sixthday = new EnumTest(Day.SATURDAY); sixthday.tellitlikeitis(); EnumTest seventhday = new EnumTest(Day.SUNDAY); seventhday.tellitlikeitis(); Typ wyliczeniowy jako klasa java.lang.enum Metody: valueof(), name(), ordinal(), itp. Np. Day d; d=new Day(MONDAY); d=sunday; 2

Przykład 2 public enum Planet { MERCURY (3.303e+23, 2.4397e6), VENUS (4.869e+24, 6.0518e6), EARTH (5.976e+24, 6.37814e6), MARS (6.421e+23, 3.3972e6), JUPITER (1.9e+27, 7.1492e7), SATURN (5.688e+26, 6.0268e7), URANUS (8.686e+25, 2.5559e7), NEPTUNE (1.024e+26, 2.4746e7); private final double mass; // in kilograms private final double radius; // in meters Planet(double mass, double radius) { this.mass = mass; this.radius = radius; private double mass() { return mass; private double radius() { return radius; public static final double G = 6.67300E-11; double surfacegravity() { return G * mass / (radius * radius); double surfaceweight(double othermass) { return othermass * surfacegravity(); public static void main(string[] args) { double earthweight = Double.parseDouble(args[0]); double mass = earthweight/earth.surfacegravity(); for (Planet p : Planet.values()) System.out.printf("Your weight on %s is %f%n", p, p.surfaceweight(mass)); Kolekcje dla typu wyliczeniowego EnumSet zawiera statyczne metody: range(e from, E to), of(e first, E last), complementof(), copyof(), allof() EnumMap klucze mogą być tylko wartościami typu wyliczeniowego: size(), containsvalue(), containskey(), get(), put(), remove(), putall(), clear(), keyset(), values(), entryset(), 3

Przykład 3 for (Day d : EnumSet.range(Day.MONDAY, Day.FRIDAY)) System.out.println(d); public enum Operation { PLUS, MINUS, TIMES, DIVIDE; double eval(double x, double y){ switch(this) { case PLUS: return x + y; case MINUS: return x - y; case TIMES: return x * y; case DIVIDE: return x / y; throw new AssertionError("Unknown op: " + this); Pytania 1. Cechy typu wyliczeniowego. 2. Czy można usunąć/zmienić wartości typu wyliczeniowego? 4

Przykład: Czat internetowy Serwer Klienci Funkcje serwera Obsługa połączeń z aplikacjami klienckimi Zarządzanie użytkownikami Logowanie Rejestracja Hasła Baza danych zarejestrowanych użytkowników Baza danych stałych pokoi Obsługa komunikatów Wiadomości prywatne Wiadomości publiczne Informacje o statusie użytkowników Przetwarzanie poleceń Odebranie polecenia od aplikacji klienckiej Przetworzenie polecenia Wysłanie odpowiedzi 5

Funkcje aplikacji klienckiej Obsługa użytkownika Użytkownicy stali (wymagana rejestracja i hasło) Użytkownicy tymczasowi (dowolna unikalna nazwa) Intrerfejs GUI Okno komunikatów (MessageWindow) Okno poleceń (CommandWindow) Okno z listą użytkowników (UsersWindow) Okno z listą pokoi (RoomWindow) Komunikacja z serwerem Wysyłanie komend do serwera Odbiór odpowiedzi Odbiór i przetwarzanie komend z serwera GUI aplikacji klienckiej login register logout Message window (text area) User Window (scrolled list) User: message Room Window (scrolled list) Command window (text field) 6

Polecenia aplikacji klienckiej @register user password @login user password @logout user @color text_color @priv user message @busy @join room @create room @remove room message Polecenia serwera $adduser user room $removeuser user room $setbusy user $setavail user $display message user color $accept user $deny user $addroom room $removeroom room 7

Akcje serwera Start aplikacji (main() ): Utworzenie instancji klasy Server Wczytanie bazy zarejestrowanych użytkowników: loadusers() Wczytanie bazy pokoi, a gdy lista pusta utworzenie pokoju publicznego towarzyski : loadrooms() Inicjalizacja listy klientów (pusta) Uruchomienie pętli oczekiwania na klientów (mainloop()) Zgłoszenie aplikacji klienckiej: Utworzenie wątku UserThread Dodanie wątku do clientlist Obsługa klienta: ClientThread(1) Inicjalizacja (run()): Utworzenie strumieni we/wy Uruchomienie pętli: oczekiwanie na następny komunikat od klienta getmessage() przetworzenie komunikatu: processmessage() wysłanie odpowiedzi: sendmessage() 8

Przetwarzanie komunikatów klienta (1) @register user password Dodanie użytkownika do bazy: reguser() Wysłanie odpowiedzi: $accept user gdy OK, lub $deny user gdy niepowodzenie @login user password Gdy password= : Utworzenie użytkownika tymczasowego Wysłanie odpowiedzi: $accept user gdy OK, lub $deny user gdy niepowodzenie Gdy password<> : Sprawdzenie użytkownika w bazie Wysłanie odpowiedzi: $accept user gdy OK, lub $deny user gdy niepowodzenie Gdy OK: Dołączenie użytkownika do pokoju Towarzyski Wysłanie do klienta: $addroom room dla wszystkich pokoi $adduser user room - dla wszystkich zalogowanych użytkowników Wysłanie do wszystkich: $adduser user Towarzyski Przetwarzanie komunikatów klienta (2) @logout user Wysłanie do wszystkich: $removeuser user room Usunięcie klienta z listy clientlist @color text_color Modyfikacja statusu klienta @priv user message Wysłanie do klienta zalogowanego jako user $display message client.user.name client.color @busy Modyfikacja statusu klienta Wysłanie do wszystkich: $setbusy user 9

Przetwarzanie komunikatów klienta (3) @join room Wysłanie do wszystkich: $removeuser user client.room Dodanie klienta do pokoju room Wysłanie do wszystkich: $adduser user room @create room Utworzenie pokoju administrowanego przez klienta Wysłanie do wszystkich: $addroom room @remove room Usunięcie pokoju Wysłanie do wszystkich (jeśli OK.): $removeroom room Przetwarzanie komunikatów klienta (4) Komunikat Wysłanie do wszystkich: $display komunikat client.user client.color jeśli klient był niekatywny: Zmiana statusu klienta Wysłanie do wszystkich: $setavail user Po zerwaniu połączenia: Zamknięcie połączenia Wysłanie do wszystkich: $removeuser user room Usunięcie wątku klienta 10

Projekt aplikacji serwera Server ClientThread Users userlist synchronized Rooms roomlist Client clientlist main() loadusers() loadrooms() reguser() loguser() forwardmessage() broadcastmessage() getmessage() processmessage() sendmessage() Message Message to/from client main() Główne klasy(1) Server Pola: private Users userlist Rooms roomlist Clients clientlist Metody: static public main(string[] params) private Users loaduserlist(string plik) private Rooms loadrooms(string plik) public boolean reguser(string nazwa, String haslo) public boolean loguser(string nazwa, String haslo) public void broadcastmessage(string message) public void forwardmessage(string Message, String username) 11

Główne klasy (2) ClientThread Pola: private Socket s private ObjectInputStream inp private ObjectOutputStream outp private ClientMessage messagein private ServerMessage messageout private Server serv private Client client Metody: public void run() private ClientMessage getmessage() private ServerMessage processmessage(clientmessage m) public synchronized void sendmessage(servermessage m) Główne klasy (3) abstract class Message Pola: String[] params Methods: public String getparam(int i) abstract Message process(object app) abstract class ServerMessage: Klasy pochodne: MAddRoom,MAddUser, MDelUser, MDelRoom, MSetBusy, MSetAvail, MAccept, MDeny, MDisplay abstract class ClientMessage: Klasy pochodne: MRegister, MLogin, MLogout, MBusy, MColor, MPriv, MMess, MCreateR, MRemoveR, MJoinR 12

Główne klasy (4) class MRegister extends ClientMessage Konstruktor: MRegister(String name, String haslo) Metody: servermessage process(object app): s = (Server) app; if (s.reguser(name,haslo)) return new MAccept(name) else return new MDeny(name) Wtedy metoda z klasy ClientThread: servermessage processmessage(m){ return m.process(serv) Główne klasy (5) Client dane o zalogowanym kliencie Pola: private ClientThread ct private User user Room room boolean busy int color Metody: public User getuser() public removeclient() 13

Główne klasy (6) User Pola: private String name private String password Metody: public boolean checkpass(string pass) public String getname() Users Pola private LinkedList userlist Metody: public boolean adduser(user u) public boolean removeuser(string name) Główne klasy (7) Room Pola: private String nazwa private TreeSet<User> userlist private User admin Metody: public User getadmin() public String getname() public boolean adduser(user u) public boolean removeuser(user u) public TreeSet<User> getuserlist() Rooms Pola private LinkedList<Room> roomlist Metody: public boolean addroom(room r) public boolean removeroom(string name) public boolean exists(string name) 14

Aplikacja kliencka Client connect() disconnect() setloginstate() main() ServerListener getmessage() processmessage() sendmessage() Message to/from server Message ClientWindow extends JFrame MessageWindow mes; UserWindow users; RoomWindow rooms; JButton login JButton logout JButton register addmessage() adduser() removeuser() busyuser() LoginListener actionperformed () CommandWindow actionperformed () LogoutListener actionperformed () actionperformed () LoginWindow JTextField user JTextField password RegisterListener Przetwarzanie poleceń serwera $adduser user adduser() - userwindow.addelement(user) $remove user removeuser() - userwindow.removeelement(user) $setbusy user busyuser(true) - userwindow.busyelement(user), e.g. available users - user_name busy users - #user_name $setavail user busyuser(false) - userwindow.availelement(user) $display message user color addmessage() - messagewindow.insertline(message,color) $accept user setloginstate(true) $deny user setloginstate(false) 15

Inne funkcje Obsługa zerwanych połączeń Zarządzanie użytkownikami: Usuwanie nieaktywnych, zarejestrowanych użytkowników Usuwanie użytkowników naruszających zasady czatu Zarządzanie pokojami: Usuwanie pokoi Kontrola dostępu do pokoi Pokoje stałe i tymczasowe Praktyka programowania obiektowego (1) Śpiesz się powoli (elegancja kodu) Niepotrzebnie nie komplikuj kodu Dziel i rządź Separacja twórcy od użytkownika klasy Używaj nazw nie wymagających komentarza Twórz kod testujący przed implementacją klasy Rozpocznij projekt od określenia klas, ich publicznych interfejsów i wzajemnych relacji Klasy powinny być jak najprostsze 16

Praktyka programowania obiektowego (2) Unikaj długich list argumentów Unikaj powtarzania kodu Nie nadużywaj instrukcji switch oraz if-else (może lepiej dziedziczenie lub polimorfizm?) Podstawowe funkcje powinny być w klasach bazowych Łatwiej jest rozszerzać klasy niż zawężać (nie umieszczaj w klasie wszystkich możliwych metod) Stosuj dziedziczenie jeśli będzie potrzeba rzutowania w górę (w przeciwnym przypadku rozważ kompozycję) Praktyka programowania obiektowego (3) Jeśli metody zachowują się zależnie od stanu zmiennych (albo od parametrów), rozważ reorganizację kodu (np. przeciążanie nazw) Stosuj hierarchię wyjątków Twórz kod dla innych (czytelny) Unikaj gigantycznych obiektów (nawyk z programowania proceduralnego) Obiekty nie powinny składać się z samych pól Korzystaj z mechanizmów programowania obiektowego 17

Koniec 18