Upload
tranduong
View
234
Download
1
Embed Size (px)
Citation preview
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Tomasz Głowacki
Programowanie obiektowe i język Java
Zajęcia finansowane z projektu "Rozwój i doskonalenie kształcenia na
Politechnice Poznańskiej w zakresie technologii informatycznych i ich
zastosowań w przemyśle" POKL.04.01.02-00-189/10
Programowanie strukturalne
Definiuje się dane oraz procedury (funkcje) operujące na tych danych
Dane i procedury (funkcje) nie są w żaden sposób ze sobą związane
2Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
3Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Programowanie obiektowe
Definiuje się obiekty które łączą stan (pola) z zachowaniem (metody)
Program jest rozumiany jako zbiór obiektów, które komunikują się ze sobą w celu wykonania zadania
4Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Java jako język obiektowy
Prawie wszystkie byty w języku Java (z wyłączeniem typów prostych) to obiekty
Istnieją obiektowe „opakowania” dla typów prostych
Dostęp do obiektów istnieje przez referencje
Typy proste i ich opakowania
Typ prosty rozmiar „opakowanie” obiektowe
int 32 bity Integer
char 16 bitów Character
long 64 bity Long
short 16 bitów Short
float 32 bity Float
double 64 bity Double
byte 8 bitów Byte
boolean 8 bitów Boolean
5Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Operatory w języku Java
Matematyczne (+) (-) (/) (*) (%)
Porównania (==) (<=) (>=) (>) (<) (!=)
Auto inkrementacja (++) i dekrementacja (--)
Operatory logiczne
lub (||)
i (&&)
Zaprzeczenie (!)
Operatory bitowe
lub (|)
i (&)
albo (^)
6Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Przykrycie zmiennych
{
int zmienna = 5;
{
int zmienna = 10
}
}
Java nie pozwala na przykrywanie zmiennych. Zasięg zmiennej jest ograniczony nawiasami klarowymi.
7Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Podstawowe instrukcje sterujące w języku Java
if (wyrażenie) then instrukcja; else instrukcja;
if (wyrażenie) then instrukcja;
while (wyrażenie) isntrukcja;
for (inicjalizacja, wyrażenie, krok) instrukcja;
8Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Klasy i obiekty
Klasa definiuje typ - opisuje zachowanie się obiektów należących do tej klasy, zawiera:
Metody
Pola
Obiekt to konkretne wystąpienie danej klasy
9Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Klasy i obiekty w Javie
Definicja klasy odbywa się w następujący sposób
class NazwaKlasy {/*definicja pól i metod*/}
Tworzenie obiektu danej klasy
NazwaKlasy obiekt = new NazwaKlasy();
Dostęp do składowych obiektu odbywa się poprzez kropkę
obiekt.metoda()
obiekt.pole
10Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Słowo kluczowe „static”
Poprzedzenie metody lub pola danej klasy słowem kluczowym static wskazuje, że dana metoda (pole) odnosi się do KLASY a nie do OBIEKTU
Metoda statyczna nie jest związana z żadnym konkretnym obiektem klasy (np. metoda main)
Pole statyczne nie jest związane z żadnym konkretym obiektem klasy:
Może być wykorzystywane przed utworzeniem obiektów klasy
Może być współdzielone przez różne obiekty
11Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Zadanie 1
Utwórz program w języku Java wyświetlający 10 razy napis „Hello world”
12Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Przeciążanie funkcji
W ramach jednej klasy mogą istnieć metody o tej samej nazwie, jeśli różnią się parametrami wejściowymi
Decyzja dotycząca użycia odpowiedniej funkcji jest podejmowana na podstawie listy parametrów
void f1() {}
void f1(String s) {}
void f1(int i) {}
13Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Słowo kluczowe this
Może zostać wykorzystane tylko w niestatycznych metodach klasy
Oznacza referencję do obiektu, na którym wykonywana jet moetoda (referencja do bieżącego obiektu)
int a;
void mnozenie(int a)
{
this.a *= a;
}
14Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Konstruktory (1)
Konstruktor to metoda służąca do inicjalizacji obiektów danej klasy
Nazwa konstruktora jest taka sama jak nazwa klasy i jest wykonywany automatycznie, gdy tworzony jest dany obiekt
Automatycznie dodawany jest do każdej klasy bezparametrowy konstruktor domyślny
class Prostokat{
Prostokat() {}
}
15Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Konstruktory (2)
Istnieje możliwość wywołania konstruktora z innego konstruktora
class Prostokat{
int a,b;
Prostokat(int a) {this(a,a);}
Prostokat(int a,b) {this.a =a; this.b =b;}
}
16Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Zarządzanie pamięcią – garbage collector
Automatyczny mechanizm zarządzania pamięcią wykorzystywany w języku Java
Usuwanie obiektów nie należy do obowiązków programisty, GC sam podejmuje decyzję kiedy należy usunąć dany obiekt
17Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Paradygmaty programowania obiektowego
Dziedziczenie
Hermetyczność
Polimorfizm
18Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Poziomy dostępu do pól i obiektów
Java posiada 4 poziomy dostępu do pól i obiektów:
Pakietowy (domyślny)
Public
Private
Protected
19Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Enkapsulacja zmiennych
Ukrywanie metod i atrybutów danego obiektu dla obiektów zewnętrznych
Obiekt nie może dowolnie zmieniać stanu innego obiektu
private int i;
void setI(int i) {
this.i = i;
}
int getI() {
return i;
}
20Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Dziedziczenie w języku Java
Każda klasa potomna posiada tylko jedną klasę z której dziedziczy; Java nieumożliwia wielodziedziczenia
class kwadrat extends figura {}
Klasa potomna nie ma dostępu do składowych prywatnych swojej nadklasy
Możliwa jest wielopoziomowa hierarchia dziedziczenia –najpierw wywołują się konstruktory klasy nadrzędnej a następnie klasy podrzędnej
Jeśli metoda klasy podrzędnej ma taką samą nazwę i listę parametrów jak metoda klasy nadrzędnej następuje przesłonięcie metody klasy nadrzędnej
Nie można dziedziczyć po klasach zdefiniowanych ze słowem kluczowym final
21Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Interfejsy
class A {}
class B extends A {}
class C extends A implements X {}
interface X {void metoda();}
22Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Polimorfizm
Polimorfizm to możliwość dynamicznego wiązania nazwy metody z jej konkretną implementacją w różnych klasach pozostających w relacji dziedziczenia
class A { public void info()
{System.out.println(„metoda klasy A");}}
class B extends A{ public void info() {
System.out.println(„metoda klasy B");}}
A obiekt = new A();
obiekt.info();
obiekt = new B();
obiekt.info();
23Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Obsługa wyjątków
Wyjątki to sytuacje nietypowe podczas wykonywania programu, takie jak:
Brak pamięci
brak praw dostępu
Niepoprawny format danych wejściowych
Java umożliwia obsługę sytuacji wyjątkowych poprzez wykorzystanie bloku try.. catch
try {
// instrukcje programu mogące zgłaszać wyjątki
}
catch(arg1 e1) { /*obsługa wyjątku e1 typu arg1*/}
catch(arg2 e2) {/*obsługa wyjątku e2 typu arg2*/ }
finally { /*blok finally zawsze się wykona*/ }
24Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Debugowanie
Proces usuwania błędów z oprogramowania, przeprowadzany zwykle przy użyciu programu nazywanego debuggerem
Proces debuggowania można podzielić na następujące etapy:
Reprodukcja błędu
Wyizolowanie źródła błędu
Identyfikacja przyczyny (debugger)
Usunięcie błędu
25Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Zadanie
Napisać program, który do każdego z 10 elementów tablicy przypisuje indeks tego elementu (pętla for) a następnie każdemu elementowi przyporządkowuje sumę poprzednich elementów (pętla for)
Należy prześledzić wartości w tablicy podczas wykonywania programu wykorzystując debugger Eclipse
26Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Język UML
Zunifikowany język modelowania wykorzystywany do modelowania rzeczywistości
UML z powodzeniem wykorzystuje się do modelowania
Systemów informatycznych
Procesów biznesowych
UML jest bardzo rozbudowanym standardem (posiada 13 różnych rodzajów diagramów), przykładowe rodzaje diagramów:
Diagram klas
Diagram przypadków użycia
Diagram sekwencji
27Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Diagram klas
Diagram klas jest statycznym diagramem UML, który opisuje klasy systemu, metody, związki między klasami oraz liczności tych związków.
Wyróżnia się następujące rodzaje związków między klasami: Dziedziczenie: związek określający relację generalizacji-specjalizacji,
element modelu zwany specjalizacją jest rodzajem drugiego elementu modelu, zwanego generalizacją (np. Książka-Słownik)
Asocjacja: oznacza, że element modelu jest powiązany w pewien sposób w ramach dziedziny z innym elementem(np. Firma-Pracownik)
Agregracja: związek ten oznacza, że element modelu składa się z innych elementów tego modelu(np. Biblioteka-Książka)
Kompozycja: Związek ten oznacza, że element modelu składa się z innych elementów tego modelu, przy czym istnieje silne powiązanie między cyklem życia tego kontenera i elementów z których się składa; jeśli kontener zostanie zniszczony, elementy które on zawiera również powinny zostać zniszczone
Realizacja: oznacza, że jeden element modelu implementuje zachowanie drugiego elementu modelu
28Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Zadanie 2 – projektowanie obiektowe (OOD)
Zaprojektować program, który przechowuje listę klientów firmy: osób fizycznych jak i klientów instytucjonalnych. Istnieje możliwość wyszukania klienta po następujących cechach:
Imię, nazwisko, NIP lub PESEL dla osoby fizycznej
Nazwa firmy, REGON, NIP dla firmy
Istnieje możliwość wyświetlenia danych wyszukanego klienta (wraz z listą jego samochodów). Każdy samochód posiada dane o marce, roczniku, cenie, kolorze oraz informacje o płatnościach: rodzaj płatności (karta, gotówka, raty) oraz dacie zakupu. W przypadku rat przechowywane są informacje dotyczące terminu jej płatności, informacji o statusie raty (zapłacona, zapłacona z opóźnieniem, opóźniona, do zapłaty). W przypadku, gdy rodzaj płatności za samochód to „raty” istnieje możliwość przejrzenia listy wszystkich rat za samochód.
Dla każdego zakupionego samochodu zdefiniowana jest waluta płatności. W przypadku rat wszystkie raty za jeden samochód są opłacane w tej samej walucie. System utrzymuje tabelę kursu walut (dolar, euro, funt). Użytkownik może wybrać, w jakiej walucie są wyświetlane ceny samochodów. Po zmianie waluty ceny są przeliczane w zależności od kursu waluty na dzień zakupu samochodu. Dla danych o statusie „do zapłaty” (czyli przyszłych rat), w przypadku przeliczania płatności zostaje wzięte pod uwagę ostatni kurs danej waluty.
29Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Refaktoryzacja kodu
Refaktoryzacja to proces poprawy kodu tak aby stał się on bardziej czytelny:
Nie zmienia się funkcjonalności kodu
Nie dodaje się nowej funkcjonalności
30Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Brzydkie zapachy (bad smells)
„Brzydkie zapachy” w kodzie są symptomami problemów oprogramowania i wskazują, że kod powinien zostać zrefaktoryzowany. Brzydkie zapachy mogą wpływać negatywnie na czytelność kodu i wydajność programu.
31Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Przykłady „brzydkich zapachów” (1)
Powtórzony kod:
fragment kodu występuje więcej niż raz,
możliwość rozwiązania: wydzielenie metody
Długa metoda:
Preferowane są krótkie metody, zawierające najwyżej kilkadziesiąt linii kodu
Możliwość rozwiązania: wydzielenie metody, wydzielenie obiektu
Leniwa klasa
Zrozumienie każdej klasy w systemie wymaga czasu programistów, jeśli klasa nie posiada wystarczająco dużo funkcjonalności to czas poświęcony na jej zrozumienie nie jest współmierny do zysku jaki daje posiadanie tej klasy
Możliwe rozwiązania: dla kasy dziedziczącej z innej klasy usunięcie dziedziczenia; przerzucenie funkcjonalności do innej klasy
32Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Przykłady „brzydkich zapachów” (2)
Klasa danych
Klasa zawierająca tylko pola, getery i setery
Możliwe rozwiązania: przeniesienie metod do klasy danych, jeśli nie da się przenieść całej funkcjonalności wykorzystać wydzielenie metody
Duża klasa
Za duża funkcjonalność jednej klasy, która wywołuje potrzebę utrzymywania wielu obiektów tej klasy
Możliwe rozwiązania: w przypadku redundancji wydzielenie metod, wydzielenie klasy nadrzędnej, dziedziczenie
Odrzucony spadek
Klasa wykorzystuje tylko część funkcjonalności klasy nadrzędnej
Możliwe rozwiązania: przemieszczenie części funkcjonalności z klasy nadrzędnej na potomków
33Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Kontenery
Kontenery to specjalne obiekty pozwalające na przechowywanie innych obiektów w pewien określony sposób
Kontenery przechowują referencje do obiektów
34Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Kontenery w języku Java
Język Java zawiera 2 rodzaje kontenerów:
Kolekcje (interfejs Collection)
Mapy (interfejs Map)
35Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Metody interfejsu Collection
boolean add(Object)
boolean addAll(Collection)
void clear()
boolean contains(Object)
Iterator iterator
boolean remove(Object)
Boolean removeAll(Collection)
int size()
36Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
ArrayList vs LinkedList
ArrayList
Dodawanie elementu O(n)
Wyszukiwanie elementu O(1)
LinkedList
Dodawanie elementu O(1)
Wyszukiwanie elementu O(n)
37Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
HashSet vs TreeSet
HashSet
Dostęp do elementu w czasie stałym
TreeSet
Dostęp do elementu w czasie logarytmicznym
Uporządkowanie elementów
38Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Interfejs Map
put (Object key, Object value)
Object get(Obect key)
boolean containskey(Object key)
boolean containsValue(Object value)
39Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego