Wykład 1: Wprowadzenie
Transkrypt
Wykład 1: Wprowadzenie
Wykład 1: Wprowadzenie
1.wprowadzenie
8.obsługa błędów
2.podstawy języka
9.kolekcje obiektów
3.sterowanie
10.wejście i wyjście
4.inicjacja i sprzątanie
11.równoległość
5.kontrola dostępu
12.interfejs graficzny
6.dziedziczenie
13.programy sieciowe
7.polimorfizm
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
Tablica
staż
urlopy
naUrlop()
naSzkolenie()
...
max
wartosc
przestrzeń
problemu
inicjuj()
wstaw()
zwroc()
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