Programowanie obiektowe 15 godzin w. 30 godzin lab Wykład 1
Zakres 1. Wprowadzenie do programowania zorientowanego obiektowo. Definicja klasy. Instancje. Pola i metody. Dziedziczenie klas. Enkapsulacja. Polimorfizm. 2. Techniki obiektowe w JavaScript. Obiekt Math, Date, document. Dostęp do obiektów. Tworzenie i modyfikacja instancji. 3. Tworzenie nowych klas i instancji kreacja metod i ich wykorzystanie. 4. Wprowadzenie do programowania w środowisku Java (Eclipse, NetBeans). Konstruktory i destruktory, dziedziczenie. 5. Obiekty i klasy w Javie. Przykłady zastosowań.
Podstawowe cechy programowania obiektowego
Programowanie strukturalne (proceduralne) to koncepcja tradycyjna Główną jego składową są instrukcje działające na danych. Złożone programy korzystają z funkcji, procedur (także modułów) w celu uproszczenia zarządzania i kontroli nad programem, lecz nie zmienia to podstawowej koncepcji.
Wady programowania strukturalnego dane są powszechnie dostępne łatwo o błędy, sekwencyjność wykonywania programu, wszystkie sytuacje trzeba przewidywać i obsługiwać, konieczność testowania po każdej zmianie, wiele instrukcji, obszerny kod, trudność zrozumienia algorytmu służy do nauki programowania niewygodne nie przystaje do obecnych systemów operacyjnych obiektowych (komponentowych)
Przykład wykorzystania funkcji <HTML> <HEAD> <SCRIPT LANGUAGE="JavaScript"> function dodaj(s1,s2) { s3=s1+s2; alert(s3); } </SCRIPT> <BODY style="font-size:28px"> <SCRIPT LANGUAGE="JavaScript"> dodaj(-3, 1.5); dodaj(13,2.5); </SCRIPT> </BODY> //wykonanie funkcji //inne wykonanie funkcji //definicja funkcji
Zauważono Kryzys oprogramowania programowanie strukturalne utrudnia panowanie nad bardzo złożonymi systemami informatycznymi (SI) - rozwój sprzętu wyprzedzał techniki budowania SI. Potrzebne były metody zwiększające wydajność i systematyczność tworzenia SI, a następnie ich wydajność. Poza tym powstały interfejsy graficzne (Windows)! Korzenie technologii obiektowej lata 60-te, Nygaard i Dohl - Simula 1, Simula67 (1967).
OBIEKTOWOŚĆ filozofia tworzenia na podstawie rzeczywistych zjawisk otaczającego świata (nie tylko język programowania). Obiekty (świata rzeczywistego a także systemu operacyjnego komputera plik, ikona, przycisk, okno) mają swoje właściwości statyczne (nazwa, kolor itp.) a także zbiory operacji na nich czy przez nie wykonywanych.
Np. typ tablica ma swoje cechy atrybuty: wymiar rozmiar typ przechowywanych danych nie określa się jednak sposobów operacji na tablicach (np. dodawanie tablic), trzeba do tej operacji tworzyć własne kody lub korzystać z bibliotecznych procedur, których użycie wymaga szczegółowego zapoznania się z zestawem parametrów formalnych (sposób użycia).
Stworzono tzw. ADT abstrakcyjny typ danych nazwano modułem (język Modula) lub klasą (język Simula). Podążanie w kierunku naturalnego języka (zbliżenie do rzeczywistości), System reaguje na zdarzenia ( siły sprawcze ), efektem są procesy: o o o inicjacji przetwarzania parametrów obiektów przesyłu informacji między obiektami oddziaływania jednych obiektów na inne
PROGRAMOWANIE OOP (Object Oriented Programming) podstawowe pojęcia Programowanie zorientowane obiektowo (OOP Object Oriented Programming) umożliwia przedstawienie problemu w postaci logicznie powiązanych ze sobą struktur danych zwanych obiektami, wymieniających informacje między sobą. Obiektowość opiera się na koncepcyjnym (intuicyjnym) klasyfikowaniu rzeczywistości. Na świat składają się obiekty i procesy w nich zachodzące. Koncepcja (pojęcie) "klasy" KLASA= typ obiektowy=encja (entity) OBIEKT = reprezentacja w klasie = instancja
Podobnie jak typ zmiennej i zmienna typ liczbowy klasa człowiek x y z przedstawiciele typu A B C instancje w klasie
"Koncepcja (pojęcie) jest wyobrażeniem lub oznaczeniem stosowanym do rzeczy lub obiektów w naszej świadomości" (Martin) (Encja = byt pojęciowy, konceptualny) Przykład 1: Klasyfikacja obiektów materialne: osoba, samochód, robot, maszyna niematerialne (abstrakcyjne): firma, czas, role: pacjent, nauczyciel, relacyjne: małżeństwo, posiadanie zdarzeniowe: sprzedaż, wysłanie inne: zestaw, ikona, sygnał, proces
Łatwo zrozumieć pojęcia materialne, trudniej abstrakcyjne. Przenikanie i wzajemna zależność pojęć. Klasy: wyrób japoński, urządzenie do rejestracji obrazu, Obiekty: kamera SONY, magnetowid Panasonic magnetowid Toyota Celica
OBIEKTY egzemplarze typów obiektowych (TO), instancje w klasie Np. Samochód (TO) Toyota, Renault (obiekty) wyrób Renault (TO) Megane, Kangoo, Clio (obiekty) KLASA - zbiór obiektów przefiltrowanych przez definicję typu obiektowego - sklasyfikowanych do tego typu. Może być brak obiektów w klasie np. klasa: perpetuum mobile, klasa: samochód napędzany wodą
Typ obiektowy = klasa - jest to złożona struktura danych o określonej liczbie atrybutów. Atrybuty dzielimy na pola i metody. pola (fields) atrybuty (właściwości opisane wartościami dowolnych typów, także strukturalnych) Pole jest to zmienna, która może być różnego typu. metody (methods) procedury i funkcje wykonywane na polach. Metoda jest czynnością wykonywaną na obiekcie w postaci procedury lub funkcji. Metoda obiektu operuje na polach (danych) obiektu, przy ich pomocy mamy dostęp do pól.
Teoria programowania wprowadza pojęcie typu rekordowego Przykład definicji typu rekordowego: typ osoba =record { nazwisko : tekst imie: tekst wiek: liczba całkowita kolor_oczu: (niebieskie,czarne, piwne, zielone, brązowe); } itd.. //typ tzw. wyliczeniowy Znamy to z baz danych: Microsoft Access semestr 2.
Prosty typ obiektowy (klasa) mógłby na przykład być tak definiowany typ osoba = class { nazwisko : tekst waga: liczba całkowita funkcja jedz (kg) {waga=waga+kg/10} funkcja biegaj (km) } {waga=waga-km/10} Jak widzimy definicja klasy (typu obiektowego) zawiera dwie funkcje (metody).
Czyli. typ obiektowy to typ rekordowy poszerzony o metody (funkcje)
Dokładniej metoda jest to pewna funkcja mająca definicję w ramach typu obiektowego, jest integralnie przypisana do klasy. Wykorzystanie właściwości i metod jest kwalifikowane (przypisanie do egzemplarzy w klasie): definicja klasy Kot { właściwości metody } Maciuś, Mruczek Kot definicje Maciuś. sierść => szara; Mruczek.jedz Maciuś.miaucz akcje wyzwolone przez siły sprawcze: nadania wartości właściwościom, wykonanie metod
Hermetyzacja Własność polegająca na dostępie do pól jedynie przy użyciu metod nazywa się hermetyzacją. Ułatwia kontrolę poprawności złożonych programów.
Dziedziczenie Typ obiektowy może on być: niezależny, (zdefiniowany podobnie jak typ rekordowy) jako potomek istniejącego. Wtedy mówimy, że obiekt dziedziczy wszystkie elementy (pola i metody) swojego przodka lub jest typem potomnym. Obiekty potomne mogą mieć własnego potomka (lub wielu).
Przykładowo: klasa nadrzędna: człowiek klasa podrzędna: pracownik lub student (potomek klasy człowiek). Obiekt dziedziczy wszystkie elementy (pola i metody) swojego przodka lub jest typem potomnym posiada dodatkowe pola i metody Obiekty potomne mogą mieć własnego potomka (lub wielu). Przykładowo: robotnik, urzędnik potomkowie klasy pracownik
Wzajemne zależności obiektów układają się w drzewo hierarchii obiektów. Dziedziczność bezpośrednia przodek jest niezależny (sam nie ma przodka) Dziedziczność pośrednia przodek już dziedziczy (sam ma przodka)
Przykład: typ polozenie = class {//obiekt niezależny x: liczba całkowita; y: liczba całkowita; } typ punkt = class (polozenie){ //obiekt potomny widocznosc: typ logiczny (TAK/NIE); }
Przykład: typ { TPolozenie = class x: liczba całkowita; y: liczba całkowita; function przesun (dx, dy: liczba całkowita) { x:=x+dx; y:=y+dy; } } opis metody
Jeśli mamy zdefiniowany typ (klasę) Polozenie korzystać z obiektów (instancji w klasie) możemy p1, p2 obiekty typu (klasy) Polozenie //nadanie wartości polom (w zależności od ich typu) p1.x=100; p1.y = 30; //wykonanie metody p1.przesun(100,50); dostęp do pól (też metod) - zapis z kropką
Jeszcze jeden ważny aspekt zagnieżdżanie obiektów Obiekty mogą się składać się z obiektów składowych, czyli właściwości klasy mogą być też klasami, przykładowo: klasa Robot_humanoidalny { klasa Ręka [2] } {definicja} klasa Noga [2] {definicja} klasa Tułów {definicja} metody robota obiekty R1, R2:Robot_humanoidalny; pola klasy też typu obiektowego metody klasy Definicja Określenie przynależności obiektów do klasy R1.Reka. przesuń(kierunek, odległość) Przykładowa akcja
OOP - Object Oriented Programming stosuje się typ obiektowy - abstrakcyjne typy danych operacje programu dotyczą utworzonych w nim obiektów (instancji) zgodnie z definicją dane traktowane są jako rzecz istotniejsza - funkcje na drugim miejscu
Istota działań w programie: sterowane zdarzeniami (event_driven) zdarzenie jest zjawiskiem mającym związek z obiektem: - w interfejsie systemu (naciśnięcie klawisza, kliknięcie myszką, wybranie opcji menu) - w określonym momencie czasowym - w przypadku detekcji wystąpienia pewnego zjawiska, stanu, poziomu jakiejś wielkości - wyzwolone przez inny obiekt działania nie muszą być sekwencyjnie wykonywane - wystąpienie zdarzenia aktywizacja procedury obsługi (metody) - dalsze oczekiwanie na następne zdarzenie praktyczna realizacja wspomagana przez jakiś system operacyjny
Realizacja programowania obiektowego: - większość współczesnych języków: C++, Java, JavaScript, PHP, ObjectPascal, C#, nawet w środowiskach specjalizowanych: np. Matlab - w złożonych systemach, np. : sterowanie automatów, systemy czasu rzeczywistego - często specjalistyczne oprogramowanie, kodowanie danych i funkcji systemów obiektowych z wykorzystaniem języków niskiego poziomu (elementarne rozkazy procesora, assembler)
Javascript Przypomnienie zasad Może być osadzany w innych programach, na przykład w przeglądarce internetowej, aby, mając dostęp do obiektów otoczenia (np. modelu obiektowego przeglądarki internetowej - DOM), można sprawować nad tym otoczeniem kontrolę. Javascript jest łatwy w nauce i pozwala na pewne zdynamizowanie stron internetowych, a także zarządzanie włanymi, utworzonymi obiektami. Przeglądarki mogą pytać o zezwolenie na wykonanie skryptu.
Wstawienie skryptu do dokumentu HTML Skrypty JavaScript są zagnieżdżane w dokumentach HTML. Skrypt JavaScript umieszczane są między znacznikami <SCRIPT> i </SCRIPT>. <SCRIPT LANGUAGE="JavaScript"> treść skryptu </SCRIPT>
<HTML><HEAD></HEAD> <BODY> <P> To jest tekst 1</P> <SCRIPT LANGUAGE="JavaScript"> treść skryptu 1 </SCRIPT> <P> To jest tekst 2</P> <SCRIPT LANGUAGE="JavaScript"> treść skryptu 2 </SCRIPT> </BODY></HTML> Może istnieć wiele skryptów naprzemiennie z pozostałym kodem HTML
Aby tworzyć działające skrypty JavaScript wymagane są: - jakaś metoda wprowadzania i przechowania danych (liczb, tekstów) - jakieś instrukcje, które umożliwią obliczenia wyników - jakieś metody pokazania wyniku
Wykorzystanie skryptu Javascript w dokumencie HTML <HTML><HEAD></HEAD> <BODY> <SCRIPT LANGUAGE="JavaScript"> // obiekt document i jego metoda write - wypisanie tekstu document.write ("To jest zwykły tekst"); // wysyłamy też znacznik HTML document.write ("<BR />"); //nadajemy wartość zmiennej x=5; //... i wyświetlamy jej wartość document.write("wartość zmiennej <I>x</I> : "+x); document.write ("<BR>To jest liczba PI:"+Math.PI); </SCRIPT> <P> a to już akapit poza skryptem</p> </BODY></HTML> właściwość obiektu
Kilka zasad pisania skryptów Komentarze Komentarz o kilku wierszach, /* treść komentarza */ Jednowierszowy komentarz // tekst Wykorzystywane są w celu: - opisy wyjaśniające - dezaktywowanie instrukcji (testy, błędy)
Identyfikatory Są to nazwy elementów (zmiennych, obiektów, funkcji) Zmienne służą do przechowania wartości określonego typu Jednym z podstawowych sposobów nadania wartości zmiennej jest instrukcja przypisania (nadania wartości) Ciąg liter, cyfr, znaków podkreślenia (nie wolno spacji!) Musi się zaczynać od litery Ważne duże i małe litery! (w odróżnieniu od innych języków) Przykłady identyfikatorów dla zmiennych: x alfa Alfa mojazmienna B11 c_33 to dwie różne zmienne styl "wielbłądzi"
Operatory Arytmetyczne: + - * / %(reszta z dzielenia) Przypisania: = += x+=5 odpowiada x=x+5, = x =5 odpowiada x=x 5, *= x*=5 odpowiada x=x*5, /= x/=5 odpowiada x=x/5, ++ inkrementacja zwiększenie o 1 (x++ odpowiada x=x+1) -- dekrementacja zmniejszenie o 1 (x-- odpowiada x=x-1) %= reszta z dzielenia (x%=5 odpowiada x=x%5) operator + służy też do konkatenacji (łączenia tekstów) "Mateusz " + 'Kowalski' para " lub para '
Przykładowo: <SCRIPT LANGUAGE="JavaScript"> x = 7; //początkowo x ma wartość 7 x++; //zwiększamy o 1 x += 4; //dodajemy 4 (lub: x=x+4 ) x %= 10; //reszta z dzielenia z przez 10, a więc.. 2 //tu trzeba by wypisać wartość x na ekranie, zaraz się nauczymy </SCRIPT>
Operatory porównania wyrażenie operator wyrażenie ==!=(nierówne) <= < > >= Przykładowo: x==5 x>=3 a+b> 3*y jest to pytanie: czy jest spełnione? odpowiedź: tak lub nie (TRUE/FALSE) Porównania mogą być przypisane do zmiennej: z34 = 5<=6 (zmienna z34 będzie miała wartość true) Używane też w innych instrukcjach (np. warunkowej) o tym za chwilę
Operatory logiczne koniunkcja (i) && alternatywa (lub) negacja! true && false daje false!false daje true
Instrukcje wykonanie akcji! Instrukcje języka oddzielamy średnikami (jeśli zapisujemy w tym samym wierszu). Czasem blok kilku instrukcji otaczamy klamrami { } zazwyczaj we wnętrzu instrukcji warunkowych i iteracyjnych (np. if, for, while) o nich za chwilę <SCRIPT LANGUAGE="JavaScript"> instrukcja1; { instrukcja2; instrukcja3; instrukcja4; } </SCRIPT> traktowany w całości jako blok instrukcji
Typy instrukcji - przypisania (nadania wartości); - warunkowe - pętle - wykonania funkcji (metody obiektu)
Instrukcja przypisania zmienna operator_przypisania [wyrażenie]; Po lewej stronie operatora tylko nazwa zmiennej!!! inicjowanej (pierwszy raz definiowanej) lub istniejącej i przedefiniowywanej. Po prawej stronie operatora piszemy wyrażenie (bardzo podobne jak w Excelu), zawierające liczby, operatory, nawiasy okrągłe, funkcje metody obiektów, oraz zmienne o ZNANYCH WARTOŚCIACH Wyrażenie jest obliczane i jego wartość przechowana w zmiennej Wyrażenie jest opcjonalne (pomijamy w przypadku operatorów ++ i --) Przykłady: x=5; alfa= 3*x; b15=(3-x)+2.7/alfa; b15++; x+=4; stałe - liczby dziesiętne z KROPKĄ!!!
Oczywiście ważna jest kolejność instrukcji przypisania! a=5; a++; //to ma sens a++; //nieznane a a=5;
Instrukcja wypisania na ekranie document.write (element); document to wbudowany obiekt w JavaScript, a write (pisz) to jedna z jego metod identyfikator obiektu i identyfikator jego metody oddzielamy kropką Przykład <SCRIPT LANGUAGE="JavaScript"> document.write ("To jest zwykły tekst<br />"); x=5; //przypisujemy wartość zmiennej // wyświetlamy jej wartość document.write("wartość zmiennej <I>x</I> : "+x+"<br />"); napis="mateusz " + 'Kowalski'; document.write(napis); </SCRIPT> Można wysyłać do przeglądarki znaczniki HTML(dla pozycjonowania, formatowania itp.)
Inna metoda wyprowadzenia danych - wyświetlanie w dodatkowym okienku alert Metoda dla obiektu window, tworząca okienko dialogowe z napisem informacyjnym lub wartością numeryczną. <SCRIPT language="javascript"> raz=2; alert("witaj!"); alert("witaj "+raz+"-gi raz"); </SCRIPT> dokładniej window.alert, ale domyślny obiekt to window
Obiekt Math (uwaga! duża litera M) Wbudowany obiekt Math zawiera wartości matematyczne, jako właściwości (ang. property) i funkcje standardowe jako metody (ang. method). Są tutaj przechowywane pewne stałe matematyczne: Math.property lub gotowe funkcje Math.method gdzie property lub method jest jednym z podanych niżej elementów.
property (właściwości) E e - stała Eulera, która wynosi ok. 2.718 PI wartość liczby π, czyli ok. 3.14159 document.write(math.e);
method (metody) abs(wyrażenie) cos(wyrażenie) sin(wyrażenie) tan(liczba) ceil(liczba) floor(liczba) round(liczba) exp(liczba) wartość bezwzględna liczby funkcje trygonometryczne (argument w radianach!!!) zaokrąglenie do całkowitej w górę zaokrąglenie do całkowitej w dół zaokrąglenie do najbliższej całkowitej e x UWAGA!!! log(liczba) logarytm naturalny liczby! pow(liczba1,liczba2) random() sqrt(liczba) wartość liczby1 podniesionej do potęgi liczby2 wartość pseudolosowa z przedziału (0,1) bez argumentu pierwiastek kwadratowy liczby
Przykłady: <SCRIPT LANGUAGE="JavaScript"> document.write(math.sin(4*math.pi/180)+"<br />"); </SCRIPT> lub wykorzystując zmienną: <SCRIPT LANGUAGE="JavaScript"> wynik=math.sin(3*math.pi/180); document.write(wynik); //można też alert ("Wynik=:"+wynik); //w dodatkowym oknie </SCRIPT>
Sekwencja obliczeń: <SCRIPT LANGUAGE="JavaScript"> //Pierwiastki równania kwadratowego a=5; b=5; c=1; delta=b*b-4*a*c; pdelta=math.sqrt(delta); x1=(-b-pdelta)/2/a; //albo /(2*a) x2=(-b+pdelta)/2/a; document.write('x1:'+x1+"<br />"); document.write('x2:'+x2+"<br />"); </SCRIPT> x1:-0.7236067977499789 x2:-0.276393202250021 Oczywiście gdy delta będzie ujemne, to błąd! NaN nieokreślone Jak przeciwdziałać? Instrukcja badania warunku if (test, sprawdzenie!)
Przykład pisania wyrażeń zapis w skrypcie JavaScript y = sin 2 x x 3 3 ( x + 4 3 ) x x=math.pi; //musimy określić wartość x y= (Math.pow(Math.sin(x),2) - Math.pow((x-3)*x,1/3)) /(Math.abs(Math.pow(x,-3))+4); document.write(y); łatwo o błędy (dużo nawiasów!) Uwaga: wolno spacje, ale nie wewnątrz nazw wolno przenieść do następnego wiersza
jak sobie ułatwić? wprowadzać zmienne pomocnicze liczymy etapami. y = sin 2 x x 3 3 ( x + 4 3 ) x <SCRIPT language="javascript"> x=math.pi; //jak poprzednio L1= Math.pow(Math.sin(x),2); L2=Math.pow((x-3)*x,1/3); L= L1- L2;//licznik M= Math.abs(Math.pow(x,-3))+4; //mianownik y= L/M; //wynik document.write(y); </SCRIPT>
Debugging detekcja błędów kodu JavaScript Przykładowo: document.write("log(5)<br />"); document.write(math.log(5)/math.log(10)+"< br />"); W IExplorer Menu Narzędzia (narzędzia deweloperskie - F12) w oknie konsoli klikamy menu Skrypt Po odświeżeniu strony w konsoli pojawi się komunikat: SCRIPT5009: Brak definicji math