Programowanie Obiektowe – Wykład 9

Slides:



Advertisements
Podobne prezentacje
C++ wykład 2 ( ) Klasy i obiekty.
Advertisements

C++ wykład 4 ( ) Przeciążanie operatorów.
Język C/C++ Funkcje.
Programowanie obiektowe
Klasy abstrakcyjne i interfejsy
Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory
Programowanie obiektowe
Programowanie obiektowe
Wzorce.
Prowadzący: mgr inż. Elżbieta Majka
Dziedziczenie. Po co nam dziedziczenie? class osoba { char * imie, char * imie, * nazwisko; * nazwisko;public: void wypisz_imie(); void wypisz_imie();
Generics w .NET 2.0 Łukasz Rzeszot.
PROGRAMOWANIE STRUKTURALNE
Programowanie obiektowe w Javie
OOP - programowanie zorientowane obiektowo w VB.NET
Serwery Aplikacji ASP .NET Web Objects Arkadiusz Popa.
ODE Triggery. Wstęp n Triggery są trójką zdarzenie-warunek-akcja (event-condition- action). n Zdarzenia mogą być proste lub złożone, co zostanie omówione.
ODE Informacje wstępne. Pojęcia podstawowe n Obiektowa baza danych u język komunikacji u ziarnistość obiektów u identyfikacja obiektów n Transakcja -
C++ wykład 2 ( ) Klasy i obiekty.
Zasady zaliczenia Warunki uzyskania zaliczenia:
Wstęp do programowania obiektowego
Projektowanie i programowanie obiektowe II - Wykład IV
Podstawy programowania
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
Programowanie urządzeń mobilnych – wykład IV
Funkcje w Pascalu Przypomnienie wiadomości o procedurach Prowadzący: Anna Kaleta Piotr Chojnacki.
T: Różnice pomiędzy programowaniem strukturalnym a obiektowym
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Programowanie obiektowe III rok EiT
WPROWADZENIE W ŚWIAT OBIEKTÓW
Andrzej Repak Nr albumu
Java – coś na temat Klas Piotr Rosik
Dziedziczenie Maciek Mięczakowski
Inicjalizacja i sprzątanie
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
C# Platforma .NET CZ.3 Kuba Ostrowski.
Przekazywanie parametrów do funkcji oraz zmienne globalne i lokalne
Programowanie obiektowe – język C++
Programowanie obiektowe 2013/2014
Kurs języka C++ – wykład 9 ( )
Programowanie w języku C++
Dobry kod OO Jeżeli zapytamy statystycznego programistę z czym kojarzy mu się dobry kod OO to najprawdopodobniej będzie mówił o wzorcach projektowych.
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Programowanie zaawansowane
Programowanie strukturalne i obiektowe C++
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Kurs języka C++ – wykład 4 ( )
K URS JĘZYKA C++ – WYKŁAD 2 ( ) Klasy i obiekty.
Technologie internetowe Wykład 5 Wprowadzenie do skrytpów serwerowych.
Programowanie obiektowe Wykład 9 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/15 Dariusz Wardowski.
Paweł Starzyk Obiektowe metody projektowania systemów
Łukasz Bieszczad Mateusz Gałązka Karol Włodarek
Programowanie Zaawansowane
Dziedziczenie Wykład 7 Dziedziczenie sekwencyjne
PO13-1 / 19 Wykład 13 Wyjątki i ich zgłaszanie Wyłapywanie wyjątków Obsługa wyjątków Wykorzystanie polimorfizmu Filtrowanie wyjątków Błędy w konstruktorach.
Partnerstwo dla Przyszłości 1 Lekcja 28 Dziedziczenie i rodzaje dziedziczenia.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Programowanie Obiektowe – Wykład 6
Przypomnienie wiadomości – kilka zadań
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
(według:
Delegaty Delegat to obiekt „wiedzący”, jak wywołać metodę.
Programowanie Obiektowe – Wykład 2
Zdarzenia (eventy) Zdarzenia służą do powiadomienia użytkownika, gdy w używanej klasie dojdzie do pewnych wydarzeń zdefiniowanych przez twórcę klasy.
PGO Dziedziczenie Michail Mokkas.
Zapis prezentacji:

Programowanie Obiektowe – Wykład 9 dr Piotr Jastrzębski Wydział Matematyki i Informatyki http://wmii.uwm.edu.pl/~piojas/ piojas@matman.uwm.edu.pl

Tematyka wykładu delegaty (delegacje) zdarzenia egzamin – przypomnienie zasad

Filary programowania obiektowego abstrakcja hermetyzacja dziedziczenie polimorfizm

Zasady programowania obiektowego S.O.L.I.D. Single Responsibility Principle (SRP) – zasada jednej odpowiedzialności Open-Closed Principle (OCP) – zasada otwarte- zamknięte Liskov Substitution Principle (LSP) – Zasada podstawienia Liskov Interface Segregation Principle (ISP) – Zasada segregacji interfejsów Dependency Inversion Principle (DIP) – Zasada odwrócenia zależności

Zasada jednej odpowiedzialności każdy obiekt powinien mieć tylko jeden cel i odpowiedzialność nie powinien istnieć więcej niż jeden powód do modyfikacji klasy jeśli jest kilka odpowiedzialności, powinniśmy podzielić klasę podobne do Separation of Concerns

Zasada otwarte-zamknięte klasa powinna być otwarta na rozbudowę ,ale zamknięta do jej własnej modyfikacji możemy dodawać nowe pola i metody, ale bez zmiany w wewnętrzną strukturę zmiana istniejącej struktury może mieć wpływ na inne elementy hermetyzacja, dziedziczenie, polimorfizm, delegaty unikamy instrukcji warunkowych

Zasada podstawienia Liskov powinniśmy być w stanie używać klasy pochodnej w miejsce klasy nadrzędnej i ona zachowuje się w taki sam sposób, bez modyfikacji klasa pochodna nie ma wpływu na zachowanie klasy nadrzędnej w hierarchii klas powinno dać się traktować obiekt klas pochodneh jak obiekt klas bazowej dziedziczenie ma być stosowane tylko gdy chcemy skorzystać z polimorfizmu, a nie tylko gdy chcemy wyciągnąć wspólne cechy

Zasada segregacji interfejsów dzielenie interfejsów na mniejsze grupy, tak by klasa dziedzicząca po nich, nie miała do dyspozycji niepotrzebnych metod nie powinno być jednego dużego interfejsu

Zasada odwrócenia zależności Moduły wysokopoziomowe nie powinny zależeć od modułów niskopoziomowych. Obie grupy modułów powinny zależeć od abstrakcji. moduły wysokopoziomowe – logika biznesowa moduły niskopoziomowe – komunikacją z bazą danych, ftp, API, algorytmy do liczenia Abstrakcje nie powinny zależeć od szczegółowych rozwiązań. To szczegółowe rozwiązania powinny zależeć od abstrakcji.

Delegaty Delegat to obiekt „wiedzący”, jak wywołać metodę. Typ delegacyjny definiuje rodzaj metody, jaki mogą wywoływać egzemplarze delegatu. Dokładniej: określa typ zwrotny metody i typy jej parametrów.

Definicja typu delegacyjnego o nazwie Transformer: public delegate int Transformer (int x); Typ Transformer jest zgodny z każdą metodą o typie zwrotnym int przyjmującą jeden parametr typu int np. taką: static int Square (int x) { return x * x; } Przypisanie metody do zmiennej typu delegacyjnego powoduje utworzenie egzemplarza delegatu: Transformer t = Square; Egzemplarz ten można wywoływać tak jak zwykłą metodę: int answer = t(3); // wynik to 9

public delegate int Transformer(int x); class Program { static int Square(int x) { return x * x; } static void Main(string[] args) Transformer t = Square; // utworzenie egzemplarza delegatu int result = t(3); // wywołanie delegatu Console.WriteLine(result); // 9 Console.ReadKey(); }

kod po staremu static int Square(int x) { return x * x; } static void Main(string[] args) { int result = Square(3); Console.WriteLine(result); // 9 Console.ReadKey(); }

Uwaga na zapisy skrócone! Instrukcja: Transformer t = Square; jest skróconą formą zapisu instrukcji: Transformer t = new Transformer (Square); Wyrażenie: t(3) jest skróconą formą zapisu: t.Invoke(3)

Po co delegaty? Projektując różne rozbudowane systemy istniała potrzeba, aby funkcja wywoływana mogła komunikować się z funkcją wywołującą. Delegaty są obiektami dziedziczącymi bezpośrednio niejawnie z MulticastDelegate. Ta z kolei dziedziczy z klasy Delegate oraz Object.

Podpinanie metod do delegatów Mając zadeklarowany delegat, możemy podpiąć do niego dowolną metodę. Ważne jest to, aby zgodne były argumenty oraz typ zwracany. Delegaty w C# obsługują tzw. multicasting tzn. możliwe jest podpięcie wielu metod do jednego delegata. Podpinanie metod pod delegat odbywa się za pomocą: pierwsza metoda podpinana jest poprzez konstruktor, podczas tworzenia instancji delegata każdą następną metodę możemy dodać/usunąć za pomocą operatorów += oraz -=

public delegate void Dzialanie(int x, int y); public class Matma { public void Dodaj(int l1, int l2) { Console.WriteLine(l1 + l2); } public void Odejmij(int l1, int l2) { Console.WriteLine(l1 - l2); } } class Program static void Main(string[] args) Matma matma = new Matma(); Dzialanie dzialanie = new Dzialanie(matma.Dodaj); dzialanie(5,5); dzialanie += matma.Odejmij; dzialanie(7, 4); Console.ReadKey();

Delegaty jako funkcje wywołań zwrotnych Delegaty używane są do tworzenia funkcji zwrotnych tzw. callbacków. W tym celu deklarujemy delegat wewnątrz interesującej nas klasy. Callback - funkcja zwrotna, której idea używania jest przeciwna do standardowego używania funkcji. Zamiast wywoływać interesujące nas funkcje, nasz obiekt wywołuje delegat. To na co będzie wskazywał delegat w przyszłości, zależy już od innych obiektów i programistów pracujących na naszej klasie. Dwie zasady: modyfikator public pamiętamy o hermetyzacji!

public class System { public delegate void Logi(string wiadomosc); private Logi wyslijLogi; public void DodajCallback(Logi funkcja) wyslijLogi += funkcja; } public void UsunCallback(Logi funkcja) public bool Logowanie(string user, string password) wyslijLogi("Nastąpiła próba logowania użytkownika: " + user); return true;

class Program { static void CallbackLogi(string wiadomosc) Console class Program { static void CallbackLogi(string wiadomosc) Console.WriteLine(wiadomosc); Console.WriteLine("Została wywołana funkcja zwrotna"); } static void Main() System system = new System(); system.DodajCallback(CallbackLogi); system.Logowanie("user", "pass"); Console.ReadKey();

Gotowe delegaty Func Action Od .net Framework 3.5(?)

Func Delegat Func jest delegatem generycznym. Podczas deklaracji trzeba określić typ zwracany oraz typ parametrów. Konstruktor został przeciążony aż 17 razy. Należy pamiętać, że w kwadratowych dzióbkach końcowy parametr jest zawsze tym zwracanym. Wszystkie jakie dopiszemy wcześniej będą wejściowymi: Func<out> Func<in, out> Func<in, in, out> Formalna definicja delegata Func wygląda następująco: public delegate TResult Func<in T, out TResult>(T arg);

public class Matematyka { public int Dodawanie(int x, int y) return x + y; } class Program static void Main() Matematyka m = new Matematyka(); Func<int, int, int> dodawanie = m.Dodawanie; Console.WriteLine(dodawanie(1, 2)); Console.ReadKey();

Delegat Action stosowany do funkcji z typem zwracanym void Definicja formalna: public delegate void Action<in T>(T arg);

static void Main() { Matematyka m = new Matematyka(); Action<string> wypisz = System.Console.WriteLine; wypisz("jakis tekst"); Console.ReadKey(); }

Zdarzenia Zdarzenia służą do powiadomienia użytkownika, gdy w używanej klasie dojdzie do pewnych wydarzeń zdefiniowanych przez twórcę klasy. Możemy dzięki temu w odpowiedni sposób reagować np. jeśli wartość zmiennej została zmieniona lub jeśli użytkownik kliknął w przycisk. Więcej zastosować dla WPF, WinForms, Xamarin, XNA, ASP.NET.

Definicja public event TypDelegata NazwaZdarzenia; public delegate void WartoscZmienionaEventHandler(int obecnaWartosc); public event WartoscZmienionaEventHandler WartoscZmieniona;

class PobieraczPlikow { public delegate void BladPobierniaDelegata(string wiadomosc); public delegate void SkonczonePobieranieDelegata(); private int liczbaPobranychPlikow; private int liczbaDoPobraniaPlikow; }

class PobieraczPlikow { public delegate void BladPobierniaDelegata(string wiadomosc); public event BladPobierniaDelegata PrzyBlendziePobierania; public delegate void SkonczonePobieranieDelegata(); public event SkonczonePobieranieDelegata SkonczonePobieranie; private int liczbaPobranychPlikow; private int liczbaDoPobraniaPlikow; }

Subskrypcja zdarzenia class Program { static void pobi_ObsluStrum() Console.WriteLine("\t Obsługuje teraz strumienie."); } static void pobi_Poinformuj() Console.WriteLine("\t Skonczyłem pobieranie"); static void Main(string[] args) PobieraczPlikow pobieracz = new PobieraczPlikow(); pobieracz.SkonczonePobieranie += pobi_Poinformuj; pobieracz.PrzyBlendziePobierania += Console.WriteLine; pobieracz.SkonczonePobieranie += pobi_ObsluStrum; Console.ReadKey();

Wywołanie zdarzenia class PobieraczPlikow { public void WystapilBlad() if (PrzyBlendziePobierania != null) PrzyBlendziePobierania("Wystapił błąd"); }

Kod do analizy https://github.com/Piotrekk85/Wyklad9Z

Egzamin – przypomnienie informacji Egzamin będzie miał formę pisemna - test. Składał się będzie z około 10-20 pytań jednokrotnego wyboru: na każde pytanie jest jedna prawidłowa spośród 5 możliwych odpowiedzi; 3 punkty za każdą poprawna odpowiedz; minus 2 punkty za każdą niepoprawna odpowiedz.

Punktacja bardzo dobry (5,0) 91-100%; dobry plus (4,5) 80-90%; dostateczny plus (3,5) 60-69%; dostateczny (3,0) 41-59%; niedostateczny (2,0) 0-39%.

Dozwolone jest korzystanie z materiałów, książek, własnych notatek z zachowaniem samodzielności dokonywanych czynności. Zabronione jest korzystanie z wszelkich narzędzi/metod do komunikacji na odległość.