Wykład 1: Wprowadzenie 1.wprowadzenie 2.podstawy języka 3.sterowanie 4.inicjacja i sprzątanie 5.kontrola dostępu 6.dziedziczenie 7.polimorfizm 8.obsługa błędów 9.kolekcje obiektów 10.wejście i wyjście 11.równoległość 12.interfejs graficzny 13.programy sieciowe 14.obsługa baz danych 15.obsługa serwerów
Wykład 1: Zagadnienia pojęcia programowanie obiektowego wprowadzenie do języka Java
Programowanie i Złożoność Złożoność problemów które potrafimy rozwiązać zależy od poziomu i jakości abstrakcji dostarczonej przez dany język. abstrakcja wykonawcza abstrakcja problemowa
Abstrakcja Wykonawcza Abstrakcja od szczegółów maszyny, która wykonuje program: asembler jest abstrakcją języka maszynowego języki imperatywne (Fortran, Basic, C) są abstrakcją języka asemblera
Assembler: Przykład mov 1,%i4 mov 2,%i3 cmp %i3,%i0 bge.l77006 sethi %hi(.l16+8),%o0 add %o0,%lo(.l16+8),%i5.ly1: add %i2,%i4,%i2 st %i2,[%i5] mov %i4,%i2 ld [%i5],%i4 inc %i3 cmp %i3,%i0 bl.ly1 Fragment kodu do obliczania ciągu liczb Fibonacciego.
C: Przykład unsigned * fibonacci(int n) { static unsigned fib_array[max_fib] = {0,1}; unsigned prev_number = 0; unsigned curr_number = 1; for (int i = 2; i < n; i++) { fib_array[i] = prev_number + curr_number; prev_number = curr_number; curr_number = fib_array[i]; } return(fib_array); }
Abstrakcja Wykonawcza modelowanie w kategorii maszyny, nie w kategorii problemu odwzorowania problemu na model maszyny wykonawczej jest sztuczne programy są trudne to napisania i kosztowne do pielęgnacji
Abstrakcja Problemowa Abstrakcja przez modelowanie problemu: LISP: problemy wyrażone listami PROLOG: problemy wyrażone przy pomocy reguł logicznych AWK: problemy przetwarzania plików tekstowych
LISP: Przykład (defun fib (n) (cond ((or (not (numberp n)) (< n 0)) (error "~s is not a legal value for n!~&" n)) )) ((eql n 0) 0) ;; base case ((eql n 1) 1) ;; base case (t (+ (fib (- n 1)) (fib (- n 2))))
PROLOG: Przykład fibonacci(0,0). fibonacci(1,1). fibonacci(n,a) :- N1 is N-1, N2 is N1-1, fibonacci(n1,a1), fibonacci(n2,a2), A is A1 + A2.
Abstrakcja Problemowa Każdy język jest odpowiedni dla pewnej (wąskiej) klasy problemów. Rozwiązywanie problemów spoza danej klasy jest nieefektywne.
Narzędzia Budowy Abstrakcji Programowanie obiektowe dostarcza narzędzi do reprezentacji elementów: w przestrzeni problemu w przestrzeni rozwiązań W obu przypadkach używamy obiektów jak podstawowej konstrukcji modelowania.
Modelowanie Obiektowe Pracownik staż urlopy naurlop() naszkolenie()... Tablica max wartosc inicjuj() wstaw() zwroc() przestrzeń problemu przestrzeń rozwiązania
Obiektowość i Adaptowalność Program obiektowy dostosowuje się do specyficznego języka danego problemu. Opisuje problem w kategoriach właściwych, a nie w kategoriach maszyny wykonującej. Abstrakcja nie ogranicza się do konkretnego rodzaju problemów.
Podejście Obiektowe 1.wszystko jest obiektem 2.program jest zbiorem obiektów które wysyłają sobie komunikaty 3.każdy obiekt posiada pamięć na którą składają się inne obiekty 4.każdy obiekt posiada swój typ 5.wszystkie obiekty tego samego typu mogą otrzymywać te same komunikaty
Stan, Zachowanie, Tożsamość Obiekt ma stan, zachowanie i tożsamość: stan dane wewnętrzne zachowanie zestaw metod do wykonania tożsamość każdy obiekt można w sposób jednoznaczny odróżnić od innych obiektów
Obiekty i Klasy Obiekty które są identyczne z wyjątkiem stanu są grupowane w klasy. Obiekty klasy mają tą samą: charakterystykę elementy składowe zachowanie operacje na stanie Różnią się wartością stanu, i tożsamością.
Abstrakcyjne Typy Danych Klasa definiuje abstrakcyjny typ danych. Te same możliwości jak typy podstawowe: tworzenie zmiennych typu (obiektów) manipulowanie zmiennymi Możliwość definiowania własnych typów (klas). Rozszerzenie języka.
Interfejs Obiektu Definicja klasy: interfejs i implementacja. Zarowka zapal() zgas() rozjasnij() przyciemnij() Interfejs ustala jakie żądania można wysyłać pod adresem obiektu.
Implementacja Obiektu Utworzenie obiektu klasy: Zarowka zr = new Zarowka(); Żądanie pod kierunkiem obiektu: zr.zapal(); Implementacja to kod umożliwiający wykonanie żądań przez obiekt.
Obiekt jako Usługodawca program dostarcza usług program składa się ze zbioru obiektów realizuje usługi wykorzystując usługi wykonywane przez składowe obiekty usługowy model ułatwia projektowanie, analizę i ponowne użytkowanie obiektów
Ukrywanie Implementacji Dwie grupy użytkowników: budowniczy aplikacji tworzenie aplikacji za pomocą gotowych klas budowniczy klas udostępnienie interfejsu klas to budowy aplikacji Implementacja pozostaje niewidoczna.
Zalety Ukrywania ochrona wewnętrznych operacji/danych przed ingerencją z zewnątrz szczegóły istotne i nieistotne wymiana implementacji klas bez wpływu na poprawność działania aplikacji
Kontrola Dostępu Trzy poziomy kontroli dostępu: public dostępne dla każdego private tylko twórca klasy protected dostęp mają tylko dana klasa i klasy dziedziczące
Budowa Klas Budowa na podstawie klas już istniejących: agregacja - stworzenie i użycie obiektu klasy w nowej klasie. dziedziczenie rozszerzenie klasy
Dziedziczenie Klonowanie klas: klasa bazowej (nad-klasa) modyfikacja i rozszerzenia klasa pochodna (podklasa) Typ bazowy: cechy typów pochodnych. Typ pochodny: cechy dodatkowe.
Przykład Dziedziczenia Figura narysuj() wymaz() przesun() Okrag Trojkat Kwadrat Z bazowej figury, wywodzimy różne figury konkretne.
Dziedziczenie: Dodawanie Figura narysuj() wymaz() przesun() Okrag Trojkat Kwadrat odwrocpoziomo() odwrocpionowo() Dodajemy do klasy potomnej nowe metody, często iteracyjnie.
Dziedziczenie: Przesłanianie Figura narysuj() wymaz() przesun() Okrag narysuj() wymaz() Trojkat Kwadrat odwrocpoziomo() odwrocpionowo() Przesłaniamy metody klasy bazowej przez nowe implementacje metod.
Zasada Zastępowalności Akceptujemy obiekty klasy bazowej - można użyć obiektów klasy pochodnej. Wymagana jest klasa potomna - obiekty klasy bazowej nie wystarczą. Wyjątek: dziedziczenie nie dodaje nowych metod (tylko przesłania).
Wymienialność Obiektów Obiekt jako reprezentant typu bazowego. Kod niezależny od konkretnego typu. Problem: kompilator nie może zdecydować jaki kod ma zostać wykonany.
Wczesne i Późne Wiązanie 1.Wczesne wiązanie: kompilator generuje wywołanie funkcji, program łączący zamienia nazwę na konkretny adres. 2.Późne wiązanie: kompilator upewnia się ze metoda istnieje, jednak kod jest dopiero ustalony w czasie wykonania.
Polimorfizm: Przykład Metoda działająca na dowolne figurze: void zrobcos(figura f) { f.wymaz();... f.narysuj() }
Polimorfizm: Przykład Tworzenie i użycie konkretnych figur: Okrag o = new Okrag(); Trojkat t = new Trojkat(); zrobcos(o); zrobcos(t); Działa bez względu na typ figury.
Rzutowanie w Górę Typ pochodny jako typ bazowy, dostosowanie do formy tego typu. Figura Okrag Trojkat
Klasy Abstrakcyjne nie posiada obiektów używana do definicji interfejsu dla klas z niej wywiedzionych
Metody Abstrakcyjne metoda nie została zaimplementowana jedynie wewnątrz klasy abstrakcyjnej dziedziczenie po klasie abstrakcyjnej: metoda abstrakcyjna musi zostać zaimplementowana klasa potomna jest abstrakcyjna
Interfejs Klasa gdzie zabronione jest definiowanie wszystkich funkcji. Możliwe wielokrotne dziedziczenie.
Podsumowanie Programowanie obiektowe to: enkapsulacja (klasy i obiekty) dziedziczenie polimorfizm Inne kwestie...
Metody Tworzenia Obiektów 1.Metoda statyczna Na stosie lub w obszarze statycznym. Metoda szybka, programista musi sam zwolnić pamięć. 2.Metody dynamiczna (Java!) Tworzenie dynamiczne obiektów na stercie. Ilość i czas życia obiektów nieznany do czasu wykonania.
Czas Życia Obiektów Metoda statyczna: kompilator wyznacza czas trwania obiektu, i sam go niszczy. Metodzie dynamicznej: czas nieznany. Java używa odśmiecacz pamięci, by wykrywać i usuwać obiekty nieużywane.
Kolekcje Obiektów Kolekcja (kontener) to obiekt który zawiera referencje do innych obiektów. Potrzebne gdy liczba potrzebnych obiektów nie jest zadana z góry. Biblioteka Java zawiera wiele kontenerów.
Iteratory Obiekt którego zadaniem jest wybieranie obiektów z kontenera i przekazywanie użytkownikowi. Pozwala na przechodzenie przez kontener bez względu na jego strukturę wewnętrzną. Możliwość podmieniania kontenera bez zakłócania kodu programu.
Wspólny Przodek 1.W Javie wszystkie obiekty dziedziczą po wspólnej klasie bazowej Object. 2.To gwarantuje że wszystkie obiekty posiadają pewne niezbędne funkcje, np. możliwość zapisu i odczytu obiektu z dysku. 3.Uproszcza też implementację odśmiecacza.
Rzutowanie w Dół Umieszczanie/odzyskanie obiektu z kontenera. Tracimy informacje o klasie. Rzutowanie: 1.w górę z klasy potomnej na bazową, bezpieczne. 2.w dół z klasy bazowej na potomną, niebezpieczne.
Odśmiecacz Pamięci Odśmiecacz pamięci: wykrywanie które obiekty sa nieużywane zwalnianie pamięci po tych obiektach Upraszcza problemy projektowe, zapobiega przeciekom pamięci. Cena: nieprzewidywalność czasu wykonania, przez działanie odśmiecacza.
Obsługa Wyjątków Obsługa błędów wymuszona przez język programowania: wyjątek jest obiektem sygnalizowany z miejsca błędu przechwytywany przez odpowiednią procedurę obsługi Alternatywna ścieżka sterowania programu, w przypadku wykrycia błędów.
Współbieżność wielowątkowość: kilka wykonań równoległych wielowątkowość jest częścią języka wątek jest obiektem blokowanie obiektów współdzielonych programowanie niezależne od faktycznej liczby procesorów
Trwałość obiekt istnieje tak długo jak go potrzebujemy, ale nigdy dłużej niż wykonanie programu obiekty trwałe są zapisywane, a następnie odczytywane z dysku obiekty trwałe przechowują wartość pomiędzy wykonaniami programu