Wykład 1: Wprowadzenie
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 1.wprowadzenie 2.podstawy języka 3.sterowanie 4.inicjacja i sprzątanie 5.kontrola dostępu 6.dziedziczenie 7.polimorfizmWykład 1: Zagadnienia
✔ pojęcia programowanie obiektowego
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 Wykonawcza
Abstrakcja od szczegółów maszyny, która wykonuje program:
– asembler jest abstrakcją języka
maszynowego
– języki imperatywne (Fortran, Basic, C)
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,%i2st %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
Abstrakcja Problemowa
Abstrakcja przez modelowanie problemu:
– LISP: problemy wyrażone listami
– PROLOG: problemy wyrażone przy
pomocy reguł logicznych
– AWK: problemy przetwarzania plików
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
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
Modelowanie Obiektowe
Pracownik staż urlopy staż urlopy naUrlop() naSzkolenie() ... Pracownik staż urlopy staż urlopy naUrlop() naSzkolenie() ... Tablica max wartosc inicjuj() wstaw() zwroc() przestrzeń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
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
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
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,
Ukrywanie Implementacji
Dwie grupy użytkowników:
● budowniczy aplikacji – tworzenie
aplikacji za pomocą gotowych klas
● budowniczy klas – udostępnienie
interfejsu klas to budowy aplikacji
Zalety Ukrywania
● ochrona wewnętrznych operacji/danych
przed ingerencją z zewnątrz
● szczegóły istotne i nieistotne
● wymiana implementacji klas bez wpływu
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
Budowa Klas
Budowa na podstawie klas już istniejących:
– agregacja - stworzenie i użycie obiektu
klasy w nowej klasie.
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
Figuranarysuj() wymaz() przesun()
Okrag Trojkat Kwadrat
Z bazowej figury, wywodzimy różne figury konkretne.
Dziedziczenie: Dodawanie
Figura narysuj() wymaz() przesun() Okrag Kwadrat odwrocPoziomo() odwrocPionowo() TrojkatDodajemy do klasy potomnej nowe metody, często iteracyjnie.
Dziedziczenie: Przesłanianie
Figura narysuj() wymaz() przesun() Okrag Kwadrat odwrocPoziomo() odwrocPionowo() TrojkatPrzesłaniamy metody klasy bazowej przez nowe implementacje metod.
narysuj() wymaz()
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
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);
Rzutowanie w Górę
Typ pochodny jako typ bazowy, dostosowanie do formy tego typu.
Figura
Klasy Abstrakcyjne
✔ nie posiada obiektów
✔ używana do definicji interfejsu dla
Metody Abstrakcyjne
✔ metoda nie została zaimplementowana
✔ jedynie wewnątrz klasy abstrakcyjnej ✔ dziedziczenie po klasie abstrakcyjnej:
✔ metoda abstrakcyjna musi zostać
zaimplementowana
Interfejs
Klasa gdzie zabronione jest definiowanie wszystkich funkcji.
Podsumowanie
Programowanie obiektowe to:
✔ enkapsulacja (klasy i obiekty) ✔ dziedziczenie
✔ polimorfizm
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
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.
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
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.
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
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
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
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ść