Wprowadzenie do programowania obiektowego OOP - Object-Oriented Programming Z. Rudnicki Tradycyjne programowanie strukturalne Zalety: Sekwencyjne wykonywanie poleceń ułatwia tworzenie i sprawdzanie algorytmów Wady: Dane są dostępne w całym programie co zwiększa ryzyko ich przypadkowego uszkodzenia Obszerne programy mogą być mało przejrzyste Brak dostosowania do trybu okienkowego i graficznych interfejsów użytkownika 2 1
OOP - Object-Oriented Programming Programowanie Zorientowane Obiektowo Bazuje na klasach obiektów (class), stanowiących rozszerzenie koncepcji typów danych - a w szczególności typów charakteryzowanych n-tkami cech (i w Matlabie zwanych strukturami) - o funkcje (methods) i zdarzenia (events) do obsługi tych danych. Pozwala odwzorować zarówno graficzne (ekranowe) obiekty dialogowe jak dowolne obiekty ze świata realnego 3 Programowanie Zorientowane Obiektowo c.d. Pozwala tworzyć klasy obiektów o zmiennych cechach (properties) do wielokrotnego użytku (reusable), zabezpieczone przed obcymi działaniami czyli hermetyzowane (encapsulated), dzięki posiadaniu własnych operatorów i funkcji (methods) Umożliwia dziedziczenie (inheritance) cech z klas nadrzędnych Operatory i funkcje mogą wykazywać polimorfizm (wielopostaciowość) - zmieniając działanie odpowiednio do klasy (typu) obiektów na których działają. Taka zmiana działania operatora nazywana jest z angielska overloading czyli przedefiniowanie albo przeładowanie operatora ale najczęściej tłumaczona jest (mylnie) jako przeciążanie operatorów. Przykład: dodawanie tekstów to ich sklejanie a nie suma jak dla liczb 4 2
W Matlabie zamiast typów danych są klasy W tradycyjnych językach programowania każda stała i zmienna musi mieć określony typ. W Matlabie i językach obiektowo zorientowanych zamiast typów zmiennych występują klasy obiektów. Powstające zmienne są więc obiektami określonych klas. Na przykład zdefiniujmy zmienne przez nadanie im wartości: >> p='ala'; x=[5,2;3,4]; y=4.1; >> whos % - wyświetli utworzone zmienne: Name Size Bytes Class p 1x3 6 char x 2x2 32 double y 1x1 8 double 5 Cechy i metody klasy obiektów Każda klasa ma przypisane CECHY properties oraz METODY methods (czyli podprogramy funkcyjne). Na przykład chcemy wyświetlić metody dla klasy o nazwie double: >> methods('double') Methods for class double: abs exist nonzeros accumarray exp norm acos fft not acosh fftn nzmax......... 6 3
Trzy poziomy korzystania z obiektowości w Matlabie 1) nieświadome przez używanie zmiennych, funkcji i wykresów - jak dotychczas 2) korzystanie z graficznych dialogowych obiektów przy pomocy kreatora Guide 3) samodzielne definiowanie dowolnych klas i obiektów 7 Gotowe klasy w Matlabie Przy tworzeniu wykresów i programów z interfejsem graficznym - korzystamy ze zdefiniowanych już w Matlabie klas, tworząc jedynie obiekty czyli instancje tych klas, jak: układy współrzędnych, linie, przyciski, suwaki i t.p. Modyfikujemy ich cechy i przypisujemy ich zdarzeniom funkcje. 8 4
Korzystanie z wbudowanych klas i obiektów graficznych za pomocą kreatora GUIDE 9 Przykład: utworzyć program do obliczania pierwiastka kwadratowego z wpisanej liczby 10 5
Kreator GUIDE oraz Inspector cech W oknie komend wpisujemy: guide - pojawi się pusta formatka na którą można wstawiać obiekty dialogowe z palety klas Wybrany kliknięciem obiekt pokaże swoje cechy i metody w oknie INSPECTOR Cechy te (np.: Color) można zmieniać w INSPECTORze Każdy element ma identyfikator istniejący jako wartość cechy TAG 11 Tworzenie obiektów za pomocą palety klas Do naszego prostego programu wykorzystamy obiekty następujących klas: STATIC TEXT - ustalony tekst nie podlegający edycji EDIT TEXT - okienko do wpisywania, w naszym przypadku liczb dla których ma obliczyć pierwiastek PUSH BUTTON - przycisk - u nas z napisem OBLICZ - inicjujący obliczenia 12 6
Tworzenie GUI programu PIERWIASTEK w kreatorze GUIDE 13 Określanie cech obiektów w okienku INSPECTOR Po wstawieniu obiektów można zmieniać ich położenie i rozmiary przy pomocy myszki natomiast inne cechy zmienia się po wybraniu obiektu w okienku INSPECTOR. W naszym przypadku istotne będą cechy: String - tekst wyświetlany FontSize - rozmiar czcionki FontWeight - wytłuszczenie czcionki BackGroundColor - kolor tła Callback - wywołanie funkcji realizowane przyciskiem 14 7
Zmienione cechy obiektów Klasa TAG Cecha Wartość cechy String 'Obliczanie pierwiastka liczby' Static Text text1 FontSize 11 FontWeight bold BackGroundColor [1 1 0] String 'Liczba =' Static Text text2 FontSize 11 FontWeight bold BackGroundColor [1 1 0] String 'Pierwiastek =' Static Text text3 FontSize 11 FontWeight bold BackGroundColor [1 1 0] Static Text String '' text4 FontSize 11 FontWeight bold Edit Text String '' edit1 FontSize 11 FontWeight bold String 'OBLICZ' Push Button pushbutton1 FontSize 11 FontWeight bold Callback - ustawiona automatycznie 15 Funkcja pushbutton1_callback wywoływana kliknięciem przycisku OBLICZ Przycisk pushbutton1 ma wywołać funkcję która: odczyta tekst wpisany do pola edit1 i przekonwertuje go na liczbę, obliczy pierwiastek z tej liczby, wyświetli wynik w polu text4. Funkcja ta może mieć następującą postać: %------------------------------------------------------------------------------------------------------ function pushbutton1_callback(hobject, eventdata, handles) % hobject - handle to pushbutton1 (see GCBO) % eventdata - reserved - to future version of MATLAB % handles - structure with handles and user data x = str2double(get(handles.edit1,'string')); y = sqrt(x); set(handles.text4,'string',num2str(y)); 16 8
Samodzielne definiowanie nowych klas 17 Definiowanie nowej klasy (klasy użytkownika) Zdefiniowanie nowej klasy wymaga utworzenia nowego folderu dla tej klasy o nazwie: @nazwa_klasy i umieszczeniu w nim m-plików obsługujących tą klasę. Przykład: przed utworzeniem klasy o nazwie Wektor2D tworzymy folder o nazwie : @Wektor2D. Folder ten będzie przeszukiwany przez MATLABa w pierwszej kolejności. 18 9
Definiowanie nowej klasy Zdefiniujmy nową klasę obiektów o nazwie: Wektor2D Tworzymy blok classdef i zapisujemy go do pliku o nazwie takiej jak nazwa klasy, a więc w naszym przypadku Wektor2D.m do foldera @Wektor2D Cechami obiektu klasy Wektor2D - wymienionymi w bloku properties - niech będą współrzędne jego początku oraz końca: Obiekty definiowanej klasy mogą mieć też określone metody czyli methods oraz zdarzenia czyli events 19 Tworzenie obiektu danej klasy Na podstawie definicji klasy można tworzyć wiele obiektów należących do tej klasy i nazywanych czasem instancjami klasy. Zdefiniujmy więc wektor A przez przypisanie mu nazwy klasy: >> A = Wektor2D A = Wektor2D Properties: Xp: [] Yp: [] Xk: [] Yk: [] Methods Odpowiedź Matlaba zaznaczono powyżej kolorem niebieskim. Jak widać cechy nie mają przypisanych wartości. 20 10
Przypisanie wartości CECH - notacja kropkowa Można przypisywać wartości cechom korzystając z notacji kropkowej: nazwa_obiektu. nazwa_cechy = wartość_cechy nazwę cechy poprzedza nazwa obiektu (wektora A) oddzielona kropką: >> A.Xp=0; A.Yp=0; A.Xk=1; A.Yk=1; Teraz sprawdźmy jakie składowe ma wektor A wpisując jego nazwę: >> A A = Wektor2D Properties: Xp: 0 Yp: 0 Xk: 1 Yk: 1 A 1,1 Methods 0,0 21 Definiowanie KONSTRUKTORA klasy Definicja klasy może zawierać definicję specjalnej funkcji (metody) zwanej konstruktorem, a posiadającej nazwę taką samą jak nazwa klasy. Konstruktor pozwala tworzyć obiekty i nadawać wartości cechom obiektu. Oto konstruktor dla klasy Wektor2D umieszczony w bloku methods function obj = Wektor2D(xp, yp, xk, yk) if nargin <4 'Wektor2D([], [], [], [])' else obj.xp=xp; obj.yp=yp; obj.xk=xk; obj.yk=yk; end %if end %-----end_fun 22 11
Wykorzystanie KONSTRUKTORA do tworzenia obiektu Po dodaniu konstruktora do definicji klasy, można tworzyć obiekt o określonych cechach przy pomocy jednego polecenia, na przykład: >> B=Wektor2D(1,1,2,0) B = Wektor2D Properties: Xp: 1 Yp: 1 Xk: 2 Yk: 0 Methods 23 Metody Metody są m-funkcjami, które pobierają obiekt jako jeden z argumentów wejściowych. Obiekt (instancja klasy) może zostać utworzony przez uruchomienie specjalnej metody zwanej konstruktorem i przekazanie do niej odpowiednich argumentów wejściowych. W MATLAB-ie konstruktory mają taką samą nazwę jak klasa. Składnia wywołania metody w przypadku ogólnym ma postać: [out1, out2,...] = nazwa_metody(obiekt, arg1, arg2,...); Niektóre metody, nazywane prywatnymi, mogą być wywoływane wyłącznie przez inne metody swojej klasy - nie można ich wywołać z wiersza poleceń ani z metod innych klas. Metody prywatne są umieszczane w folderze @nazwa_metody\private 24 12
Definiowanie METOD klasy Zdefiniujmy na razie dwie metody: classdef Wektor2D end a) wyznaczanie składowych wektora Dx, Dy, b) wyznaczanie długości wektora. properties Xp, Yp, Xk, Yk end methods function [dx, dy] = skladowe(obj) dx=obj.xk-obj.xp; dy=obj.yk-obj.yp end function Le = dlugosc(obj) [Dx, Dy]= skladowe(obj) Le = sqrt(dx^2+dy^2); end end 25 Wywoływanie metod Metoda dlugosc dla wektora A daje poprawny wynik bo jak wiemy przekątna kwadratu o boku 1 to pierwiastek z 2: >> dlugosc (A) ans = 1.4142 Metoda skladowe nie wyświetli poprawnego wyniku jeśli nie przypomnimy sobie, że trzeba jej wyniki wstawić do dwuelementowego wektora : skladowe(a) ans = 1 >> [Dx, Dy]= skladowe(a) Dx = 1 Dy = 1 26 13
Wywoływanie metod - notacja kropkowa Metody można również wywoływać stosując notację kropkową: >> A.dlugosc ans = 1.4142 >> [p q]=a.skladowe p = 1 q = 1 27 Przedefiniowywanie funkcji i operatorów Każda klasa może definiować, w specyficzny dla swych obiektów sposób, funkcje i operatory istniejące już - pod takimi samymi nazwami - w innych klasach. W naszym przykładzie zdefiniujemy dla klasy Wektor2D dodawanie wektorów, przy pomocy funkcji "plus", mimo, że funkcja "plus" jest już zdefiniowana w Matlabie dla liczb rzeczywistych oraz macierzy i jest także wywoływana przez operator "+". function s = plus(o1,o2) s=wektor2d; s.xp=o1.xp; s.yp=o1.yp; [Dx, Dy]= skladowe(o2); s.xk=o1.xk+dx; s.yk=o1.yk+dy; end %-----fun 28 14
Przedefiniowywanie funkcji i operatorów c.d. Takie przedefiniowywanie istniejących funkcji lub operatorów nazywa się po angielsku "overloading" co jest mylnie tłumaczone na "przeciążanie" a nieco bardziej poprawnie na "przeładowywanie". Sprawdzamy czy metoda dobrze doda nasze wektory: >> C=A+B C = Wektor2D Properties: Xp: 0 Yp: 0 Xk: 2 Yk: 0 Methods A 1,1 B 0,0 C 2,0 29 Dziedziczenie (Inheritance) Dziedziczenie to związek pomiędzy klasami obiektów określający przekazywanie cech (definicji atrybutów, metod, itd.) z klasy bazowej (nadklasy) do jej klas pochodnych (podklas). Np. obiekt klasy Pracownik dziedziczy wszystkie własności (definicje atrybutów, metody) określone w ramach klasy Osoba. Obiekty mogą dziedziczyć od innych obiektów właściwości i sposoby działania. Kiedy jeden obiekt (pochodny) dziedziczy od innego (bazowego), do obiektu pochodnego włączone są wszystkie pola struktury obiektu bazowego i może on używać wszystkich metod obiektu bazowego. Metody obiektu bazowego mają dostęp jedynie do pól, które obiekt pochodny dziedziczy od bazowego. Dzięki dziedziczeniu obiekty klas pochodnych zachowują się dokładnie jak obiekt bazowy, z dodatkowymi rozszerzeniami. 30 15
Hierarchia klas Matlaba Klasy nowo tworzone przez użytkownika wywodzą się z klasy struct czyli struktury stanowiącej n-tkę pól analogicznie jak wiersz w tabeli bazy danych. Pola struktury to cechy obiektu 31 Cechy obiektów danej klasy Każdy obiekt danej klasy może być charakteryzowany n-tką cech podobnie jak w tabeli bazy danych gdzie każdemu obiektowi odpowiada wiersz z zapisem jego cech (zwany rekordem, a w Matlabie strukturą). 32 16