Katalog przekształceń refaktoryzacyjnych cz. I
|
|
- Filip Kruk
- 9 lat temu
- Przeglądów:
Transkrypt
1 cz. I Prowadzący: Bartosz Walter cz. I 1
2 Agenda Szablon przekształcenia refaktoryzacyjnego Przekazywanie parametrów do metod Przekształcenia zmiennych lokalnych Przekształcenia w obrębie metod i pól cz. I (2) Wykład ten jest pierwszym z serii trzech poświęconych prezentacji katalogu przekształceń refaktoryzacyjnych opartego na ksiąŝce M. Fowlera. W tej części zaprezentowane zostaną następujące zagadnienia: szablon refaktoryzacji, czyli wzorzec, według którego kaŝde przekształcenie jest opisywane; grupa przekształceń poświęconych przekazywaniu parametrów do metod, przekształcenia związane ze zmiennymi lokalnymi i tymczasowymi; przekształcenia w obrębie pól i metod w obiekcie. cz. I 2
3 Agenda Szablon przekształcenia refaktoryzacyjnego Przekazywanie parametrów do metod Przekształcenia zmiennych lokalnych Przekształcenia w obrębie metod i pól cz. I (3) Pierwsza część wykładu dotyczy opisu przekształcenia refaktoryzacyjnego. cz. I 3
4 Szablon przekształcenia refaktoryzacyjnego Problem Cel Mechanika cz. I (4) Szablon przekształcenia refaktoryzacyjnego jest odpowiednikiem szablonu wzorca projektowego. Przedstawiony podczas wykładu szablon jest wzorowany na szablonie zastosowanym przez Martina Fowlera w jego katalogu. Ograniczony szablon stosowany podczas niniejszego wykładu składa się z następujących elementów: problemu, jaki przekształcenie próbuje rozwiązać; celu, jaki naleŝy za pomocą przekształcenia osiągnąć; mechaniki, opisującej kolejne kroki, jakie naleŝy podjąć, aby przekształcenie zostało z powodzeniem i poprawnie zakończone; przykładu, który przybliŝa sposób jego przeprowadzenia cz. I 4
5 Szablon przekształcenia refaktoryzacyjnego Problem Metoda wykonuje wiele funkcji Extract Method Cel Wyłączenie części kodu do osobnych metod Mechanika wybierz fragment kodu poszukaj w nim modyfikowanych zmiennych lokalnych utwórz nową metodę i skopiuj do niej wybrany fragment kodu przekaŝ zmienne lokalne do nowej metody jako parametry zastąp stary kod wywołaniem nowej metody skompiluj i przetestuj cz. I (5) Na slajdzie przedstawiony został oparty na szablonie opis przekształcenia refaktoryzacyjnego Extract Method, czyli wyłączenia fragmentu kodu do nowej metody. Dotyczy ono problemu długich, rozbudowanych metod realizujących wiele funkcji. Celem przekształcenia jest wyłączenie części kodu do osobnych, nowoutworzonych metod. Mechanika polega na wybraniu fragmentu kodu, który ma być wyłączony, następnie wyszukaniu w nim modyfikowanych zmiennych lokalnych (zmienne takie przenoszą informacje pomiędzy tym fragmentem kodu a szerszym kontekstem, w jakim ten fragment się znajduje) oraz utworzeniu nowej metody, do której wybrany fragment kodu jest kopiowany. Zmienne lokalne, które zostały zidentyfikowane, są przekazywane do nowej metody jako jej parametry. Wówczas stary kod, który na początku został zaznaczony, moŝe zostać zastąpiony wywołaniem nowej metody. cz. I 5
6 Agenda Szablon przekształcenia refaktoryzacyjnego Przekazywanie parametrów do metod Przekształcenia zmiennych lokalnych Przekształcenia w obrębie metod i pól cz. I (6) Pierwsza grupa przekształceń dotyczy sposobu przekazywania parametrów do metod, ich dodawania i usuwania. cz. I 6
7 Add Parameter Problem Metoda potrzebuje więcej informacji od klienta Cel Dodanie parametru do sygnatury Mechanika sprawdź czy metoda nie jest polimorficzna zadeklaruj nową metodę z dodanym parametrem skopiuj ciało starej metody do nowej skompiluj zmień starą metodę tak, aby delegowała wywołania do nowej skompiluj i przetestuj zastąp wywołania starej metody wywołaniami nowej opcjonalnie: usuń starą metodę skompiluj i przetestuj M. Fowler, 1999 cz. I (7) Przekształcenie Add Parameter dotyczy sytuacji, w której metoda potrzebuje od klienta więcej informacji, niŝ otrzymuje w tej chwili. Zatem konieczne jest przekazanie jej nowego parametru. Mechanika tej refaktoryzacji przebiega w taki sposób, aby maksymalnie wydłuŝyć okres, w którym istnieją jednocześnie dwie wersje metody, dotychczasowa i nowa, z dodanym parametrem. Jest to charakterystyczny sposób postępowania występujący w wielu przekształceniach, pozwala bowiem zapewnić drogę odwrotu w przypadku niepowodzenia. Pierwszym krokiem (poza sprawdzeniem czy metoda jest polimorficzna, co uniemoŝliwiłoby prawidłowe zakończenie przekształcenia) jest stworzenie nowej metody z dodanym parametrem, do której skopiować naleŝy ciało starej metody (warto zauwaŝyć, Ŝe nowy parametr pozostaje w niej niewykorzystany). Następnie naleŝny zmienić starą metodę w ten sposób, aby delegowała przychodzące wywołania do nowej wersji, przekazując dowolną wartość w miejsce nowego parametru. W kolejnym kroku naleŝy zmodyfikować klientów metody, tak aby odwoływali się do nowej wersji metody. Ostatnim etapem moŝe być usunięcie starej metody, o ile nie jest ona potrzebna z innych względów (np. uczestnictwa w interfejsie). cz. I 7
8 void metodaa(int parametr1, List parametr2) { //... ciało metody void metodaa(map parametr0, int parametr1, List parametr2) { //...ciało metody void metodaa(int parametr1, List parametr2) { metodaa(null, parametr1, parametr2); cz. I (8) Jako przykład posłuŝy metodaa(), posiadająca pierwotnie dwa parametry. W trakcie przekształcenia tworzona jest wersja metody z dodatkowym parametrem parametr0, do której delegowane są wywołania z oryginalnej metody. W miejsce dodatkowego parametru przekazywana jest wartość null. cz. I 8
9 Remove Parameter Problem Parametr jest nieuŝywany w ciele metody Cel Usunięcie parametru z sygnatury metody Mechanika sprawdź, czy metoda nie jest polimorficzna zadeklaruj nową metodę bez zbędnego parametru skopiuj ciało starej metody do nowej skompiluj zmień starą metodę, tak aby delegowała wywołania do nowej skompiluj i przetestuj zastąp wywołania starej metody wywołaniami nowej opcjonalnie: usuń starą metodę skompiluj i przetestuj M. Fowler, 1999 cz. I (9) Przekształceniem odwrotnym do poprzedniego jest usunięcie parametru z sygnatury metody. Potrzeba jego wykonania pojawia się, gdy parametr taki jest niewykorzystywany wewnątrz metody. Mechanika przebiega w sposób odwrotny do dodania parametru. Pierwszym krokiem jest sprawdzenie, czy metoda ta nie jest dziedziczona lub pokrywana w innych klasach. Następnie naleŝy zadeklarować nową metodę bez zbędnego parametru i skopiować do niej ciało oryginalnej metody. Kolejnym krokiem jest umieszczenie delegacji z metody oryginalnej do nowej, i kolejne zastępowanie w ten sam sposób odwołań do tej metody, jakie istnieją po stronie klientów. Na koniec równieŝ moŝna usunąć starą metodę. cz. I 9
10 void metodaa(map parametr0, int parametr1, List parametr2) { //... ciało metody void metodaa(map parametr0, int parametr1, List parametr2) { metodaa(parametr1, parametr2) void metodaa(int parametr1, List parametr2) { // ciało metody cz. I (10) polega na usunięciu parametru parametr0 dodanego w wyniku poprzedniego przekształcenia. Metoda metodaa() jest przeciąŝana, tak Ŝe nowa wersja metody jest pozbawiona parametru, a oryginalna wersja deleguje do niej wywołania. W efekcie wszystkie odwołania do starej metody są usunięte i zastąpione odwołaniami do nowej, bez zbędnego parametru. cz. I 10
11 Preserve Whole Object Problem Pola obiektu są osobno przekazywane jako parametry Cel Przekazanie referencji do obiektu zamiast pojedynczych parametrów Mechanika wprowadź obiekt jako nowy parametr metody skompiluj zastąp odwołania do kolejnych parametrów metody wywołaniami odpowiednich metod w obiekcie usuń parametr skompiluj i przetestuj M. Fowler, 1999 cz. I (11) Kolejne trzy przekształcenia słuŝą do ograniczenia liczby parametrów metody. W przypadku tej refaktoryzacji Preserve Whole Object, czyli zachowaniu całego obiektu rozwiązywany przez nią problem polega na przekazywaniu do metody jako oddzielnych parametrów pól lub wyników wykonania metod jednego obiektu. Przekształcenie pozwala zastąpić grupę takich parametrów jednym obiektem będącym ich źródłem. Refaktoryzacja rozpoczyna się od dodania nowego parametru referencji do całego obiektu. Następnie odwołania do parametrów występujące wewnątrz metody są kolejno zastępowane wywołaniami metod lub odwołaniami do pól obiektu nowego parametru. Gdy wszystkie pozostałe parametry staną się bezuŝyteczne, mogą zostać usunięte z klasy. cz. I 11
12 public void wyswietldane(string imie, String nazwisko, String telefon) { System.out.println("Imie: " + imie); System.out.println("Nazwisko: " + nazwisko); System.out.println("Telefon: " + telefon); wyswietldane(p.imie(), p.nazwisko(), p.telefon()); cz. I (12) Jako przykład rozpatrzmy metodę wyswietldane(), przyjmującą trzy parametry: imię, nazwisko i telefon osoby. W praktyce wywołanie tej metody wymaga pobrania tych trzech wartości z obiektu Osoba, zatem wskazane jest stworzenie wersji metody umoŝliwiającej przekazanie tylko referencji do tego obiektu. cz. I 12
13 public void wyswietldane(osoba osoba, String imie, String nazwisko, String telefon) { System.out.println("Imie: " + osoba.imie()); System.out.println("Nazwisko: " + osoba.nazwisko()); System.out.println("Telefon: " + osoba.telefon()); wyswietldane(person, null, null, null); cz. I (13) Pierwszym krokiem jest dodanie do sygnatury metody nowego parametru typu Osoba, a następnie zmiana odwołań do pozostałych parametrów metody wywołaniami odpowiednich metod nowego parametru. Po zakończeniu zmiany wywołanie metody wymaga przekazania instancji klasy Osoba oraz nieznaczących pozostałych wartości parametrów (w tym przypadku wartości null). cz. I 13
14 public void wyswietldane(osoba osoba) { System.out.println("Imie: " + osoba.imie()); System.out.println("Nazwisko: " + osoba.nazwisko()); System.out.println("Telefon: " + osoba.telefon()); wyswietldane(osoba); cz. I (14) Ostatnim krokiem jest usunięcie zbędnych parametrów, zgodnie z mechaniką przekształcenia Remove Parameter. W efekcie przekształcenia grupa parametrów metody została zastąpiona jednym, który jest źródłem tych parameterów. cz. I 14
15 Replace Parameter with Explicit Method Problem Zachowanie metody zaleŝy od wartości jednego z parametrów Cel Utworzenie oddzielnych metod dla kaŝdej wartości parametru Mechanika utwórz osobne metody dla kaŝdej wartości parametru w kaŝdej gałęzi instrukcji warunkowej wywołaj odpowiednią nową metodę skompiluj i przetestuj zastąp wywołania starej metody wywołaniami właściwej nowej metody opcjonalnie: usuń starą metodę M. Fowler, 1999 cz. I (15) Problem rozwiązywany przez to przekształcenie dotyczy metod, których zachowanie zaleŝy od wartości jednego z parametrów. Rozwiązanie polega na utworzeniu osobnych wersji metody dla kaŝdej wartości tego parametru (jeŝeli jest ich kilka) i właściwym ich nazwaniu. Przekształcenie zaczyna się od utworzenia nowych metod, które w nazwach będą zawierały jedną z wartości usuwanego parametru. Następnie z instrukcji warunkowej naleŝy skopiować zawartość właściwej gałęzi, a w jej miejscu umieścić wywołanie nowej metody. Kolejnym krokiem jest aktualizacja klientów, aby korzystali z nowych wersji metod, i usunięcie nieuŝywanej obecnie oryginalnej wersji metody. cz. I 15
16 public double naliczodsetki(typrachunku typ, double kwota) { if (typ == TypRachunku.STUDENT) { // nalicz odsetki dla konta STUDENT else if (typ == TypRachunku.STANDARD) { // nalicz odsetki dla konta STANDARD else if (typ == TypRachunku.SUPER) { // nalicz odsetki dla konta SUPER cz. I (16) Przekształcenie to zostało przedstawione na przykładzie metody naliczodsetki(). Czynność wykonana przez tę metodę zaleŝy od wartości parametru TypRachunku. cz. I 16
17 public double naliczodsetki(typrachunku typ, double kwota) { if (typ == TypRachunku.STUDENT) { naliczodsetkistudent(kwota); else if (typ == TypRachunku.STANDARD) { naliczodsetkistandard(kwota); else if (typ == TypRachunku.SUPER) { naliczodsetkisuper(kwota); public double naliczodsetkistudent(double kwota) { // nalicz odsetki dla konta STUDENT public double naliczodsetkistandard(double kwota) { // nalicz odsetki dla konta STANDARD public double naliczodsetkisuper(double kwota) { // nalicz odsetki dla konta SUPER cz. I (17) W miejsce fragmentów kodu wewnątrz oryginalnej metody umieszczane są wywołania nowoutworzonych metod naliczających odsetki dla kaŝdego typu rachunku osobno. W efekcie przekształcenia metoda posiadająca parametr decydujący o jej zachowaniu została przekształcona w rodzinę metod pozbawionych tego parametru. cz. I 17
18 Replace Parameter with Method Problem Wynik wykonania metody jest parametrem innej metody tego obiektu Cel Obliczenie wartości metody wewnątrz innej metody Mechanika opcjonalnie: wyłącz obliczenie parametru do nowej metody po kolei zastąp odwołania do parametru wywołaniami metody obliczającej go (uwaga na efekty uboczne!) skompiluj i przetestuj wykonaj przekształcenie Remove Parameter na nieuŝywanym parametrze M. Fowler, 1999 cz. I (18) Ostatnim przekształceniem naleŝącym do kategorii związanej z przekształceniami w obrębie sygnatury metody jest zastąpienie parametru wywołaniem metody. Stosuje się je w sytuacjach, gdy wynik wykonania metody staje się parametrem innej metody tego obiektu. Zamiast obliczać tę wartość na zewnątrz metody i przekazywać ją jako parametr, moŝna dokonać niezbędnych obliczeń wewnątrz niej. Przekształcenie rozpoczyna się od wyłączenia polecenia obliczenia wartości parametru do nowej metody (o ile nie jest juŝ obliczany przez dedykowaną metodę). Następnie naleŝy wewnątrz metod zastąpić odwołania do parametru wywołaniami metody, która go oblicza. Trzeba jednak zwrócić uwagę na potencjalne efekty uboczne, związane z wielokrotnym obliczaniem wartości parametru (np. jeŝeli obliczanie tej wartości modyfikuje jakąś zmienną). W ostatnim kroku nieuŝywany parametr moŝe zostać usunięty. cz. I 18
19 double kara = dnispoznienia * kosztzadzien; double obnizka = obnizkakary(); double karakoncowa = dozaplaty(kara, obnizka); double kara = dnispoznienia * kosztzadzien; double karakoncowa = dozaplaty(kara); public double dozaplaty(double kara) { double obnizka = obnizkakary(); // dalsze obliczenia cz. I (19) Na przykład, na kwotę opłaty karnej za nieterminowy zwrot ksiąŝek do biblioteki składa się kilka elementów: czas spóźnienia, koszt za jeden dzień i ewentualna obniŝka. Metoda obliczająca tę wartość, dozaplaty(), przyjmuje dwa parametry: wysokość naliczonej kary i wysokość obniŝki, będącej efektem wykonania innej metody. Po przekształceniu metoda dozaplaty() przyjmuje tylko jeden parametr, poniewaŝ pozostałe waŝne dla siebie informacje moŝe zdobyć samodzielnie. Dzięki temu przekształceniu udało się usunąć niepotrzebny parametr poprzez obliczenie jego wartości wewnątrz metody. cz. I 19
20 Agenda 1. Szablon przekształcenia refaktoryzacyjnego 2. Przekazywanie parametrów do metod 3. Przekształcenia zmiennych lokalnych 4. Przekształcenia w obrębie metod i pól cz. I (20) Druga grupa przekształceń dotyczy zmiennych lokalnych. Stanowią one istotny problem dla wielu przekształceń, np. Extract Method, poniewaŝ wymagają przekazywania ich w postaci parametrów, co niepotrzebnie zwiększa stopień powiązań między metodami. cz. I 20
21 Inline Temp Problem Tymczasowa zmienna przechowuje wynik prostego wyraŝenia Cel Zastąpienie zmiennej kaŝdorazowym obliczeniem wyraŝenia Mechanika oznacz zmienną jako sfinalizowaną kolejno zastąp odwołania do zmiennej obliczeniem wartości wyraŝenia skompiluj i przetestuj (uwaga na efekty uboczne!) usuń deklarację zmiennej tymczasowej skompiluj M. Fowler, 1999 cz. I (21) Pierwsze przekształcenie było wcześniej omawiane podczas dyskusji na temat skutków ubocznych niektórych refaktoryzacji. SłuŜy ono do zastąpienia zmiennej lokalnej uŝytej w prostym obliczeniu, którego wynik jest przechowywany w zmiennej lokalnej, wyraŝeniem obliczającym jej wartość. Pierwszym krokiem przekształcenia jest zadeklarowanie zmiennej jako sfinalizowanej, co zapobiega wielokrotnemu przypisywaniu wartości do niej. Następnie naleŝy kolejno zastąpić odwołania do zmiennej obliczeniem wartości wyraŝenia, testując po kaŝdej zmianie. Po zakończeniu tego etapu moŝna z klasy usunąć deklarację zmiennej lokalnej. cz. I 21
22 StringTokenizer st = new StringTokenizer( "ala ma kota a kot ma alę", " "); String token = st.next(); System.out.println("Token = " + token); System.out.println("Token = " + token); StringTokenizer st = new StringTokenizer( "ala ma kota a kot ma alę", " "); System.out.println("Token = " + st.next()); System.out.println("Token = " + st.next()); cz. I (22) em błędnego przeprowadzenia takiej zmiany jest następujący fragment kodu. Dotyczy on obiektu StringTokenizer, dzielącego napisy na wyrazy i zwracającego je w postaci pojedynczych tokenów. Zamiast zapamiętywania wartości metody st.next() po przekształceniu metoda ta jest wywoływana w kaŝdym miejscu, w którym dotychczas następowało odwołanie do zmiennej. Jednak takie przekształcenie wprowadza błąd do programu, poniewaŝ metoda st.next(), która zmienia stan obiektu StringTokenizer, zostanie obecnie wywołana wielokrotnie, co wpłynie na zwracane przez nią wartości. Dlatego w przypadku tego przekształcenia naleŝy zwrócić szczególną uwagę na problem efektów ubocznych. cz. I 22
23 Introduce Explaining Variable Problem Obliczane wyraŝenie jest długie i złoŝone Cel Podzielenie wyraŝenia na zmienne tymczasowe Mechanika stwórz sfinalizowaną zmienną i przypisz do niej wartość części wyraŝenia oryginalnego zastąp fragment wyraŝenia oryginalnego odwołaniem do nowej zmiennej skompiluj M. Fowler, 1999 cz. I (23) To przekształcenie jest dość proste i intuicyjne. Gdy wyraŝenie jest długie, złoŝone i nieczytelne, moŝna podzielić je na mniejsze fragmenty i ich wartości zapamiętać w zmiennych tymczasowych. Refaktoryzacja rozpoczyna się od stworzenia sfinalizowanej zmiennej i przypisania do niej wartości wybranego fragmentu wyraŝenia. Następnie fragment ten w oryginalnym wyraŝeniu jest zastępowany odwołaniem do nowej zmiennej. PoniewaŜ zmienna ta z załoŝenia jest wykorzystana tylko raz, dlatego efekty uboczne podczas tego przekształcenia nie występują. cz. I 23
24 if (konto.jestotwarte() && konto.saldo() > 3000 &&!konto.kredyt()) { // otwórz kredyt boolean otwarte = konto.jestotwarte(); boolean saldopowyzej3000 = konto.saldo() > 3000; bolean makredyt = konto.kredyt(); if (otwarte && saldopowyzej3000 &&!makredyt){ // otwórz kredyt cz. I (24) em jest warunek uzaleŝniający otwarcie kredytu posiadaniem otwartego konta, stanem salda przekraczającym 3000 PLN oraz brakiem innego otwartego kredytu. To wyraŝenie jest dość złoŝone, dlatego moŝna podzielić je na mniejsze fragmenty i zapamiętać ich wartości w nowych zmiennych lokalnych. Zapis wyraŝenia oryginalnego stał się zatem znacznie prostszy. W efekcie przekształcenia fragmenty wyraŝenia zostały wydzielone do zmiennych lokalnych. Jednak zmienne te utrudniają dalsze operacje na metodzie (m.in. jej podział), dlatego będą musiały być w kolejnych refaktoryzacjach przekształcane do postaci metod. cz. I 24
25 Replace Temp with Query Problem Zmienna tymczasowa uniemoŝliwia uproszczenie kodu Cel Zastąpienie zmiennej metodą obliczającą jej wartość Mechanika oznacz zmienną jako sfinalizowaną skompiluj zastosuj Extract Method wobec wyraŝenia będącego wartością zmiennej przypisz zmiennej wartość utworzonej metody skompiluj i przetestuj usuń zmienną stosując Inline Temp M. Fowler, 1999 cz. I (25) Pierwszym krokiem do tego celu jest zastąpienie zmiennej metodą obliczającą jej wartość. Podobnie jak w wielu innych operacjach na zmiennych lokalnych, pierwszym zadaniem jest zadeklarowanie zmiennej jako sfinalizowanej. Następnie wobec wyraŝenia będącego wartością zmiennej naleŝy wykonać przekształcenie Extract Method, a wynik nowej metody przypisać do zmiennej. W ostatnim etapie zmienna ta moŝe zostać usunięta za pomocą przekształcenia Inline Temp. cz. I 25
26 boolean otwarte = konto.jestotwarte(); boolean saldopowyzej3000 = konto.saldo() > 3000; boolean makredyt = konto.kredyt(); if (otwarte && saldopowyzej3000 &&!makredyt){ // otwórz kredyt cz. I (26) zaczyna się od momentu zakończenia poprzedniego przekształcenia: wyraŝenie jest zbudowane ze zmiennych lokalnych. cz. I 26
27 private boolean otwarte() { return konto.jestotwarte(); private boolean saldopowyzej3000() { return konto.saldo() > 3000; private boolean makredyt() { return konto.kredyt(); if (otwarte() && saldopowyzej3000() &&!makredyt()){ // otwórz kredyt cz. I (27) KaŜda z tych zmiennych jest przekształcana w metodę o tym samym typie, która zwraca tę samą wartość. W efekcie w wyraŝeniu zamiast zmiennych pojawiają się metody, które nie utrudniają w takim stopniu dalszych operacji refaktoryzacyjnych. cz. I 27
28 Split Temporary Variable Problem Zmienna lokalna jest wielokrotnie uŝywana w róŝnych celach Cel Utworzenie nowej zmiennej dla kaŝdego przypisania wartości Mechanika oznacz zmienną jako sfinalizowaną przy pomocy kompilatora znajdź kolejne przypisania do zmiennej zadeklaruj nową zmienną sfinalizowaną o intuicyjnej nazwie dla kaŝdego przypisania skompiluj i przetestuj M. Fowler, 1999 cz. I (28) To przekształcenie dotyczy problemu wielokrotnego uŝycia zmiennych lokalnych do przechowywania nie związanych ze sobą danych. W efekcie nazwa uŝytej w ten sposób zmiennej nie oznacza juŝ swego pierwotnego przeznaczenia, co pogarsza czytelność i obniŝa zrozumienie kodu. Celem refaktoryzacji jest podział jej na nowe zmienne, tak aby przypisanie wartości zawsze dotyczyło nowej zmiennej lokalnej. Przekształcenie jest realizowane przy istotnym wsparciu ze strony kompilatora. Pierwszym krokiem jest zadeklarowanie zmiennej jako sfinalizowanej. To powoduje, Ŝe próba kompilacji automatycznie wskazuje miejsce ponownego przypisania wartości do tej zmiennej. W tym miejscu naleŝy zadeklarować nową zmienną o nazwie odpowiadającej jej przeznaczeniu, i kontynuować pracę aŝ do usunięcia wszystkich przypisań. cz. I 28
29 double saldo = konto.saldo(); //... saldo = oplata1; //... saldo = oplata1 + oplata2; final double saldo = konto.saldo(); //... final double oplata1 = oplata1() * 1.1; //... final double sumaoplat = oplata1() + oplata2(); cz. I (29) Przedstawiona na przykładzie zmienna saldo przechowuje kilka róŝnych wartości. W efekcie przekształcenia jest ona rozbita na kilka innych zmiennych, do których przypisania następują tylko raz. Oczywiście, przekształcenie to zwiększa liczbę zmiennych lokalnych, jednak moŝna je w dalszej części refaktoryzacji usunąć, stosując m.in. przekształcenie Replace Temp with Query. Dzięki wykonaniu przekształcenia kaŝda zmienna lokalna ma przypisaną wartość tylko raz. cz. I 29
30 Agenda 1. Szablon przekształcenia refaktoryzacyjnego 2. Przekazywanie parametrów do metod 3. Przekształcenia zmiennych lokalnych 4. Przekształcenia w obrębie metod i pól cz. I (30) Ostatnia, najobszerniejsza grupa przekształceń obejmuje refaktoryzacje wykonywane na poziomie pól i metod wewnątrz klasy. cz. I 30
31 Inline Method Problem Metoda wykonuje proste obliczenie Cel Zastąpienie wywołania metody jej ciałem Mechanika sprawdź czy metoda nie jest polimorficzna i rekurencyjna sprawdź czy metoda ma więcej niŝ jedno miejsce powrotu po kolei zastąp wszystkie wywołania metody jej ciałem skompiluj i przetestuj usuń metodę M. Fowler, 1999 cz. I (31) Najprostszym przekształceniem jest komplementarne do Extract Method rozwinięcie metody, tzn. zastąpienie wywołania metody jej ciałem. Dzięki temu metody wykonujące proste obliczenia, które nie zasługują na umieszczenie w metodzie, mogą zostać usunięte. Podobnie jak w wielu innych przekształceniach związanych z metodami, najpierw naleŝy upewnić się, Ŝe metoda nie jest polimorficznie pokrywana. Dodatkowym warunkiem jest brak jej rekurencyjnych wywołań, które uniemoŝliwiają (lub bardzo utrudniają) prawidłowe zakończenie refaktoryzacji, oraz jedno miejsce powrotu z metody (choć w niektórych przypadkach wielokrotne instrukcje return mogą zostać zastąpione operatorem trójargumentowym). Dalsza część polega na kolejnym zastępowaniu wywołań ciałem metody oraz kaŝdorazowym testowaniu przekształcanego fragmentu. Ostatnim krokiem jest usunięcie zbędnej metody. cz. I 31
32 Kredyt kredyt = null; private boolean makredyt() { return kredyt!= null; if (!makredyt()){ // otwórz kredyt if (! (kredyt!= null)){ // otwórz kredyt cz. I (32) em moŝe być prosta metoda makredyt(), która określa, czy zmienna kredyt została zainicjowana, czy nie. Przekształcenie powoduje zastąpienie wywołania takiej metody jej ciałem. MoŜe to prowadzić do pogorszenia czytelności kodu, dlatego stosowanie tego przekształcenia powinno być dobrze uzasadnione. cz. I 32
33 Encapsulate Downcast Problem Metoda zwraca wynik wymagający rzutowania przez klienta Cel Przesunięcie rzutowania do wewnątrz metody Mechanika znajdź wszystkie przypadki rzutowania wyniku metody przesuń rzutowanie do najbardziej ogólnego typu do wnętrza metody M. Fowler, 1999 cz. I (33) Przekształcenie to jest prostym mechanizmem hermetyzacji, który pozwala ograniczyć problemy związane z rzutowaniem klas. Występują one jednak tylko w niektórych językach o statycznym systemie typów, dlatego znaczenie tej refaktoryzacji jest ograniczone. Problem rozwiązywany przez nie dotyczy konieczności rzutowania wyniku metody przez klienta, i zwykle jest związany z operacjami na kolekcjach. Rozwiązaniem jest przesunięcie rzutowania do wewnątrz metody. cz. I 33
34 public class Ksiazka { private List wypozyczenia; public Object ostatniewypozyczenie() { return wypozyczenia.lastelement(); Rekord ostatni = (Rekord) lecture.ostatniewypozyczenie(); cz. I (34) owa klasa KsiąŜka przechowuje listę z informacjami (typu Rekord) o jej wypoŝyczeniach. Metoda ostatniewypozyczenie() zwraca ostatni rekord tej listy. Jednak deklarowany typ tej metody jest zbyt ogólny i wymaga od klienta rzutowania, co moŝe spowodować zgłoszenie wyjątku. cz. I 34
35 public class Ksiazka { List wypozyczenia; Rekord ostatniewypozyczenie() { return (Rekord) wypozyczenia.lastelement(); public class Ksiazka { // JDK 5.0+ List<Rekord> wypozyczenia; Rekord ostatniewypozyczenie() { return wypozyczenia.lastelement(); cz. I (35) Dlatego konieczne jest usunięcie rzutowania wykonywanego przez klientów. W pierwszym z moŝliwych rozwiązań operacja rzutowania zostaje przesunięta do wewnątrz metody, dzięki czemu klient otrzymuje obiekt z właściwą informacją o jego typie. Drugie rozwiązanie wykorzystuje mechanizm typów generycznych, obecny w Javie od wersji 5.0. Lista wypoŝyczeń została sparametryzowana klasą Rekord, co usuwa konieczność przeprowadzania rzutowania. cz. I 35
36 Self-Encapsulate Field Problem Obliczanie wartości pola wymaga pokrycia w klasach potomnych Cel Przeniesienie dostępu do pola do metod set/get Mechanika utwórz niepubliczną parę metod set/get zastąp odwołania do pola wywołaniami odpowiedniej metody oznacz pole jako prywatne skompiluj M. Fowler, 1999 cz. I (36) Fowler wyróŝnił dwa przekształcenia dotyczące hermetyzacji pól, w zaleŝności od celu ich stosowania. W pierwszym przypadku jest on związany z koniecznością zmiany sposobu odczytywania wartości pola w podklasach. PoniewaŜ pola nie są polimorficzne, dlatego konieczne jest hermetyzowanie ich poprzez metody get/set. Mechanika jest intuicyjnie prosta: naleŝy utworzyć parę metod get/set i zadeklarować w nich niepubliczny poziom widoczności (poniewaŝ uŝytkownikami tych metod mają być podklasy, a nie klasy dostępne w inny sposób). Następnie odwołania do pola występujące w podklasach naleŝy zastąpić wywołaniami metod get/set i zadeklarować pole jako prywatne. cz. I 36
37 Encapsulate Field Problem Pole ma dostęp publiczny Cel Zastąpienie dostępu do pola metodami set/get Mechanika utwórz publiczną parę metod set/get zastąp odwołania do pola wywołaniami odpowiedniej metody oznacz pole jako prywatne skompiluj M. Fowler, 1999 cz. I (37) Celem drugiego przekształcenia jest hermetyzacja dostępu wobec zewnętrznych klientów klasy. Mechanika przekształcenia jest identyczna, z tą róŝnicą, Ŝe metody get/set są zadeklarowane jako publiczne. cz. I 37
38 Encapsulate Collection Problem Metoda get() w klasie właściciela zwraca kolekcję dostępną do modyfikacji Cel Przeniesienie odpowiedzialności za kolekcję do jej właściciela M. Fowler, 1999 Mechanika dodaj w klasie właściciela metody add() i remove() dla kolekcji zmień bezpośrednie odwołania do metod add() i remove() kolekcji odwołaniami do metod jej właściciela zmień metodę get() zwracającą kolekcję, tak aby zwracała jej widok tylko do odczytu skompiluj i przetestuj opcjonalnie: zmień metodę get() tak, aby zwracała Iterator cz. I (38) Problem rozwiązywany przez to przekształcenie został juŝ omówiony w zarysie podczas pierwszego wykładu. Polega on na udostępnieniu do modyfikacji kolekcji poza kontrolą jej właściciela. Właściciel, poprzez metodę typu get(), przekazuje klientom referencję do kolekcji, która następnie moŝe być swobodnie modyfikowana. Celem przekształcenia jest przeniesienie odpowiedzialności za modyfikację kolekcji z niej samej do jej właściciela. Refaktoryzacja rozpoczyna się od zdefiniowania w klasie właściciela metod add() i remove() dla elementów kolekcji, a następnie przeniesienie wywołań metod kolekcji do nowo utworzonych metod w klasie jej właściciela. Drugim krokiem jest zmiana metody zwracającej referencję do kolekcji w taki sposób, aby nie pozwalała ona na modyfikację tej kolekcji. Istnieje kilka moŝliwych rozwiązań: uŝycie specjalizowanego opakowania kolekcji (zob. wzorzec Decorator), który uniemoŝliwi jej modyfikację (omówionego podczas wykładu nt. kolekcji w języku Java), lub po prostu zwrócenie jej kopii. cz. I 38
39 public class Student { Collection wyklady; public Collection wyklady() { return wyklady; cz. I (39) przekształcenia zostanie zaprezentowany na klasie Student, która posiada kolekcję wykładów, na które on uczęszcza. Kolekcja ta jest udostępniona poprzez metodę wyklady(). cz. I 39
40 public class Student { Collection wyklady; public boolean dodajwyklad(wyklad w) { return wyklady.add(w); public boolean usunwyklad(wyklad w) { return wyklady.remove (w); public Collection wyklady() { return Collections.unmodifiableCollection(wyklady); cz. I (40) Po wykonaniu przekształcenia w klasie zaszły trzy zmiany: pojawiły się metody dodajwyklad() i usunwyklad(), które słuŝą do kontrolowanego modyfikowania kolekcji wykładów, natomiast metoda wyklady() zwraca niemodyfikowalną wersję tej kolekcji. W efekcie wszelkie zmiany w kolekcji mogą być dokonane jedynie poprzez obiekt jej właściciela, a odczyt kolekcji jest moŝliwy z wykorzystaniem dotychczasowej metody wyklady(). cz. I 40
41 Move Field Problem Pole jest częściej uŝywane przez obcą klasę niŝ przez własną Cel Przesunięcie pola do właściwej klasy Mechanika wykonaj Encapsulate Field utwórz identyczne pole z metodami set/get w docelowej klasie skompiluj klasę docelową zmień metody set/get w klasie źródłowej, aby delegowały do klasy docelowej skompiluj i przetestuj usuń pole w klasie źródłowej M. Fowler, 1999 cz. I (41) Przeniesienie pola jest przekształceniem dotyczącym dwóch klas związanych ze sobą relacją asocjacji, agregacji lub kompozycji (ale nie dziedziczenia). Wykonuje się je w sytuacji, gdy pole to jest częściej uŝywane przez obcą klasę niŝ przez klasę macierzystą. Celem jest zatem zwiększenie spójności klas poprzez przeniesienie go do właściwej klasy. Pierwszym krokiem jest hermetyzacja pola i udostępnienie metod dostępu do niego get/set (zob. przekształcenie Encapsulate Field). Następnie naleŝy utworzyć identyczne pole wraz z metodami dostępu w klasie docelowej. W tym momencie naleŝy zmienić metody set/get w klasie oryginalnej, tak aby wywoływały ich odpowiedniki w klasie docelowej. NieuŜywane pole w klasie źródłowej moŝe zostać w tym momencie usunięte. Warto zwrócić uwagę, Ŝe po przekształceniu do pola moŝna odwołać się zarówno z klasy źródłowej, jak i klasy docelowej, co pozwala na elastyczne dostosowanie klientów do nowego połoŝenia pola. W pewien sposób pozwala to takŝe ukryć strukturę tych dwóch klas, jednak z drugiej strony rozmywa nieco ich odpowiedzialność oraz wiąŝe je silną zaleŝnością. cz. I 41
42 Move Method Problem Metoda korzysta częściej z metod w obcej klasie niŝ z własnych Cel Przesunięcie metody do właściwej klasy Mechanika sprawdź, czy metoda nie jest polimorficzna w obu klasach zadeklaruj metodę w klasie docelowej skopiuj ciało metody do klasy docelowej skompiluj klasę docelową zmień metodę źródłową w delegację do metody w klasie docelowej skompiluj i przetestuj M. Fowler, 1999 cz. I (42) Przekształcenie polegające na przeniesieniu metody równieŝ dotyczy dwóch klas związanych inaczej niŝ poprzez dziedziczenie. JeŜeli metoda częściej odwołuje się do metod obcej klasy (jest to oznaka przykrego zapachu Feature Envy), wówczas powinna być przeniesiona do innej klasy. Refaktoryzacja ta jest szczególnym przypadkiem przekształcenia Move Field, poniewaŝ pomija krok związany z hermetyzacją pola. Dodatkowo naleŝy zwrócić uwagę, czy przenoszona metoda nie jest wykorzystywana polimorficznie, co uniemoŝliwiłoby usunięcie jej w klasie źródłowej. cz. I 42
43 Inline Class Problem Odpowiedzialność klasy jest zbyt mała Cel Wchłonięcie klasy przez jej klienta Mechanika przenieś metody klasy źródłowej do jej klienta zmień metody w klasie źródłowej, tak aby delegowały wywołania do klienta zmień innych klientów, tak aby odwoływali się do nowej klasy skompiluj i przetestuj wykonaj Move Field usuń klasę źródłową M. Fowler, 1999 cz. I (43) Przekształcenie Inline Class słuŝy do usunięcia klas, których odpowiedzialność jest zbyt mała, Ŝeby uzasadniała ich istnienie. Usunięcie odbywa się poprzez wchłonięcie klasy przez klienta związanego z nią relacją asocjacji. Mechanika polega na wykonywaniu przekształceń Move Method i Move Field do momentu otrzymania pustej klasy źródłowej, którą moŝna usunąć. cz. I 43
44 public class Czytelnik { private KartaCzytelnicza karta; private String nazwisko; public String nazwisko() { return nazwisko; public KartaCzytelnicza kartaczytelnicza() { return karta; public class KartaCzytelnicza { // do usunięcia private String numer; Czytelnik nazwisko : String Karta czytelnicza numer : String public void ustawnumer(string numer) { this.numer = numer; public String numer() { return numer; cz. I (44) em takiej klasy jest KartaCzytelnicza, która jest własnością Czytelnika. Odpowiedzialność Karty Czytelniczej jest ograniczona tylko do przechowywania swojego numeru, dlatego zadanie to moŝna przenieść na klasę Czytelnik, a Kartę Czytelniczą usunąć. cz. I 44
45 public class Czytelnik { private KartaCzytelnicza karta; private String nazwisko; public String nazwisko() { return nazwisko; public KartaCzytelnicza kartaczytelnicza() { return karta; public void ustawnumer(string numer) { karta.ustawnumer(numer); public String numer() { return karta.numer(); Czytelnik nazwisko : String numer() nadajnumer() Karta czytelnicza numer : String cz. I (45) Pierwszy krok polega na stworzeniu w klasie Czytelnik metod, które odpowiadają metodom klasy Karta Czytelnicza, i są do niej delegowane. Dzięki temu moŝna zaktualizować inne klasy klientów, aby odwoływały się do numeru karty z poziomu karty Czytelnik. cz. I 45
46 public class Czytelnik { private KartaCzytelnicza karta; private String nazwisko; private String numer; public String nazwisko() { return nazwisko; public KartaCzytelnicza kartaczytelnicza() { return karta; public void ustawnumer(string numer) { this.numer = numer; public String numer() { return numer; Czytelnik nazwisko : String numer : String numer() nadajnumer() Karta czytelnicza public class KartaCzytelnicza { // pusta do usunięcia cz. I (46) Kolejnym krokiem jest przeniesienie pola numer i usunięcie delegacji do jego metod dostępowych w klasie KartaCzytelnicza. W ten sposób pole i metody w tej klasie stają się nieuŝywane i mogą zostać usunięte. cz. I 46
47 public class Czytelnik { private String nazwisko; private String numer; public String nazwisko() { return nazwisko; public KartaCzytelnicza kartaczytelnicza() { return karta; public void ustawnumer(string numer) { this.numer = numer; public String numer() { return numer; Czytelnik nazwisko : String numer : String numer() nadajnumer() cz. I (47) W efekcie przekształcenia klasa Czytelnik w pełni przejmuje odpowiedzialność klasy Karta Czytelnicza, która zostaje usunięta z systemu. cz. I 47
48 Replace Method with Method Object Problem Długa metoda posiada zbyt wiele zmiennych, aby ją podzielić Cel Zamiana metody w obiekt z jedną metodą M. Fowler, 1999 Mechanika utwórz nową klasę utwórz w nowej klasie sfinalizowane pole typu klasy oryginalnej utwórz w nowej klasie konstruktor z pierwszym parametrem typu klasy oryginalnej. wykonaj Move Method skompiluj poprzedź wywołanie starej metody utworzeniem obiektu podziel metodę w nowej klasie (zmienne i parametry = pola) cz. I (48) Przekształcenie to jest silnie związane z problemem zmiennych tymczasowych. Dotychczas podstawowym sposobem radzenia sobie z długimi metodami był ich podział poprzez wydzielanie nowych metod. Czasem jednak metoda posiada tyle zmiennych lokalnych, Ŝe ich przekazywanie do nowych metod jest w zasadzie niemoŝliwe. Celem tego przekształcenia jest zmiana metody w obiekt, który umoŝliwi podział jej na mniejsze jednostki. Pierwszym krokiem przekształcenia jest utworzenie nowej klasy, która będzie posiadała referencję do klasy oryginalnej (zatem konieczne jest utworzenie w niej pola odpowiedniego typu i konstruktora inicjującego to pole). Kolejną czynnością jest przeniesienie metody do nowego obiektu, a następnie z jej parametrów i zmiennych lokalnych utworzenie pól tego obiektu. Ten krok pozwala na usunięcie wszystkich zaleŝności, które uniemoŝliwiały podział metody. W tym momencie wszystkie wywołania oryginalnej metody muszą zostać zastąpione utworzeniem obiektu nowej klasy i wywołaniem metody na tym obiekcie. Dzięki tej operacji metoda o duŝej złoŝoności moŝe być podzielona na mniejsze metody bez konieczności przekazywania im wszystkich zmiennych lokalnych. cz. I 48
49 public class Czytelnik { //... public double aktywnoscczyt(int wiek, int czas, int liczba){ double podstawowa = (wiek czas) * liczba * wspolczynnik(); double wtorna = (czas * liczba * 1.05) / srednia(); return podstawowa + wtorna; cz. I (49) Jako przykład prześledźmy klasę Czytelnik, która definiuje metodę aktywnoscczyt(). Posiada ona trzy parametry i definiuje trzy kolejne zmienne lokalne. W tej postaci podział tej metody jest niemoŝliwy. cz. I 49
50 public class Aktywnosc { Czytelnik czytelnik int wiek; int czas; int liczba; double podstawowa; double wtorna; public Aktywnosc(Czytelnik cz, int w, int c, int l) { czytelnik = cz; wiek = w; czas = c; liczba = l; public double oblicz() { podstawowa = (wiek czas) * liczba * wspolczynnik(); wtorna = (czas * liczba * 1.05) / srednia(); return podstawowa + wtorna; cz. I (50) Zmiana polega na utworzeniu nowej klasy Aktywność, zawierającej pola odpowiadające parametrom i zmiennym lokalnym tej metody, oraz definiującej jedno pole będące referencją do klasy, która była właścicielem modyfikowanej metody. Konstruktor inicjuje pola, dzięki czemu sama metoda oblicz() nie posiada Ŝadnych parametrów i nie definiuje zmiennych lokalnych, zatem moŝe zostać podzielona na mniejsze metody. cz. I 50
51 public class Czytelnik { //... public double aktywnoscczyt(int wiek, int czas, int liczba){ Aktywnosc aktywnosc = new Aktywnosc(this, wiek, czas, liczba); return aktywnosc.oblicz(); cz. I (51) Wywołanie oryginalnej metody jest teraz rozszerzone o utworzenie obiektu klasy Aktywność, której przekazywane są niezbędne parametry. cz. I 51
52 Form Template Method Problem Metody w podklasach wykonują podobną sekwencję kroków Cel Ujednolić kroki i umieść ich wywołania w szablonie metody Mechanika podziel metody, aŝ będą identyczne lub całkowicie róŝne identyczne metody przenieś do nadklasy róŝne metody pozostaw w podklasach, ujednolicając ich sygnatury utwórz w nadklasie abstrakcyjne metody dla metod róŝniących się w podklasach utwórz w nadklasie szablon metody, składający się z wywołań metod skompiluj i przetestuj M. Fowler, 1999 cz. I (52) Ostatnie przekształcenie z tej grupy dotyczy zaimplementowania w kodzie wzorca Template Method. Stosuje się je wówczas, gdy metody w klasach dziedziczących po wspólnej nadklasie wykonują podobną sekwencję kroków. Celem tej refaktoryzacji jest ujednolicenie wykonywanych kroków w postaci metod i umieszczenie ich wywołania w szablonie metody. Przekształcenie rozpoczyna się od modyfikacji metod w podklasach. Za pomocą przekształceń na poziomie metody (Extract Method, Inline Temp etc.) naleŝy doprowadzić do sytuacji, w której odpowiadające sobie metody w podklasach (o tych samych sygnaturach) będą albo identyczne bądź całkowicie róŝne. Metody róŝne naleŝy pozostawić w podklasach i utworzyć dla nich metodę abstrakcyjną w nadklasie, którą będą pokrywać. Metody identyczne mogą zostać w całości przeniesione do nadklasy. W nadklasie moŝna wówczas skonstruować szablon metody, składający się z wywołań metod identycznych lub abstrakcyjnych metod, które w podklasach zostały zaimplementowane w róŝny sposób. cz. I 52
53 public class Taryfa1 { public double obliczkwote() { double abonament = 42; double impulsy = 0.35 * liczbaimpulsow; return abonament + liczbaimpulsow; public class Taryfa2 { public double obliczkwote() { double abonament = 65; double impulsy = 0.30 * liczbaimpulsow; return abonament + liczbaimpulsow; cz. I (53) em takiego przekształcenia będą obiekty Taryfa1 i Taryfa2, reprezentujące plany abonamentowe operatora telekomunikacyjnego. W obu przypadkach kwota do zapłacenia składa się z abonamentu oraz opłaty za przeprowadzone rozmowy, zaleŝnej od liczby impulsów. cz. I 53
54 abstract class Taryfa { public double obliczkwote(int liczbaimpulsow) { return abonament() + impulsy(); abstract double abonament(); abstract double impulsy(int liczbaimpulsow); public class Taryfa1 extends Taryfa { public double abonament() { return 42.0; public double impulsy(int liczbaimpulsow) { return 0.35 * liczbaimpulsow; public class Taryfa2 extends Taryfa { public double abonament() { return 65.0; public double impulsy(int liczbaimpulsow) { return 0.30 * liczbaimpulsow; cz. I (54) W efekcie przekształcenia powstała nadklasa o nazwie Taryfa, która deklaruje abstrakcyjne metody abonament() oraz implusy(), a takŝe posiada definicję metody-szablonu pod nazwą obliczkwotę(). Metoda ta zwraca wynik będący sumą wyników metod abonament() oraz implusy(), pomimo faktu, Ŝe są one w tej klasie zadeklarowane jako abstrakcyjne. Ich definicje są zawarte w podklasach Taryfa1 i Taryfa2. Utworzenie instancji jednej z tych podklas pozwala obliczyć wysokość kwoty do zapłaty za pomocą odziedziczonej metody obliczkwotę(), jednak wartość ta zaleŝy od implementacji metod w podklasie. W tym przypadku obie metody naleŝały do kategorii metod róŝnych od siebie. W przypadku metody identycznej dla wszystkich podklas moŝliwe byłoby przeniesienie jej w całości do nadklasy. cz. I 54
55 c.d.n. Dalsza część przekształceń refaktoryzacyjnych zostanie przedstawiona na kolejnym wykładzie cz. I (55) Dalsza część katalogu zostanie przedstawiona podczas kolejnego wykładu. cz. I 55
Dziedziczenie jednobazowe, poliformizm
Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie jednobazowe 2. Polimorfizm część pierwsza 3. Polimorfizm część druga Zofia Kruczkiewicz, ETE8305_6 1 Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie
Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018
Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy
Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.
Dziedziczenie Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasy Student oraz Pracownik: class Student class Pracownik
Polimorfizm, metody wirtualne i klasy abstrakcyjne
Programowanie obiektowe Polimorfizm, metody wirtualne i klasy abstrakcyjne Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Polimorfizm,
Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.
Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody
TEMAT : KLASY DZIEDZICZENIE
TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą
Wykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
Wykład 4: Klasy i Metody
Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to
Polimorfizm. dr Jarosław Skaruz
Polimorfizm dr Jarosław Skaruz http://jareks.ii.uph.edu.pl jaroslaw@skaruz.com O czym będzie? finalne składowe klasy abstrakcyjne interfejsy polimorfizm Finalne składowe Domyślnie wszystkie pola i metody
Dokumentacja do API Javy.
Dokumentacja do API Javy http://java.sun.com/j2se/1.5.0/docs/api/ Klasy i obiekty Klasa jest to struktura zawierająca dane (pola), oraz funkcje operujące na tych danych (metody). Klasa jest rodzajem szablonu
dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy
PODSTAWOWE ELEMENTY JĘZYKA JAVA TYPY DANYCH, OPERATORY I INSTRUKCJE 1. Definicja klasy, dziedziczenie, implementowanie metod interfejsów class nazwa_klasy //ciało klasy Klasa: przed słowem class moŝe wystąpić
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? a) konstruktor b) referencje c) destruktor d) typy 2. Które z poniższych wyrażeń są poprawne dla klasy o nazwie
Diagramy klas. dr Jarosław Skaruz http://ii3.uph.edu.pl/~jareks jaroslaw@skaruz.com
Diagramy klas dr Jarosław Skaruz http://ii3.uph.edu.pl/~jareks jaroslaw@skaruz.com O czym będzie? Notacja Ujęcie w różnych perspektywach Prezentacja atrybutów Operacje i metody Zależności Klasy aktywne,
Enkapsulacja, dziedziczenie, polimorfizm
17 grudnia 2008 Spis treści I Enkapsulacja 1 Enkapsulacja 2 Spis treści II Enkapsulacja 3 Czym jest interfejs Jak definuje się interfejs? Rozszerzanie interfejsu Implementacja interfejsu Częściowa implementacja
Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski
Adapter: opis Wzorce Strukturalne Tomasz Borzyszkowski Alternatywna nazwa: Wrapper (opakowanie) Rola obiektu Adapter: pełni wobec Klienta rolę otoczki, która umożliwia przetłumaczenie jego żądań na protokół
Java - tablice, konstruktory, dziedziczenie i hermetyzacja
Java - tablice, konstruktory, dziedziczenie i hermetyzacja Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU zmienne tablicowe konstruktory klas dziedziczenie hermetyzacja
Katalog przekształceń refaktoryzacyjnych cz. II
Katalog przekształceń refaktoryzacyjnych cz. II Prowadzący: Bartosz Walter Katalog przekształceń refaktoryzacyjnych cz. II 1 Agenda 1. Przekształcenia obiektów-wartości i obiektów-referencji 2. Przekształcenia
PHP 5 język obiektowy
PHP 5 język obiektowy Wprowadzenie Klasa w PHP jest traktowana jak zbiór, rodzaj różnych typów danych. Stanowi przepis jak stworzyć konkretne obiekty (instancje klasy), jest definicją obiektów. Klasa reprezentuje
Rozdział 4 KLASY, OBIEKTY, METODY
Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej
Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;
Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze
Kurs WWW. Paweł Rajba. pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/
Paweł Rajba pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/ Spis treści Wprowadzenie Automatyczne ładowanie klas Składowe klasy, widoczność składowych Konstruktory i tworzenie obiektów Destruktory i
Dziedziczenie. Tomasz Borzyszkowski
Dziedziczenie Tomasz Borzyszkowski Podstawy Zobacz: Dziedzictwo1.java Dziedzictwo2.java Dziedziczenie jest jedną z podstawowych cech OOP ponieważ umożliwia łatwe implementowanie klasyfikacji hierarchicznych.
UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.
UML a kod w C++ i Javie Projektowanie oprogramowania Dokumentowanie oprogramowania Diagramy przypadków użycia Przewoznik Zarzadzanie pojazdami Optymalizacja Uzytkownik Wydawanie opinii Zarzadzanie uzytkownikami
Klasy i obiekty cz II
Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Klasy i obiekty cz II Hermetyzacja, mutatory, akcesory, ArrayList Rozwijamy aplikację Chcemy, aby obiekty klasy
JAVA W SUPER EXPRESOWEJ PIGUŁCE
JAVA W SUPER EXPRESOWEJ PIGUŁCE Obiekt Obiekty programowe to zbiór własności i zachowań (zmiennych i metod). Podobnie jak w świecie rzeczywistym obiekty posiadają swój stan i zachowanie. Komunikat Wszystkie
Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14
Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Wirtualne destruktory class A int* a; A(int _a) a = new int(_a);} virtual ~A() delete a;} class B: public A double* b;
Platformy Programistyczne Podstawy języka Java
Platformy Programistyczne Podstawy języka Java Agata Migalska 6 maja 2014 Plan wykładu 1 Sztuka wysławiania się w języku Java 2 Cały świat jest obiektem 3 Kolekcje 4 Zmienne i metody statyczne 5 Słowo
PARADYGMATY PROGRAMOWANIA Wykład 4
PARADYGMATY PROGRAMOWANIA Wykład 4 Metody wirtualne i polimorfizm Metoda wirualna - metoda używana w identyczny sposób w całej hierarchii klas. Wybór funkcji, którą należy wykonać po wywołaniu metody wirtualnej
Wykład 5: Klasy cz. 3
Programowanie obiektowe Wykład 5: cz. 3 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD - podstawy Konstruktor i destruktor (część I) 2 Konstruktor i destruktor KONSTRUKTOR Dla przykładu
Aplikacje w środowisku Java
Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - dziedziczenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 W ramach poprzedniego laboratorium
Szablony klas, zastosowanie szablonów w programach
Szablony klas, zastosowanie szablonów w programach 1. Szablony klas i funkcji 2. Szablon klasy obsługującej uniwersalną tablicę wskaźników 3. Zastosowanie metody zwracającej przez return referencję do
Pielęgnacja kodu: refaktoryzacja. Jacek Starzyński, ZETiIS PW
Pielęgnacja kodu: refaktoryzacja Jacek Starzyński, ZETiIS PW Plan wykładu Wprowadzenie Poprawność i jej weryfikacja Przykre zapachy w kodzie programu Refaktoryzacje Wprowadzenie: po co? Wysoki koszt pielęgnacji
Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np
Klasy Klasa jest nowym typem danych zdefiniowanym przez użytkownika Wartości takiego typu nazywamy obiektami Najprostsza klasa jest po prostu strukturą, np struct Zespolona { Klasy jako struktury z operacjami
Programowanie obiektowe
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.
Wykład 6: Dziedziczenie
Wykład 6: Dziedziczenie Dziedziczenie Jeden z filarów obiektowości. Budowa jednej klasy na bazie drugiej, przez dodawanie/przesłanianie jej składowych: nad-klasa klasa bazowa pod-klasa klasa pochodna od
Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych
Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych Obiekty reprezentują pewne pojęcia, przedmioty, elementy rzeczywistości. Obiekty udostępniają swoje usługi: metody operacje,
referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.
Programowanie (język C++) referencje Wykład 2. Referencje (1) Referencja (odnośnik) jest zmienną identyfikującą inną zmienną. Wykonanie operacji na referencji ma taki sam skutek, jak wykonanie tejŝe operacji
Języki i techniki programowania Ćwiczenia 4 Wzorce
Języki i techniki programowania Ćwiczenia 4 Wzorce Wzorce to metoda generacji różnych klas lub różnych funkcji. Autor: Marcin Orchel Przykład 1: Jeśli dana klasa C wykonuje obliczenia numeryczne, i wymaganiem
Dziedziczenie. dr Jarosław Skaruz
Dziedziczenie dr Jarosław Skaruz http://jareks.ii.uph.edu.pl jaroslaw@skaruz.com Dziedziczenie specjalizacja Dziedziczenie generalizacja Generalizacja-specjalizacja jest takim związkiem pomiędzy klasami,
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Programowanie obiektowe
Programowanie obiektowe Literatura: Autor: dr inŝ. Zofia Kruczkiewicz Java P. L. Krzysztof Lemay, Naughton Barteczko R. Cadenhead JAVA, Java Podręcznik 2 wykłady dla kaŝdego Języka i ćwiczenia Programowania
Template method (metoda szablonowa)
1/11 Template method (metoda szablonowa) Cel: Definiuje szkielet algorytmu przy pomocy operacji podstawowych. Konkretyzacja poszczególnych kroków składowych pozostawiona klasom potomnym mogą być one zmieniane
Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016
Wstęp - wykład 0 22 lutego 2016 Historia Simula 67 język zaprojektowany do zastosowan symulacyjnych; Smalltalk 80 pierwszy język w pełni obiektowy; Dodawanie obiektowości do języków imperatywnych: Pascal
Definiowanie własnych klas
Programowanie obiektowe Definiowanie własnych klas Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski @ pwr.wroc.pl Definiowanie własnych klas Autor:
Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób?
Problemy projektowania obiektowego Czy podobne problemy można rozwiązywac w podobny sposób? Czy te problemy można przedstawić w abstrakcyjny sposób, tak aby były pomocne w tworzeniu rozwiązań w różnych
Etap implementacji. Refaktoryzacja
Etap implementacji Refaktoryzacja Koncepcja refaktoryzacji Termin refaktoryzacja (ang. Refactoring) definiuje się jako mechanizm zmiany struktury kodu bez zmiany jego zachowania (funkcjonalności). Celem
Wykład 7: Pakiety i Interfejsy
Wykład 7: Pakiety i Interfejsy Plik Źródłowy w Javie Składa się z: instrukcji pakietu (pojedyncza, opcjonalna) instrukcji importujących (wielokrotne, opcjonalne) deklaracji klasy publicznej (pojedyncza,
Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13
Klasy Klasa to grupa obiektów, które mają wspólne właściwości, a obiekt jest instancją klasy. Klasa w języku Java może zawierać: pola - reprezentują stan obiektu (odniesienie do pola z kropką), methods
Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.
1/8 Singleton Cel: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej. Przykład: Niekiedy ważne jest, aby tworzyć tylko jedną instancję jakiejś klasy. Globalne zmienne
Lab 9 Podstawy Programowania
Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany
Aplikacje w środowisku Java
Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - wprowadzenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 Klasa zbiór pól i metod Obiekt
Programowanie obiektowe
Programowanie obiektowe IV. Interfejsy i klasy wewnętrzne Małgorzata Prolejko OBI JA16Z03 Plan Właściwości interfejsów. Interfejsy a klasy abstrakcyjne. Klonowanie obiektów. Klasy wewnętrzne. Dostęp do
Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016
Wykład 2 17 marca 2016 Dziedziczenie Klasy bazowe i potomne Dziedziczenie jest łatwym sposobem rozwijania oprogramowania. Majac klasę bazowa możemy ja uszczegółowić (dodać nowe pola i metody) nie przepisujac
Podstawy Programowania Obiektowego
Podstawy Programowania Obiektowego Wprowadzenie do programowania obiektowego. Pojęcie struktury i klasy. Spotkanie 03 Dr inż. Dariusz JĘDRZEJCZYK Tematyka wykładu Idea programowania obiektowego Definicja
Metody Metody, parametry, zwracanie wartości
Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Metody Metody, parametry, zwracanie wartości Metody - co to jest i po co? Metoda to wydzielona część klasy, mająca
Programowanie 2. Język C++. Wykład 3.
3.1 Programowanie zorientowane obiektowo... 1 3.2 Unie... 2 3.3 Struktury... 3 3.4 Klasy... 4 3.5 Elementy klasy... 5 3.6 Dostęp do elementów klasy... 7 3.7 Wskaźnik this... 10 3.1 Programowanie zorientowane
.NET Klasy, obiekty. ciąg dalszy
.NET Klasy, obiekty ciąg dalszy Przeciążanie operatorów 1 W języku C# istnieje możliwość zdefiniowania funkcjonalności dużej części operatorów dla typów stworzonych przez użytkownika. Dzięki takiemu zabiegowi,
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja
Programowanie obiektowe
Programowanie obiektowe Laboratorium 3 i 4 - przypomnienie wiadomości o OOP na przykładzie Javy mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 8 marca 2017 1 / 20 mgr inż. Krzysztof Szwarc
Typy sparametryzowane
Typy sparametryzowane Streszczenie Celem wykładu jest zaprezentowanie typów sparametryzowanych. Czas wykładu 90 minut. Istnieją algorytmy, których zasada działania nie zależy od typu danych wejściowych.
Klasy abstrakcyjne, interfejsy i polimorfizm
Programowanie obiektowe 12 kwietnia 2011 Organizacyjne Klasówka będzie 20 IV 2011. Sale jeszcze są pertraktowane. Materiał do wyjątków włącznie. Można mieć swoje materiały nieelektroniczne. Wywołanie z
C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.
C++ - DZIEDZICZENIE Do najważniejszych cech języka C++ należy możliwość wielokrotnego wykorzystywania kodu Prymitywnym, ale skutecznym sposobem jest kompozycja: deklarowanie obiektów wewnątrz innych klas,
Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).
Wprowadzenie w dziedziczenie Klasa D dziedziczy klasę B: B klasa bazowa D klasa pochodna Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class). Najpierw jest tworzona klasa bazowa,
Programowanie obiektowe - 1.
Programowanie obiektowe - 1 Mariusz.Masewicz@cs.put.poznan.pl Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) to metodologia tworzenia programów komputerowych, która
Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki Object-oriented programming Najpopularniejszy obecnie styl (paradygmat) programowania Rozwinięcie koncepcji programowania strukturalnego
Kompozycja i dziedziczenie klas
Związki między klasami: jest i zawiera Programowanie obiektowe Przkład: Pojazd Kompozycja i dziedziczenie klas Silnik Pojazd silnikowy Rower Wóz konny Paweł Rogaliński Instytut Informatyki, Automatyki
Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna
Język JAVA podstawy Wykład 4, część 1 1 Język JAVA podstawy Plan wykładu: 1. Podstawy modelowania obiektowego 2. Konstruktory 3. Dziedziczenie, związki pomiędzy klasami, UML 4. Polimorfizm 5. Klasy abstrakcyjne
Definiowanie własnych klas
Abstrakcja Programowanie obiektowe Definiowanie własnych klas Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej Świat rzeczywisty jest bardzo złoŝony i nie jest moŝliwe
Zaawansowane programowanie w C++ (PCP)
Zaawansowane programowanie w C++ (PCP) Wykład 4 - wzorce projektowe. dr inż. Robert Nowak - p. 1/18 Powtórzenie klasy autonomiczne tworzenie nowych typów: dziedziczenie i agregacja dziedziczenie: przedefiniowywanie
Do czego służą klasy?
KLASY Dorota Pylak 2 Do czego służą klasy? W programowaniu obiektowym posługujemy się obiektami. Obiekty charakteryzują się: cechami (inaczej - atrybutami lub stanami) operacjami, które na nich można wykonywać
FUNKCJE WZORCOWE. Wykład 10. Programowanie Obiektowe (język C++) Funkcje wzorcowe wprowadzenie (2) Funkcje wzorcowe wprowadzenie (1)
Programowanie Obiektowe (język C++) Wykład 10. FUNKCJE WZORCOWE Funkcje wzorcowe wprowadzenie (1) Funkcje wzorcowe wprowadzenie (2) int max ( int a, int b ) return a>b? a : b; Aby mieć analogiczną funkcję
Język C++ zajęcia nr 2
Język C++ zajęcia nr 2 Inicjalizacja Definiowanie obiektu może być połączone z nadaniem mu wartości początkowej za pomocą inicjalizatora, który umieszczany jest po deklaratorze obiektu. W języku C++ inicjalizator
Czym są właściwości. Poprawne projektowanie klas
Z akcesorów get i set korzysta każdy kto programuje w C#. Stanowią one duże udogodnienie w programowaniu obiektowym. Zapewniają wygodę, bezpieczeństwo i znacząco skracają kod. Akcesory są ściśle związane
UML a kod. C++, Java i C#
UML a kod C++, Java i C# UML a kod w C++ i Javie Projektowanie oprogramowania! Dokumentowanie oprogramowania Diagramy przypadków użycia Klasy użytkowników i wykorzystywane funkcje Mogą sugerować podział
Programowanie obiektowe
Programowanie obiektowe III. Refleksja Małgorzata Prolejko OBI JA16Z03 Plan Klasa Class. Analiza funkcjonalności klasy. Podstawy obsługi wyjątków. Zastosowanie refleksji do analizy obiektów. Wywoływanie
Technologie obiektowe
WYKŁAD dr inż. Paweł Jarosz Instytut Informatyki Politechnika Krakowska mail: pjarosz@pk.edu.pl LABORATORIUM dr inż. Paweł Jarosz (3 grupy) mgr inż. Piotr Szuster (3 grupy) warunki zaliczenia Obecność
Programowanie obiektowe
Programowanie obiektowe Podstawowe cechy i możliwości języka Scala mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 2017 1 / 32 mgr inż. Krzysztof Szwarc Programowanie obiektowe Informacje
Laboratorium nr 5. Temat: Funkcje agregujące, klauzule GROUP BY, HAVING
Laboratorium nr 5 Temat: Funkcje agregujące, klauzule GROUP BY, HAVING Celem ćwiczenia jest zaprezentowanie zagadnień dotyczących stosowania w zapytaniach języka SQL predefiniowanych funkcji agregujących.
KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany
KLASA UCZEN Napisz deklarację klasy Uczen, w której przechowujemy następujące informacje o uczniu: imię, nazwisko, średnia (pola prywatne), poza tym klasa zawiera metody: konstruktor bezparametrowy (nie
Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki
Informatyka I Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2017 Dziedziczenie klas
Java: kilka brakujących szczegółów i uniwersalna nadklasa Object
Java: kilka brakujących szczegółów i uniwersalna nadklasa Object Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU Konstrukcja obiektów Niszczenie obiektów i zwalnianie zasobów
Zaawansowane programowanie obiektowe - wykład 5
Zaawansowane programowanie obiektowe - wykład 5 dr Piotr Jastrzębski (czynnościowe) opisują zachowanie obiektów, komunikację pomiędzy nimi i ich odpowiedzialność. Interpreter Iterator (kursor) Łańcuch
Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C
#import "Fraction.h" #import @implementation Fraction -(Fraction*) initwithnumerator: (int) n denominator: (int) d { self = [super init]; } if ( self ) { [self setnumerator: n anddenominator:
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi EGZAMIN PIERWSZY (25 CZERWCA 2013) JĘZYK C++ poprawiam ocenę pozytywną z egzaminu 0 (zakreśl poniżej x) 1. Wśród poniższych wskaż poprawną formę definicji
Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska
Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego Iwona Kochaoska Programowanie Obiektowe Programowanie obiektowe (ang. object-oriented programming) - metodyka tworzenia programów komputerowych,
Programowanie obiektowe
Programowanie obiektowe Wykład 2 Marcin Młotkowski 4 marca 2015 Plan wykładu 1 2 3 4 5 Marcin Młotkowski Programowanie obiektowe 2 / 47 Krótki opis C Obiektowy, z kontrolą typów; automatyczne odśmiecanie;
KOTLIN. Język programowania dla Androida
KOTLIN Język programowania dla Androida Historia Kotlin został opracowany przez firmę JetBrains Prace rozpoczęto w 2011 r., od 2012 r. dostępny na licencji Apache 2. Nazwa pochodzi od wyspy koło Petersburga
Programowanie obiektowe
Wykład 12 Marcin Młotkowski 16 maja 2018 Plan wykładu 1 Analiza obiektowa Dziedziczenie Dziedziczenie a składanie 2 Marcin Młotkowski 482 / 537 Dziedziczenie Dziedziczenie a składanie Plan wykładu 1 Analiza
Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji
Politechnika Białostocka Wydział Elektryczny Katedra Telekomunikacji i Aparatury Elektronicznej Instrukcja do pracowni specjalistycznej z przedmiotu Obiektowe programowanie aplikacji Kod przedmiotu: TS1C410201
C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów
Operatory są elementami języka C++. Istnieje zasada, że z elementami języka, takimi jak np. słowa kluczowe, nie można dokonywać żadnych zmian, przeciążeń, itp. PRZECIĄŻANIE OPERATORÓW Ale dla operatorów
Technologie i usługi internetowe cz. 2
Technologie i usługi internetowe cz. 2 Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 15 luty 2014 r. 1 Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to paradygmat programowania,
Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.
Zadanie: Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób. Na kolejnych zajęciach projekt będzie rozwijana i uzupełniana o kolejne elementy omawiane
Interfejsy i klasy wewnętrzne
Interfejsy i klasy wewnętrzne mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 Interfejs klasy sposób komunikacji z jej obiektami (zestaw składowych publicznych). Określa on zestaw
Języki i techniki programowania Ćwiczenia 2
Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...
znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Materiały do zajęć VII
Spis treści I. Klasy Materiały do zajęć VII II. III. Konstruktor Właściwości i indeksatory Klasy Programowanie obiektowe wiadomości wstępne Paradygmat programowania obiektowego Abstrakcja Hermetyzacja
Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych
Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych mluckner@mini.pw.edu.pl http://www.mini.pw.edu.pl/~lucknerm Programy w Javie składają się z pakietów Pakiety zawierają definicje
Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.
1/14 Prototype (prototyp) Cel: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp. Przykład: Edytor 3D klient tworzy obiekty różnych kształtów
Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h
Programowanie II Lista 3 Modyfikatory dostępu plik TKLientBanku.h plik z funkcją main Przyjaźń Dziedziczenie Dziedziczenie to nic innego jak definiowanie nowych klas w oparciu o już istniejące. Jest to
Programowanie obiektowe
Laboratorium z przedmiotu - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia. Wprowadzenie teoretyczne.