Języki i paradygmaty programowania (JIPP)
Transkrypt
Języki i paradygmaty programowania (JIPP)
Języki i paradygmaty programowania (JIPP) dr hab. inż. Adam Niewiadomski, prof. nadzw. Informatyka, III sem. studia dzienne inżynierskie PWSZ we Włocławku Program przedmiotu ● 1 część semestru (ok. 4-5 wykładów) – – – OOP i inne techniki programowania (zarys) Generacje języków programowania Trójwarstwowa architektura aplikacji ● – ● W. danych, w. logiki, w. Interfejsu użytkownika Fazy życia oprogramowania 2 część semestru (ok. 8-9 wykładów) – Język Java (Aplikacje konsoli, graficzny interfejs użytkownika, aplikacje okienkowe) ● Programowanie obiektowe, zorientowane obiektowo, programowanie komponentowe, klasa-obiektkomponent http://ics.p.lodz.pl/~aniewiadomski Cykl slajdów nie stanowi kompletnego opracowania, a zwłaszcza nie jest skryptem zastępujacym wykład. Należy traktować go wyłącznie jako zbiór notatek ułatwiajacych słuchaczom udział w zajęciach. Slajdy można przetwarzać pod warunkiem nienaruszania praw autora, w szczegolnosci (ale bez ograniczenia do) rozpowszechniania całosci lub fragmentów w jakiejkolwiek formie bez zgody autora. Cykl inżynierii oprogramowania (1) ● Algorytmy i złożoność obliczeniowa – ● Struktury danych, tablice, pętle, instrukcje warunkowe i skoku, sortowanie, wyszukiwanie elementów w tablicach itp. Podstawy programowania – – Programowanie proceduralne – instrukcje sterujące, implementacja podstawowych algorytmów, tablice i dynamiczne struktury danych, kompilacja, praca krokowa, debugging Projektowanie klas, obiektów i ich funkcji składowych, dziedziczenie klas Cykl inżynierii oprogramowania (2) ● Języki i paradygmaty programowania – – – – – Techniki i generacje języków programowania Trójwarstwowa architektura aplikacji Fazy życia oprogramowania (zarys) Trójwarstwowa architektura aplikacji i jej realizacja w języku Java Obiekt – klasa – komponent jako powtarzalne (reusable) fragmenty kodu ● Wykorzystanie technik OOP i komponentów do produkcji aplikacji niezależnych sprzętowo z tekstowym i/lub graficznym interfejsem użytkownika (GUI) Cykl inżynierii oprogramowania (3) ● Inżynieria oprogramowania – ● Analiza i projektowanie obiektowe, język UML (najprawdopodobniej) Założenie: słuchacz najpierw poznaje techniki implementacji, później uczy się stosować je na szerszą skalę i uzależniać od nich pozostałe fazy projektu informatycznego – – ''Od szczegółu do ogółu'' Zależy to także od pozostałych przedmiotów ● Bazy danych, sieci komp., bezpieczeństwo systemów, programowanie aplikacji klient-serwer, podstawy programowania sieciowego, itp. Bibliografia, czyli literatura Java – przegląd, obiektówka i aplety K. Arnold, J. Gosling, Java, WNT 1999, 42 zł Java ogólnie, zwłaszcza aplikacje konsoli Eckel B.: Thinking in Java. Helion, http://java.sun.com ics.p.lodz.pl/~aniewiadomski – Dział ,,Dydaktyka'', JiPP 2001, 90zł Klasy systemów informacyjnych ● ERP - Enterprise Resource Planning system informatyczny zarządzający działalnością przedsiębiorstwa jako całością – ● SAP, IFS, JEEVES, INFOR MAX+, Symfonia Forte, Impuls BPSC ERP = MRP I + MRP II – MRP I (Material Resource Planning) ● – planowanie materiałowe MRP II (Manufacturing Resource Planning) ● planowanie produkcyjne Standardowe moduły ERP ● ● ● ● ● ● Produkcja Logistyka Księgowość Magazyn Sprzedaż Zakupy – czego brakuje ??? Rozwój ERP ● ● ERP są zwane "Back-office" - bo przeznaczone tylko dla personelu w odróżnieniu od systemów klasy CRM Customer Relationship Management – ● ● Pewne zasoby dostępne są także dla klientów, np. za pośrednictwem WWW Rozwój --> ERP II ''wychodzą poza przedsiębiorstwo'' ECR = Obsługa konsumentow i dostawców (Efficient Consumer Response) Rozwój ERP cd. ● ● SCM = Zarządzanie Łańcuchem Dostaw (Supply Chain Management) RFID Radio Frequency Identification w systemach kontroli przepływu produktów/towarów w oparciu o fale radiowe – np. System Automatycznej Identyfikacji Towarów (SAIT) Fazy życia oprogramowania 1.Analiza wymagań użytkownika 2.Projektowanie 3.Implementacja 4.Testy i wdrożenie 5.Konserwacja i reengineering Fazy te moga po sobie nastepować wg różnych cyklów, np. kaskadowego, kaskadowego z powrotami, spiralnego, itp. 1. Analiza wymagań użytkownika ● Dane – jakie informacje przetwarza system? – ● Użytkownicy – kto ma korzystać? – ● Grupy i ich prawa dostępu Warunki odbiorcy – gdzie system ma działać? – ● Typy danych, formaty, konwersje Sprzętowe, lokalowe, finansowe Czy firma ma już system? – Jaki? Za ile? Od kiedy? Co chcą zmienić? 2. Projektowanie – warstwa danych ● Baza danych – – ● Prawa dostępu do tabel – ● tabele, kwerendy, relacje, więzy integralności Formy normalne tabel, normalizacja Który użytkownik które dane widzi i/lub przetwarza Zgodność z normami prawnymi – – Jawność/tajność informacji, prawo publikowania Ochrona danych osobowych ● Zwłaszcza danych wrażliwych 2. Projektowanie – warstwa logiki ● Procesy, podprocesy – funkcje systemu – ● Przepływ danych – – – ● np. zaloguj się = sprawdź login + sprawdź hasło + wyświetl zawartość konta użytkownika Dane wejściowe i wyjściowe Jak przetwarzać dane? Gdzie przechowywać dane wynikowe? Algorytmy – specyfikacje procesów – Rysunki, pseudokod, język naturalny 2. Projektowanie – interfejs użytkownika ● ● Interfejs (ang. interface) – metoda komunikowania się programu z użytkownikiem Interfejs tekstowy – – ● DOS, Norton Commander, Linux Console Szybko działa, ale wymaga znajomości komend Interfejs graficzny – – Windows, KDE, Gnome Wolniejszy, ale intuicyjny w obsłudze 2. Projektowanie – interfejs użytkownika (2) ● Interfejsy graficzne – – – ● Okienkowy – dla osobnych aplikacji Okienkowy – dla aplikacji Przeglądarka internetowa – dla aplikacji klientserwer Przed zaprojektowaniem interfejsu trzeba znać możliwości odbiorcy ! – – Sprzęt i system operacyjny Stopień wyszkolenia personelu 3. Implementacja ● Zapis ustaleń projektowych w języku/językach programowania – – – ● ● Warstwy danych Warstwy logiki Warstwy interfejsu użytkownika (-ów) Metodyka obiektowa lub proceduralna Od metody implementacji bardzo silnie zależą fazy analizy i projektu (koszty!!! obiektowo czy proceduralnie??) 4. Testy i wdrożenie ● Wdrożenie systemu informacyjnego – uruchomienie w docelowym środowisku działania, dla docelowej grupy użytkowników i wykonującego docelowe zadania – – – – Środowisko = platforma + otoczenie (np. budynek, inne instalacje) Platforma = sprzęt + system(y) operacyjny(-e) Zadania = przetwarzanie rzeczywistych danych pod rzeczywistym obciążeniem Wersje językowe – lokalizacja oprogramowania 4. Testy i wdrożenie (2) ● Szkolenie personelu – – ● Szkolenie bezpośrednie lub pośrednie Szkolenie w trakcie testowania (system celny) Dokumentacja techniczna – – – Systemy pomocy ''Help'', instrukcje obsługi, Warunki eksploatacji i konserwacji Warunki serwisu i gwarancji 4. Testy i wdrożenie (3) ● T. regresyjne – ● Testy długookresowe, pomiar niezawodności T. pełnozakresowe – ● Po zmianach, ''czy nie zmieniono za dużo'' T. operacyjne – ● [Roszkowski, 2004] Przy pełnym obciążeniu systemu T. wydajnościowe – Pomiary szybkości, wydajności (sprzęt !!) 4. Testy i wdrożenie (4) ● ● ● ● ● T. negatywne – Świadome wprowadzanie błędów T. ergonomiczne – Czytelność i wygoda interfejsów T. dokumentacji użytkownika – Czytelność ''helpów'', zgodność ze stanem faktycznym T. akceptacyjne – Testy ostateczne, ''kupić czy nie kupić'' Testy bezpieczeństwa !!! 4. Testy i wdrożenie (5) - koszty ● ● Sprzęt: serwer bazy danych, stacje robocze użytkowników - klienci (PC, laptopy, palmtopy), odpowiednia infrastruktura (sieć, komputerowa, telefony komórkowe) Oprogramowanie: licencja na systemy operacyjne serwera i stacji roboczych, licencja na serwer baz danych, licencja na oprogramowanie. ● http://www.logistyka.net.pl/ – A. Stachowicz-Stanusch, M. Stanusch 4. Testy i wdrożenie (6) - koszty ● ● Wdrożenie: analiza przedwdrożeniowa, parametryzacja systemu, ewentualne modyfikacje systemu, instalacja, połączenie z istniejącymi systemami informatycznymi przedsiębiorstwa, szkolenie, próbna eksploatacja, nadzór nad pełną eksploatacją Serwis: umowa stałej opieki serwisowej – Zalicza się do następnej fazy, ale umowa zawierana jest przy wdrożeniu 5. Eksploatacja i konserwacja systemu ● ''Odśmiecanie'' baz danych – – ● Obserwacja rejestrów zdarzeń (tzw. logów) – – ● Nieaktywni użytkownicy Dereplikacja wpisów Login, logout, awarie, zamknięcia sesji Nowi użytkownicy, modyfikacja uprawnień Dbałość o bezpieczeństwo – – – Wykrywanie ataków Aktualizacja zabezpieczeń Kontrola dostępu Administrowanie systemem 5. Reengineering (2) ● ● ● Reengineering – inżynieria wtórna Service packs, aktualizacje, ''łaty'' - patches Uwagi do następnej wersji systemu – – Funkcje zbędne, nie używane, powielające się Funkcje pożądane, nowe lub o zmienionym działaniu, itp. Reinstalacja systemu (skrajny przypadek) *** Wszystkie powyższe czynności potocznie określa się mianem ''support'' – wsparcie ● Architektura aplikacji ● Model trójwarstwowy – – – Warstwa danych Warstwa logiki aplikacji Warstwa interfejsu użytkownika ● ● Aplikacja <= System informacyjny – Aplikacja ,,nie zawiera'' sprzętu ● ● Model-View-Controller – wzorzec projektowy, design patern Synonimy ,,aplikacji'': oprogramowanie, software, Inne architektury/modele – np. Web Services – 4 warstwy: jw. + usługa sieciowa, odpowiedzialna za zbieranie danych rozproszonych, ● Na rożnych serwerach, w różnych kopiach tej samej bazy Trzy warstwy aplikacji – przykład //--------- dane ------------------int tab[] = new int[N]; tab[0] = 43; tab[1] = 11; ..... tab[N] = 30; //--------- logika -----------------for (i=0; i<N-1; i++) for (j=0; j<N-i-1; j++) if (tab[j]>tab[j+1]) bufor = tab[j]; tab[j] = tab[j+1]; tab[j+1] = bufor; } //--------- interfejs użytkownika ------for (i=0; i<N; i++) cout<< tab[i]; // System.out.println(+tab[i]); A. trójwarstwowa – warstwa danych ● ● Warstwa danych – przechowuje dane w sposób pasywny, nie implementuje procedur dostępu do danych ani ich przetwarzania Wykonuje zlecane przez warstwę logiki podstawowe operacje: – – – – Read Write Modify Delete ● np. SELECT np. INSERT np. UPDATE np. DELETE W tym sensie ''bazy'' w Accessie nie są tylko zbiorami danych, ale całymi aplikacjami Arch. trójwarstwowa warstwa danych (2) ● Technologie tworzenia warstwy danych – – – ● SQL ''bezpośrednio'' narzędzia graficzne generujące kod SQL, np. OpenOfficeBase diagramy związków encji (Entity Relationship Diagram Ok. 95 % baz – relacyjne – 5 % inne (obiektowe, sieciowe, hierarchiczne) Arch. trójwarstwowa – logika aplikacji ● ● ● ● Warstwa logiki – metody przetwarzania danych, funkcje, procedury, procesy, usługi... ...operujące na danych z bazy, przetwarzające je i przekazujące do bazy, do innych procesów/ funkcji lub do interfejsu użytkownika Szczegółowe określenie (specyfikacja) tej warstwy wymaga algorytmów w postaci schematów blokowych lub pseudokodów Technologie: 3GL – Pascal, Cobol, Fortran, C/C++, Java, PHP; 4GL – LISP, Prolog Arch. trójwarstwowa – warstwa interfejsu użytkownika ● Zespół operacji odpowiedzialnych za kontakt z użytkownikiem, – – – ● Interfejsy – – – ● Wizualizacja (wyświetlanie) rezultatów procesów Pobieranie danych i kontrola ich poprawności Przyjmowanie poleceń użytkownika Tekstowe Graficzne (Graphical User Interface, GUI) Przeglądarki WWW (wymaga formatowania HTML-em danych wyjściowych) PHP, VBScript, ActionScript, XML Flash, HTML+CSS+JavaScript+DOM=DHTML Warianty arch. trójwarstwowej ● Aplikacja typu ''Desktop'' – – – ● Aplikacja ''biurkowa'', bez połączenia z siecią Całość kodu wykonuje się na stacji roboczej Aby działać nie musi łączyć się z innymi systemami Aplikacja klient-serwer – dwa systemy (programy, maszyny, platformy) komunikujące się ze sobą w celu wykonywania zadanych operacji – – Thick client, gruby klient - interfejs + logika u klienta, a dane na serwerze Thin client, cienki klient – interfejs u klienta, a logika i dane na serwerze Gruby klient <html> <body> <p>Zaloguj sie: </p> <form method="post"> <input type="text" value="wpisz login"> <input type="password" name="haslo"> <input type="submit" onclick='javascript: if (haslo.value == "mojehaslo") document.write("witamy !!!"); else document.write("ZLE !!!");'> </form> </body> </html> Przykład ,,thin client” Przykłady arch. trójwarstwowej ● ● ● ● ● Sortowanie tablicy Google Program pocztowy Word, Paint, Corel www.onet.pl, www.interia.pl – Jakie dane? Jaka logika? Jaki interfejs? Technologie wytwarzania aplikacji Desktop (1) Kod maszynowy (1GL) i assemblery (2GL) sterowniki Języki 3-ciej generacji (3GL) – – – Cobol, Fortran, Basic (programy obliczeniowe) Pascal, C/C++, Java (programy użytkowe) Visual Basic (aplikacje Office – Excel, Word, OpenOfficeOrg) Dokumenty doc, xls, odt, odp nazywam tu aplikacjami ze względu na występujące w nich elementy interaktywne, np. formularze, przyciski, kontrolki itp. Technologie wytwarzania aplikacji Desktop (2) Języki – – – 4-ej generacji (4GL) SQL – relacyjne bazy danych Prolog, Lisp – Systemy Sztucznej Inteligencji TeX, LaTeX, BibTeX – skład drukarski \documentclass[a4paper,11pt,bf,small,twoside]{itic} %{{{ \usepackage{graphicx} \begin{document} \title{INTERVAL-VALUED LINGUISTIC SUMMARIZATION OF~DATA} \author{ \textbf{Adam \uppercase{Niewiadomski}} } Języki – – i metody wizualne Corel – dokumenty i aplikacje graficzne PowerPoint, OpenOfficeImpress – prezentacje Technologie wytwarzania aplikacji klient-serwer (1) ● Gruby klient – Applety ● ● ● Interfejs = Java+ HTML, przeglądarka Logika = Java (plik *.class ładowany do Temp) Dane = Serwer WWW przechowujący kod <applet code=”kod_appletu.class” width=200 height=200> – ActiveX ● ● ● skaner MKS Interfejs = C++, ActiveX, Logika = C++ Dane = Serwer WWW przechowujący kod Technologie wytwarzania aplikacji klient-serwer (2) ● Cienki klient – PHP ● ● ● – ● ● – ● ● www.gazeta.pl Interfejs = jw. Logika = Java, serwer Tomcat Dane = Postgress (???) CGI ● – – Interfejs = DHTML przeglądarka Logika = PHP, serwer Apache Dane = Serwer MySQL JSP ● Allegro Wirtualna Polska Interfejs = jw. Logika = Perl ... Dane = .... ASP, ASP.NET, .NET - www.microsoft.com Ruby, RubyOnRails Java – historia (1) ● James Gosling – pomysł stworzenia języka niezależnego od sprzętu (ściślej: od platformy) (Sun Microsystems – California, 1990) – – – Pierwsza nazwa – OAK (okazała się zastrzeżona) Pierwotne przeznaczenie – interfejsy urządzeń AGD i audio-video Modyfikacje i nowe modele sprzętu wymagały częstych zmian oprogramowania – koszty ! ● np. telefony komórkowe Java – historia (2) ● ● ● Niezależność sprzętowa znalazła zastosowanie w usłudze WWW 1993 pierwsza przeglądarka WWW, HotJava, która obsługiwała programy w Javie, jednak nadal było to rozwiązanie lokalne Suna, gdyż inne firmy nie wytwarzały oprogramowania zgodnego z tym standardem 1995 przeglądarka Netscape Navigator 2.0 obsługuje Applety Java, co ustanowiło przyjęcie rozwiązania dotąd lokalnego jako ogólnego standardu (!) Zależność aplikacji od sprzętu ● Program zależny od platformy Kompilator LINUX Źródło C/C++ Kompilator Windows Kompilator DOS LINUX Sys. Op LINUX *.EXE Windows Sys. Op Windows *.bash *.exe DOS Sys. Op DOS Zależność od platformy na przykładzie programów w C/C++ ● ● ● ● Program w wersji źródłowej wymaga kompilacji i konsolidacji (linkowania) z bibliotekami zgodnymi z daną platformą Formaty plików pośrednich i wynikowych są inne dla poszczególnych platform (np. *.obj, *.exe, *.dll) *.exe zawiera listę instrukcji danego procesora Zatem: na każdy sprzęt konieczny jest inny kompilator, linker oraz zestaw bibliotek – Duże koszty, – brak przenośności źródeł oraz gotowego oprogramowania Niezależność sprzętowa aplikacji ● Program niezależny od sprzętu Źródło *.java Kompilator plik(i) *.class czyli Bajt-kod ............. Linux Platforma LINUX JVM Win2K Platforma Windows JVM DOS JVM *.class *.class *.class Platforma DOS Niezależność oprogramowania od platformy ● ● ● ● Kod źródłowy kompilowany jest zawsze tą samą metodą i łączony z tymi samymi bibliotekami Jest to możliwe, gdyż plik wynikowy *.class (tzw. kod pośredni, bajt-kod) zawiera instrukcje dla programu wykonującego, a nie bezpośrednio dla procesora Program wykonujący (interpreter) odpowiada za przetłumaczenie poleceń z pliku *.class na rozkazy danego procesora Technologie – .net (C#, J#, VB.net) – Ruby, RubyOnRails są innymi niż Java przykładem tworzenia oprogramowania niezależnego od sprzętu Java Virtual Machine ● ● ● ● Wirtualna Maszyna Javy __Interpreter bajt-kodu__ (czyli poleceń w plikach *.class) JVM działa analogicznie jak procesor przetwarzający kod w pliku .EXE Istnieją implementacje na praktycznie wszystkie platformy – – np. Windows – środowisko uruchomieniowe JRE j2re-1_6_0_11-windows-i586.exe Biblioteki ● ● Niezależność sprzętowa to także biblioteki Niezależne od platformy zbiory klas i ich metod składowych, czyli tzw. API – Application Programming Interface ● ● Pakiet to zbiór klas, gdzie – – ● http://java.sun.com/j2se/1.4.2/docs/api/ nazwa pakietu nazwa klasy = nazwa katalogu = nazwa pliku Pakiety na dysku są rozpakowane (katalogi z plikami *.class) lub ''spakowane'' do plików.jar (java archive) Plusy niezależności sprzętowej (1) Szerokie zastosowania w Internecie – Zamieszczając aplet Javy na stronie nie trzeba myśleć o tym jaki komputer ma odbiorca Mały rozmiar kodu wynikowego – 1kB appletu *.class vs. ok. 200kB .exe drukującego jedną linię tekstu ● Jedna metoda kompilacji i jeden zestaw pakietów – Kod klas i funkcji bibliotecznych jest odczytywany przez JVM, a nie przez różne procesory, a więc działa podobnie Plusy niezależności sprzętowej (2) ● Na 1 dobry program napisany w C++ przypada 3,7 złych programów. W Javie proporcja ta wynosi 1,7. ● ● Napisanie programu w Javie zajmuje średnio 3 krotnie mniej czasu. ● Programy w Javie są nawet 2-3 krotnie krótsze (nie licząc komentarzy Javadoc) Minusy niezależności sprzętowej (1) Spowolnienie działania (dodatkowy program między procesorem a kodem) – Plik *.class nie jest bezpośrednio odczytywany przez procesor, ale przez program interpretujący, czyli JVM ● Programy Javy ładują się 6-krotnie wolniej. – Program napisany w Javie potrzebuje statystycznie 2-3 krotnie więcej RAM niż napisany C++ i działa do 10x wolniej Minusy niezależności sprzętowej (2) Konieczność zainstalowania JVM przy pierwszym uruchomieniu programu – Przy wolnym łączu uniemożliwiało to działanie Javy Niemal całkowity brak współpracy z kodami w innych językach – W C/C++ można było zlinkować do .exe funkcje napisane np. w Pascalu i skompilowane do *.obj Programowanie komponentowe wykład 3 Informatyka, IV sem. studia dzienne FTIiMS, PŁ Programowanie komponentowe wymaga Znajmości składni języka – każdy język programowania można poznać posługując się pewnym schematem – Jakie są słowa kluczowe, jak buduje się wyrażenia, funkcje, zmienne, jak tworzy się typy danych, struktury danych, tablice, obiekty, itp. Znajomości bliotek (obiektów, pakietów i komponentów) – Czy trzeba samemu tworzyć funkcje i struktury danych, czy może wystarczy skorzystać z gotowych i zoptymalizowanych? Znajomości narzędzi programistycznych – szybkość i wygoda tworzenia aplikacji – Jak uruchomić kod w danym języku, jak poprawić błędy, jak wygenerować powtarzalne fragmenty kodu, praca krokowa, debugging Kategorie składniowe Javy (1) 1. Słowa kluczowe – nazwy typów, instrukcji sterujących, stałych, operatorów, modyfikatorów dostępu Nie można w ten sposób nazwać zmiennych, funkcji, itp. Słowa zarezerwowane obejmują terminy ''reserved for future use'' – przewiduje się, że w przyszłych wersjach Javy wprowadzone będą nowe słowa kluczowe, a wówczas starsze kody mogłyby nie kompilować się w nowych środowiskach, np. w Java 7 Kategorie (2,3) 2. Separatory (9 szt.) ( ) {} ; , [] - oddzielają wyrażenia, bloki kodu, klasy - niektóre są także operatorami, np. [ ] operator indeksowania tablicy 3. Komentarze // jednolinijkowy od znaku // do końca linii /* Komentarz blokowy */ Kategorie (4) operatory 4. Operatory a. Priorytet, czyli ''kolejność wykonywania działań'', np. obiekt.tab[2*5] b. Wiązanie (prawe/lewe) wiązanie lewe np. 2+3+4+5 kompilator oblicza kolejno (((2+3)+4)+5) wiazanie prawe, np. x=y=z=2, kompilator oblicza (x=(y=(z=2))) Od prawej wiążą operatory jednoargumentowe i przypisania, pozostałe od lewej Operatory c.d. c. Ilość argumentów !zmiennaLogiczna 3*5, x<y ? x : y (1, 2 lub 3) (1 argument) (2 argumenty) (3 argumenty) d. Wartość (typ rezultatu) – następny slajd e. L-wartość (ang. Left-value, L-value) każde wyrażenie, które może znaleźć się po lewej stronie operatora przypisania, np. X = 2, tab[1] = tab[2] -ale nie: 5+=1 lub 5++, gdyż jest równoznaczne z 5=5+1 !!!! Kategorie (4) operatory cd. Podział przybliżony pod względem typu zwracanej wartości ● Arytmetyczne + * % – ● Logiczne – ● Wynik ! true lub Przypisania – ● Wynik jest typu jednego z operandów && || false = += -= *= ++ Wynik jest typu lewego argumentu (czyli Lwartości) -- Kategorie (4) operatory (podział przybliżony) ● Porównania – ● ● & | >= ^ << >>> Wynik jest typu jednego z operandów Przydziału pamięci – ● < true lub false Bitowe – == Wynik jest typu referencyjnego Kontroli typu instanceof – Wynik logiczny ● Zalecane ćwiczenia! new Kategorie (5) Identyfikatory – nazwy ● ● ● stałe, czyli literały literały specjalne, np. polskie znaki – znakowe (char, String) – ‘w’, ”Dziendobry”, ‘\xY’ – liczb całkowitych (int, byte) – 100, 011, 0xFF00, 55L – liczb rzecz. (double, float) – 1.5, .6, 0.5f , 0.7D – logiczne (boolean) – true, false ● Są to także słowa zarezerwowane zmienne x, i, nazwisko, checkbox1 typy Button, String, int, char Identyfikatory (nazwy) funkcji ● ● np. init(), wyciagnijPierw(25); Występują w trzech kontekstach – Deklaracja, int funkcja(double x); – Definicja = deklaracja + ciało int funkcja (double x) { // ciało funkcji return rezultat; } – Wywołanie: użycie wartości funkcji X = funkcja (3.14); Sterowanie wykonaniem programu ● for, while, do..while – jak w C/C++ – Oprócz np. while(1) ● ● ● ● ● ● Brak konwersji wyrażeń logicznych do int Powinno być while(1==1) if..else,if..else if..else – jw. switch..case..default – jw. break, continue – jw. Przypisanie = (+=, -=, ......) – Dokładnie jak w C/C++ Sterowanie... cd. bloki instrukcji (obowiązuje przesłanianie nazw zmiennych) int x=2; { int y = 5; System.out.println(""+y); /// Bledem jest np. int x=3; Przeslania zmienna istniejącą } int y=3; // Nie jest to błąd – kompilator ,,zapomniał'' o y System.out.println(""+y); //EFEKT ??? Typy danych w Jawie Typy danych Proste Złożone Tablicowe Obiektowe Biblioteczne Programisty Typy proste (wbudowane, built-in, primitives) ● ● ● byte short char – ● ● ● 1 bajt, stałoprzec. ze znakiem 2, int 4, long 8 2 kod znaku UNICODE możliwe zapisanie EOF boolean 1 bajt, true/false float double 4 bajty, zmiennoprzecinkowa 8, jw. Typy tablicowe ● ● TYLKO DYNAMICZNE !!! Jednowymiarowa – int tab [ ] = new int [6]; Ale nie: int tab[6], bo nie ma tu rezerwacji pamięci operatorem new ● Dwuwymiarowa – double tab [ ] [ ] = new double [10] [10]; Są to przykłady definicji tablic Trójwymiarowa boolean tab[ ][ ][ ]= ........ Typy obiektowe ● Biblioteczne – – – – ● Button Date ActionEvent String java.awt.Button java.util.Date java.awt.event.ActionEvent java.lang.String Własne – definicja klasy – Np. Macierz class Macierz { } definicja klasy, czyli pól i funkcji składowych Zmienne – referencje (de facto: wskaźniki) ● Zmienna – miejsce w pamięci do przechowywania danych to miejsce ma swoją nazwę, jak to w językach imperatywnych 3-ej generacji, nie zaś adres ● Zmienne (tylko pola klas lub zmienne lokalne/formalne funkcji, brak zmiennych globalnych) – automatyczne (tylko typy proste, kompilator sam rezerwuje pamięć i sam ją zwalnia) ● – – int x; char znak; dynamiczne (rezerwacja pamięci operatorem new, wszystkie typy obiektowe i tablice) statyczne inicjalizacja wymagana przy deklaracji ● np. static int x = 5; //nie: static int x; ... x=5; Zmienne – deklaracja, przydział pamięci, inicjalizacja ● ● ● Deklaracja int x, y=3; Button b1, b2; Rezerwacja pamięci (nie dotyczy typów prostych) b1 = new Button(”Kliknij tu!”); Inicjalizacja x = 25; // typy proste napis = new String(”1.2.3.próba Stringa...”); // typy złożone b2 = b1; // ŹLE - konstruktor kopiujący nie wywoła się, zostaną przypisane ADRESY, nie WARTOŚCI, musi być: b2 = new Button(b1); Konwencje zapisu kodu w Jawie ● Klasy – wielką literą, bez ‘C’ lub ‘T’ z przodu – ● Macierz, Button, String Zmienne – małą literą, bez podkreśleń – – i, nazwiskoStudenta, iloscWierszyMacierzy zmienna po ‘.’ jest polem jakiejś innej klasy ● – zmienna po this jest polem bieżącej klasy ● – obiekt.pole this.pole // równoważne: pole, ale z this jest czytelniej zmienna bez poprzedzającego selektora jest argumentem formalnym funkcji lub zm. lokalną/pomocniczą ● pole Standardy zapisu kodu... cd. ● Funkcje – czasownik małą literą, dopełnienie – wielką – ● getNumber, toString, add, róbCoś Nazwy pakietów – małą literą – – java.awt; java.mypackage.MyClass ● ● To klasa MyClass w pakiecie java.mypackage Bloki { // początek bloku // instrukcje } //koniec bloku Notacja węgierska (Hungarian notation) Źródło: Bates: Poznaj Visual C++ 6.0, Appendix A ● ● ● ● ● ● ● ● ● b n l fl d bt ch e pt boolean short, int long float double Button Checkbox Event Point bOdpowiedz nWagaZawodnika lRozmiarPliku flMojaPensja dJegoPensja przycisk pole wyboru zdarzenie punkt Różnice między C/C++ a Javą (1) ● ● Typy danych podstawowych niezależne od sprzętu – specyficzne dla JVM, a nie dla platformy Nie istnieje pojęcie wskaźnika – wszystkie zmienne typów prostych są wartościami ● – wszystkie zmienne typów złożonych (tablicowych i agregatów) są referencjami – wymagają dynamicznego przydziału pamięci – operator – ● int x=0; * oznacza tylko mnożenie operatory .* , -> , :: nie istnieją this jest referencją Różnice... (2) ● Tablice tylko dynamiczne Kurs Tylocha, rozdz. 2.3.17 – tablica w Jawie jest obiektem ● dziedziczy po Object, implementuje interfejs Cloneable – deklaracja wymaga przydziału pamięci w zadanej ilości, poprzez podanie liczby elementów... ● String tab[ ] = new String[5]; – ...lub zbioru inicjalizującego wartości elementów ● int tablicaInt[ ] = {1, 2, 3, 4, 5}; ● String tab[ ]={new String(”pn”),new String(”wt”)...}; – Nazwa tablicy wraz z nawiasami [ ] jest L-wartością ● tab[0] = ”niedziela” Różnice... (3) ● Zwalnianie pamięci – – – – Kurs Tylocha, rozdz. 2.3.13 Nie ma operatora delete zwalnianiem pamięci zajmuje się funkcja System.gc() (od ang. garbage collector) funkcja ta wywoływana jest automatycznie co jakiś czas w osobnym wątku, tylko wtedy, gdy nie ma nic innego ważniejszego do zrobienia (wątek ten ma b. niski priorytet) sprawdzane są wszystkie wartości w referencjach; jeśli w żadnej nie ma adresu danego obszaru pamięci, to obszar ten jest zerowany (rysunek) Różnice... (4) ● Zwalnianie cd. – zwalnianie jawne – – można wywołać jawnie funkcję System.gc() jeśli obiekt musi przed zniknięciem zwolnić zasoby (np. pozamykać pliki), można nadpisać funkcję finalize(), odziedziczoną po java.lang.Object ● ● przykład: kurs Tylocha, rozdz. 2.3.12 Wniosek: finalizer działa podobnie jak destruktor – dotyczy to także wywołań finalizerów klas-przodków Różnice... (5) ● Brak możliwości przeciążania operatorów – operacje na niewbudowanych typach danych realizowane są przez funkcje składowe o zwyczajowych nazwach, np. ● ● ● == <=, >... = string1.equals(string2) rez. boolean string3.compareTo(string4) rez. int konstruktory klas wszystkie przeciążone operacje przypisania zastąpione są przez konstruktory kopiujące String tekst1 = new String (innyString); String tekst2 = tekst1;//przepisanie ADRESU !! String tekst2 = new String (tekst1); //działa jeśli istnieje konstruktor kopiujący – Konstruktor kopiujący (5') ● K. kopiujący klasy A w C/C++ - konstruktor, który można wywołać z jedynym parametrem będącym referencją do obiektu klasy A – ● ● ● Pozostałe parametry mogą być domyślne W Javie nie ma domyślnych parametrów funkcji K. kopiujący w Javie ma tylko jeden parametr Jeśli konstruktor w Javie odwołuje się do konstruktora klasy bazowej, – – to robi to poprzez słowo super, koniecznie w pierwszej linii pod nagłówkiem, patrz Różnica (9) Brak list inicjalizacyjnych Komentarz ● Różnice 1 – 5 mają znaczny wpływ na budowę wyrażeń w Javie i, w ogólności, na konstrukcję kodu i działajacych programów. Ich przyswojenie jest istotne z punktu widzenia eliminacji nawyków z C/C++ (nawyków niewłaściwych w Jawie) Różnice... (6) dostęp do klas, pól i metod Dostęp do klas, pól i metod – – – w Jawie obowiązuje tzw. dostęp pakietowy Pakiet, podstawowa jednostka, jest katalogiem plików *.class w jednym pliku *.java znajduje się jedna klasa publiczna ● – – przykład package nazwa_pakietu ; przykład położenie plików w pakietach określa zm. środ. CLASSPATH ● – mogą być inne klasy, ale niepubliczne po kompilacji w jednym pliku *.class znajduje się jedna klasa Przypisanie klasy do pakietu odbywa się instrukcją ● – Kurs Tylocha, rozdz. 2.3.4 przykład dla CLASSPATH = C:\WINNT\java Pakiet może zawierać podpakiety ● np. java.awt zawiera w sobie java.awt.event – zbiór klas odpowiedzialny za zdarzenia w oknach Różnice... (modyfikatory – 1) ● Modyfikatory dostępu do klasy – – – – ● public – pola i składowe są widoczne w pakiecie i poza nim final – po klasie nie można dziedziczyć abstract – nie można utowrzyć obiektu tej klasy domyślnie: dostęp pakietowy – pola i metody widoczne tylko dla klas wewnątrz pakietu Modyfikatory dostępu do pól i funkcji klasy – – – – private – pole/metoda widoczne tylko w klasie protected – pole metoda widoczne w klasie, pakiecie i w klasach dziedziczących public – pole metoda widoczne ''wszędzie'' domyślnie ''package'', jw. Różnice... (modyfikatory – 2) ● Modyfikatory własności funkcji składowych – final, static, abstract, synchronized, native ● ● ● dostęp do f-cji st. W C/C++ Nazwaklasy.funkcja() Nazwaklasy::funkcja() Modyfikatory własności pól klas – final, static, transient, volatile ● ● inicjalizacja pola statycznego – tylko w kodzie klasy (nie jak w C) rozdz. Kurs Tylocha 2.3.12 – inicjalizator pól statycznych Różnice... (7) dziedziczenie ● ● Brak modyfikatorów dziedziczenia klas (public, private...) Dziedziczenie tylko po jednej klasie – jednobazowe ● Hierarchia klas w pakietach ma postać drzewa – każda klasa ma co najwyżej jednego bezpośredniego przodka – Upraszcza to graf hierarchii dziedziczenia klas Czasem klasy muszą posiadać pewne funkcje, jeśli chcą aby dla ich obiektów działały metody standardowe – Arrays.sort(Object[]) - wymaga aby obiekty miały funkcję compareTo(), czyli implementowały interfejs Comparable ● INTERFEJS – – – – – klasa abstrakcyjna o zadeklarowanych, ale nie zdefiniowanych funkcjach (jeśli posiada) o polach wyłącznie statycznych (jeśli posiada) zadeklarowana słowem interface Różnice (7) – przykład diagramu schematu dziedziczenia jednobazowego z interfejsami java.lang.Object | +--java.awt.Component | +--java.awt.Container | +--java.awt.Panel | +--java.applet.Applet ActionListener ItemListener class MyApplet Interfejs jako klasa, klasa interfejsowa ● ● ● ● Każda klasa implementująca interfejs MUSI zdefiniować jego metody – Dzięki temu pewne cechy mają zawsze tę samą nazwę; ułatwia to np. ich wywoływanie przez inne komponenty np. Funkcja Arrays.sort(Object[ ] tab) działa w oparciu o funkcję compareTo(...), a więc obiekty w tablicy tab muszą implementować interfejs Comparable Interfejs może dziedziczyć po innych interfejsach (także po kilku), ale nie może dziedziczyć po klasach Interfejs może być deklarowany w jednym pliku *.java z klasami publicznymi mimo tego, że sam jest publiczny Po kompilacji interfejs zostanie umieszczony w osobnym pliku *.class Interfejs... cd. Kurs Tylocha, 2.3.12, 2.3.15 [public] interface InterfejsPrzykl { static int Pole=3; abstract public void Metoda(); } //domyślnie interfejs jest publiczny // użycie interfejsu przez klasę public class MyApplet extends Applet implements InterfejsPrzykl { public void Metoda() { // co robi ta metoda dla tej klasy } } Klasy wewnętrzne, anonimowe i lokalne Kurs Tylocha, 2.3.7 ● ● ● Klasa wewnętrzna – klasa zdefiniowana wewnątrz definicji innej klasy – występowała w C/C++ Klasa lokalna – klasa zdefiniowana wewnątrz bloku instrukcji (w definicji funkcji) – niedopuszczalne w C/C++ Klasa anonimowa – klasa zdefiniowana wewnątrz wyrażenia – new NazwaKlasyPrzodka(//lista argumentów//) {...} ● jest to także sposób na dziedziczenie po interfejsach (!!!) – niedopuszczalne w C/C++ Różnice... (9 – słowo super) Słowo kluczowe super Kurs Tylocha rozdz. 2.3.13 ● Konstruktory nie posiadają list inicjalizacyjnych – odpada operator : oraz inicjalizacja typu pole(wartość) ● super() – wywołuje konstruktor klasy bazowej lub ● super.funkcja( ) - wywołuje funkcję o tej samej nazwie, ale w wersji z klasy bazowej ● Wywołanie super(....) musi być pierwszą linią kodu konstruktora przykład Różnice... (9 – słowo super, c.d.) ● ● ● Zakładamy hierarchię klas: A, B extends A, C extends B Słowa super nie można łączyć kasakadowo; aby odnieść się do nazwy niestatycznej w klasie wyższej należy konwertować referencję this – np. w obiekcie klasy C ((A)this).get(); Konwersja this do klasy-przodka jest równoznaczna z super – w obiekcie klasy C: ● ((B)this).get(); = super.get(); Programowanie komponentowe wykład 5 Informatyka, IV sem. studia dzienne FTIiMS, PŁ Błędy w programach ● Z punktu widzenia kodu rozróżniamy – Bł. kompilacji – błąd składni w kodzie programu, ● ● – Bł. logiczne – program działa wbrew oczekiwaniom, ale __DZIAŁA__ ● ● ● – Nieznana zmienna/funkcja/klasa/... Brak nawiasu/średnika/.... np. niepoprawne wyniki obliczeń Nieprzewidziane zachowanie interfejsu Brak możliwości wykonania jakiejś operacji Bł. czasu wykonania (ang. Runtime) – program uruchamia się, ale potem __zatrzymuje__ ● ● ● Dzielenie przez zero, indeks tablicy spoza zakresu Błąd otwarcia pliku (ogólnie: operacji we/wy) Odwołanie do niezainicjalizowanej zmiennej obiektowej – String x; System.out.println(x); Wyjątki i błędy w Javie ● ● Java oferuje bardzo rozbudowany, ściśle zorientowany obiektowo mechanizm obsługi sytuacji krytycznych (błędy we/wy, alokacji pamięci, braku zasobów, błędnych operacji itd.) Sytuacje wyjątkowe dzielimy na dwa rodzaje – – ● ● Errors Exceptions błędy wyjątki Błędy – sytuacje rzadkie, związane z działaniem JVM, np. brak pakietu lub klasy, „opór” środowiska, poważny błąd systemowy Błędy nie powinny być obsługiwane w „zwykłych” programach Javy, ich wyrzucaniem zajmuje się watek JVM uruchamiający ''nasze'' programy – np. java.lang.NoClassDefFoundError – brak klasy z funkcją main w bieżącym/wskazanym katalogu ● Zadanie na kolokwium: napisz kod wywołujący wyjątek X Wyjątki i błędy – hierarchia klas Wyjątki... cd Kurs Tylocha, rozdz. 2.4 Wyjątki – sytuacje zazwyczaj możliwe do obsłużenia instrukcją if..else, np. ● nie znaleziono pliku – ● indeks poza granicami tablicy – ● ArrayIndexOutOfBoundsExcetion referencja wskazująca na pusty obszar pamięci – ● FileNotFoundException NullPointerException Błąd operacji arytmetycznej – ArithmeticException Wyjątki RuntimeExceptions ● ● Mogą występować bardzo często, nawet po kilka w jednym wyrażeniu – for (i=0; i<10; i++); tab[ i ] = i; Ich obsługa nie jest przez kompilator wymagana – zbyt duży koszt sprawdzenia w porównaniu do strat spowodowanych przez taki wyjątek NullPointerException – ArrayIndexOutOfBoundsException – ArithmeticException W momencie wystąpienia RuntimeException program zatrzyma się i pokaże nazwę wyjątku oraz miejsce jego wystąpienia – ● przykład Wyjątek jako obiekt ● ● Każda sytuacja wyjątkowa jest reprezentowana przez obiekt pewnej klasy Każdy pakiet dysponuje odpowiednim zestawem wyjątków obsługującym błędy wywołane przez jego klasy/funkcje przykłady z dokumentacji ● Można także we własnych pakietach definiować własne wyjątki, pod warunkiem, że dziedziczą one z klasy Throwable Jak powstaje wyjątek? ● ● Słowa kluczowe throw,throws Wyjątek trzeba najpierw zgłosić public void funkcja() throws MyException { //........ if (WystapilBlad) throw new MyException; // ......... new MyException zwraca referencję do obiektu zawierającego dane o sytuacji wyjątkowej, np. kod błędu, treść komunikatu, itp. ● Obsługa wyjątków Metoda try try-catch-finally { // instrukcja generująca wyjątek } catch (NazwaKlasyWyjątku wyj) { // co zrobić z tym wyjątkiem} .... finally {//blok wykona się niezależnie od wystąpienia wyjątku} Kolejność obsługi wyjątków (1) ● Jeśli wyjątki są w różnych blokach kodu – o kolejności decyduje przebieg sterowania, np. try { // instrukcje generujące wyjątki } catch (IOException io) {System.err.println("blad IO");} try { // instrukcje generujące wyjątki } catch (SecurityException se) {System.err.println("blad sec"); Kolejność obsługi wyjątków (2) ● Jeśli wyjątki występują w tym samym bloku – o kolejności decyduje hierarchia dziedziczenia: “od najbardziej szczegółowego do najbardziej ogólnego”, czyli ''od dołu do góry”, poźniej try { // ...... instrukcje generujące wyjatki } catch (java.io.ObjectStreamException) { } catch (java.io.IOException) { } catch (java.lang.Exception){ } ........ Porównanie if-else i try-catch int otwórzPlik(ścieżka) { if ( plik.otwórz() == false) {błąd otwarcia pliku} else if ( przydzielpamięć(plik.długość) ==false) {brak pamięci} else if (zapiszdopliku(tekst) == false) {błąd wyjścia} else if (zamknijplik() == false) { obsłuż ten błąd} else return OK ; } Porównanie if-else i try-catch readFile { try { otwórz plik; przydziel dla niego pamięć; wczytaj tekst do pliku ; zamknij plik; } catch (fileOpenFailed) { zrób coś z tym; } catch (memoryAllocationFailed) { zrób coś z tym; } catch (writeFailed) { zrób coś z tym; } catch (fileCloseFailed) { zrób coś z tym; }} Definiowanie własnego wyjątku class MyException extends Exception { String msg; MyException() { msg = new String (“komunikat wyjatku”);} } •Większość możliwych wyjątków jest już zdefiniowana w pakietach •Własne wyjątki służą do zgłoszenia np. •sytuacji wyjątkowej we własnej klasie •wyjątku odziedziczonego po istniejącym Standardowe struktury danych ● ● Pakiety Javy zawierają b. dużą ilość gotowych do użycia w kodzie klas – struktur danych Np. pakiet – – – ● java.util klasy reprezentujące dynamiczne struktury danych klasy obsługujące kalendarz, datę, walutę, słownik klasy obsługujące struktury kontenerowe, itp. Apel: zanim zaczniesz tworzyć nową klasę – PRZEJRZYJ DOKUMENTACJĘ PAKIETÓW !!! – 9 przypadków na 10 jest już oprogramowanych Klasy String i StringBuffer ● java.lang.String – reprezentuje łańcuchy tekstowe w miejsce tablicy char[ ] (lub C/C++: char*) – – ● ● 11 konstruktorów, w tym kopiujące compareTo(), compareToIgnoreCase(), concat(), equals(Object), replace(), replaceAll, trim(), valueOf() String jest klasą „final” – ponadto zapisanego w niej tekstu nie można zmienić! Do modyfikacji tekstu służy klasa java.lang.StringBuffer – – – należy stworzyć jej obiekt zainicjowany Stringiem przetworzyć tekst metodami klasy StringBuffer rezultat zapisać od nowa w obiekcie String Klasa Vector ● ● ● Klasa reprezentująca tablicę obiektów pochodzących od java.lang.Object java.lang.Object // sam Vector też pochodzi od Object... | +--java.util.AbstractCollection | +--java.util.AbstractList | +--java.util.Vector Funkcje obsługujące dane: – – – – add(Object), add(Collection), add(int index, Object) set(), setElementAt(Object, int), setSize(int) clear(), remove(Object), removeAll(), trimToSize(int) clone(), toString(), toArray(), equals(Object) Klasa java.util.Stack ● ● ● ● ● Klasyczny stos pozwala tylko na kładzenie elementów na górze i ich zdejmowanie z góry Rozszerzone implementacje stosu umożliwiają również podglądanie elementów lub ich sprawdzanie Klasa Stack jest rozszerzoną implementacją stosu Dziedziczy od Vector Funkcje: – – boolean empty(); pop(Object), push(Object), boolean search(Object), peek() Klasa Arrays ● ● Jeśli nie chce się przekształcać własnych tablic w obiekty z biblioteki Java... ...można użyć funkcji z klasy Arrays; reprezentuje ona (w postaci funkcji statycznych) najczęstsze operacje na gotowych tablicach – – – – ● sortowanie – 20 funkcji sort() porównywanie elementów – 9 funkcji equals() wyszukiwanie – 9 funkcji binarySearch() wypełnianie – funkcje fill() Funkcje te przyjmują daną tablicę jako argument (inaczej niż zazwyczaj jest w Javie) dokumentacja Obiekt Date ● Do działania na datach – klasa Date – ● ● ● Java 1.1, później klasa Calendar Obiekt klasy Date reprezentuje dowolny moment czasowy z dokładnością do milisekund Na 64 bitach (long) zapamiętuje liczbę milisekud, które upłynęły od 1 stycznia 1970 roku, od godz. 0h 00m 00s 000ms (tzw. moment epoch) Daty wcześniejsze zapamiętuje się jako liczby ujemne Format danych w Date rok miesiąc dzień mies. dzień tyg. godzina minuta sekunda liczba c. = y – 1900 liczba z {0, .., 11}, gdzie 0 = styczeń liczba z {1, .., 31} liczba z {0, ..., 6}, gdzie 0 = niedziela liczba całk. z przedziału <0, 23> liczba całk. z przedziału <0, 59> liczba całk. z przedziału <0, 61> !!! (sek. przestępne) funkcje getYear(), getMonth(), getDate(), getDay(), getHour()..... Konstruktory i funkcje Date ● Date now = new Date(); – ● ● ● ● ● ● ● alokuje obiekt „dokładnie ten moment” Date(y, m, d), Date(y, m, d, h, m), Date(y, m, d, h, m, s) Date(long milisecs), Date(String) Brak konstruktora kopiującego Date(Date) – dlaczego? now.equals(whenelse), // tendencja do nazw naturalnych now.before(LittleBitLater) now.after(LittleBitEarlier) setDate(), setMonths(), setYear()..... Inne struktury danych ● ● ● ● Calendar, Currency Dictionary, GregorianCalendar ........ ........