Wprowadzenie niektórych zagadnień OOP oraz wzorce operacyjne



Podobne dokumenty
Zaawansowane programowanie obiektowe - wykład 5

NAJLEPSZE STRATEGIE SKUTECZNYCH PROGRAMISTÓW. TECHNIKI PRACY Z KODEM KOD: NSKOD

Wzorce projektowe. dr inż. Marcin Pietroo

Projektowanie obiektowe Wzorce projektowe. Gang of Four Strukturalne wzorce projektowe (Wzorce interfejsów)

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017

Wprowadzenie do programowania aplikacji mobilnych

Aplikacje w środowisku Java

Dokumentacja do API Javy.

Wzorce projektowe. dr inż. Marcin Pietroo

Wzorce projektowe. dr inż. Marcin Pietroo

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski


Programowanie obiektowe - 1.

Klasy abstrakcyjne i interfejsy

Wstęp [2/2] Wbrew częstemu przekonaniu, nie są one gotowymi rozwiązaniami, to tylko półprodukty rozwiązania.

MVVM Light Toolkit. Julita Borkowska

PHP 5 język obiektowy

Programowanie obiektowe

Plik pobrano z Tytuł: Wzorce projektowe, cz. 2 Strategy Ostatnia aktualizacja:

Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób?

Projektowanie obiektowe Wzorce projektowe

problem w określonym kontekście siły istotę jego rozwiązania

Wzorce projektowe Michał Węgorek

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Omówienie wzorców wykorzystywanych w Prism 5.0. Dominika Różycka

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015

Iteracyjno-rozwojowy proces tworzenia oprogramowania Wykład 3 część 1

Podstawy Programowania Programowanie Obiektowe

Zofia Kruczkiewicz - Modelowanie i analiza systemów informatycznych 1

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie obiektowe

Builder (budowniczy) Cel: Przykład:

Wykład 1. Projektowanie efektywnych algorytmów przetwarzania danych w sieciowych systemach usług, rzeczy i multimediów.

Programowanie obiektowe

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (2) Wykład 10 Inversion of Control Wiktor Zychla 2013

Template method (metoda szablonowa)

Programowanie Zespołowe

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2016

Interfejsy i klasy wewnętrzne

Wzorce projektowe. dr Jarosław Skaruz

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

Języki i techniki programowania Ćwiczenia 2

12) Wadą modelu kaskadowego jest: Zagadnienia obowiązujące na egzaminie z inżynierii oprogramowania: 13) Wadą modelu opartego na prototypowaniu jest:

Podstawy Programowania Obiektowego

Modelowanie i Programowanie Obiektowe

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Programowanie obiektowe

Kumulowanie się defektów jest możliwe - analiza i potwierdzenie tezy

TRENER MARIUSZ MRÓZ - JEDZ TO, CO LUBISZ I WYGLĄDAJ JAK CHCESZ!

private - oznacza, że wszystkie elementy klasy bazowej zmieniają się w prywatne.

Technologie obiektowe

Wskazówki projektowe. Programowanie Obiektowe Mateusz Cicheński

Dziedziczenie. dr Jarosław Skaruz

Dziedziczenie. Tomasz Borzyszkowski

Projektowanie obiektowe Wzorce projektowe. Gang of Four Wzorce rozszerzeń

Język Java część 2 (przykładowa aplikacja)

Zaawansowane programowanie w C++ (PCP)

Wzorce oprogramowania Gof (cd) zastosowane w modelu obiektowym

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

WYKŁAD 11. Wzorce projektowe czynnociowe Iterator TemplateMethod

programowanie w oparciu o platformę netbeans w praktyce

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Podstawy programowania III WYKŁAD 4

10. Programowanie obiektowe w PHP5

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Wprowadzenie do systemów informacyjnych

Pakiety i interfejsy. Tomasz Borzyszkowski

Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.

Analiza i projektowanie oprogramowania. Analiza i projektowanie oprogramowania 1/32

Wykład 9: Polimorfizm i klasy wirtualne

Zofia Kruczkiewicz - Modelowanie i analiza systemów informatycznych 2

Copyright 2015 Monika Górska

Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych

Programowanie obiektowe

Laboratorium 5 - Projektowanie programów zorientowanych obiektowo. Indywidualny projekt programistyczny

Wzorce projektowe kreacyjne

Początki Javy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 8

Serwery Statefull i Stateless

Programowanie obiektowe

Scenariusz lekcji opartej na programie Program nauczania informatyki w gimnazjum DKW /99

TEMAT : KLASY DZIEDZICZENIE

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Programowanie obiektowe

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Konfiguracja central Slican IPM-032

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Podstawowe elementy GUI cz. 2 i 3 - zadania

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Przykładowa implementacja

Programowanie obiektowe 1 - opis przedmiotu

Opis systemu oceny zadań domowych

Zagadnienia (1/3) Data-flow diagramy przepływów danych ERD diagramy związków encji Diagramy obiektowe w UML (ang. Unified Modeling Language)

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Programowanie obiektowe

Wzorce projektowe i refaktoryzacja

Transkrypt:

Wprowadzenie niektórych zagadnień OOP oraz wzorce operacyjne ŁUKASZ KIEŁCZYKOWSKI 1

1. Wprowadzenie Wyobraźmy sobie, że jesteśmy firmą tworzącą oprogramowanie i dostaliśmy właśnie zlecenie na stworzenie symulatora kaczek. Dostaliśmy jednak jedno wymaganie, które nasz symulator musi spełniać: 1. Wszystkie kaczki kwaczą i pływają Tak więc przechodzimy do pracy i na chwilę obecną wystarcza nam taki twór: Jest to klasa abstrakcyjna kaczki, która zawiera metody kwakania i pływania (jako że wszystkie kaczki kwaczą i pływają tak samo przynamniej na chwilę obecną) oraz interfejs wymuszający na konkretnej kaczce implementacje metody Wyswietl. Niżej przedstawiam implementacje konkretnej kaczki: Dostaliśmy jednak dodatkowe wymaganie podczas tworzenia naszego symulatora. Otóż zarząd firmy zlecającej nam stworzenie programu stwierdził, że mamy dodać kaczkom możliwość latania. Odruchowo dodajemy do naszej klasy abstrakcyjnej metodę Lec, która na pierwszy rzut oka rozwiązuje problem, a my czujemy się dumnie z naszych umiejętności programistycznych ŁUKASZ KIEŁCZYKOWSKI 2

Obecnie nasza klasa abstrakcyjna wygląda tak: Niestety dostajemy telefon od zarządu, że dodali sobie gumową kaczkę, która niespodziewanie zaczęła latać! Nie jest to zachowanie pożądane i musimy ten problem rozwiązać. Możemy w tym momencie zauważyć, że dziedziczenie jakie tutaj zastosowaliśmy nie do końca jest dobre. Dziedziczymy metodę, którą nie w każdej klasie podrzędnej chcemy, więc możemy stworzyć interfacey, które dostarczą nam kontraktu dotyczącego latania, kwakania i pływania. Daje nam to tyle, że implementować te interfacey będą tylko te konkretne kaczki, które potrafią wykonać daną czynność. Zastanówmy się jednak przez chwile Przecież takie kaczki jak dzika oraz płaskonosa kwaczą i pływają tak samo, także zobaczmy ile kodu będziemy musieli duplikować, co sprawi nam wiele pracy przy jakichkolwiek zmianach. W takim razie co robimy? Wiemy, że dziedziczenie to nie jest dobre rozwiązanie, ponieważ nie wszystkie podklasy potrzebują wszystkich metod. Interfacey są dobrą ścieżką, ale nie w takiej formie jak przedstawiłem wyżej. Rozwiązaniem jest hermetyzacja tych zachowań. Hermetyzacja to bardzo ważne pojęcie w programowaniu obiektowym, które oznacza ukrywanie implementacji i jej pudełkowanie. Wyodrębnijmy sobie konkretne zachowania związane z lataniem, kwakaniem, itp. Stworzymy sobie odrębny obiekt, np. LatamBoMamSkrzydla i on będzie implementował interface ILatanie. ŁUKASZ KIEŁCZYKOWSKI 3

Mając taki schemacik, nasze kaczki potrzebują obiektów, które będą implementowały zachowania. Dodatkowo warto zauważyć, że dzięki hermetyzacji, stworzone przez nas zachowania mogą być wykorzystane w innych projektach, czyli to co w OOP jest piękne ponowne wykorzystanie stworzonego kodu! W tym momencie, mogę wprowadzić ciekawe pojęcie jakim jest dependency injection. Pojęcie to oznacza możliwość dostarczenia (wstrzyknięcia!) obiektu A do obiektu B, którego zachowanie jest zależne od obiektu A, dzięki temu możemy zmieniać zachowanie obiektu B in runtime, czyli w czasie wykonywania się programu. Z tym podejściem wiąże się coś w rodzaju zasady, czy też reguły: Skoncentruj się na tworzeniu interfejsów, a nie implementacji. Nie jest jednak powiedziane, że MUSIMY tworzyć obiekty w taki sposób jak powyższy, ponieważ zależy to od naszych potrzeb. Jeśli potrzebujemy udostępnić interfejs, to go przeważnie implementujemy, by móc oświadczyć wszystkim, że dostarczamy dany kontrakt, ale jeśli to nasz obiekt jest tym, który wykorzysta ten interfejs, to wtedy przyjmujemy obiekty dostarczające ów kontrakt. W tym momencie, nasza klasa abstrakcyjna wygląda następująco: ŁUKASZ KIEŁCZYKOWSKI 4

Czy jak ktoś woli: Stworzyliśmy sobie grupę zachowań prawda? Możemy je nazwać algorytmami, ponieważ definiują sposób w jaki obiekt będzie latał, czy też kwakał. Dodatkowo, lekko pod stołem, wślizgnęła nam się kolejna bardzo ważna zasada OOP: Przekładaj kompozycję nad dziedziczenie Dlaczego? Spójrzmy na część schematu UML naszego symulatora, związanego z lataniem: ŁUKASZ KIEŁCZYKOWSKI 5

W tym momencie naszym oczom ukazał się wzorzec projektowy Strategia! 2. Wzorzec Strategia Strategia definiuje rodzinę algorytmów, pakuje je jako osobne klasy i powoduje, że są one w pełni wymienne. Zastosowanie tego wzorca pozwala na to, żeby zmiany w implementacji algorytmów przetwarzania były całkowicie niezależne od strony klienta, który z nich korzysta. Wzorzec pozwala nam na to, abyśmy skonfigurowali dana klasę konkretnym zachowaniem, którym kolejne klasy właśnie się różnią, a dodatkowo implementacja tych zachowań/algorytmów, może być zróżnicowana, ponieważ nasz obiekt chce tylko odpowiedni interfejs umożliwiający rozmawianie z dostarczonym zachowaniem. Jego struktura wygląda następująco: ŁUKASZ KIEŁCZYKOWSKI 6

To właśnie ten wzorzec wykorzystuje, wspomnianą już wcześniej, regułę projektowania Przekładaj kompozycję nad dziedziczenie. 3. PizzaMaker Umiejąc już wzorzec Strategia, przyjrzyjmy się kolejnemu przykładowi. Przygotujmy sobie program przygotowujący pizzę i przeanalizujmy jakie problemy i kolejne projektowe spostrzeżenia nam on przyniesie. Na początku potrzebujemy przepis aby zrobić jakąkolwiek pizzę. Przygotowałem przykładowe przepisy dla dwóch rodzajów pizz. Margherita: 1. Przygotuj cienkie ciasto. 2. Dodaj sos pomidorowy. 3. Dodaj mozzarelle. 4. Dodaj bazylię i trochę oliwy. 5. Piecz przez 15 minut. Sicilian: 1. Przygotuj grube ciasto. 2. Podaj nasz specjalny sos. 3. Dodaj oliwki i kapary. 4. Dodaj mieszankę przypraw. 5. Piecz przez 20 minut. Widzimy dwa rodzaje przepisów, a przepis możemy nazwać algorytmem. Jeśli mamy tutaj przykład różnych algorytmów dążących do tego samego celu to możemy użyć Strategii, prawda? Spójrzmy na schemat: Moglibyśmy zakończyć już nasze zadanie, ale przyjrzymy się bliżej naszym przepisom, przecież oba przedstawiają podobny schemat, a co za tym idzie mamy sporo skopiowanego kodu i tym samym nie stosujemy reguły DRY (Don t Repeat Yourself). Na pomoc przychodzi konkretny wzorzec projektowy, jest nim Metoda Szablonowa! 4. Metoda Szablonowa i PizzaMaker Metoda Szablonowa określa szkielet algorytmu i pozostawia doprecyzowanie niektórych jego kroków podklasom. Umożliwia modyfikacje niektórych etapów algorytmu i podklasach bez zmiany jego struktury. Jak ten wzorzec nam pomoże? Najpierw zróbmy coś z naszymi przepisami. Istnieje kolejna pomocna reguła projektowania: ŁUKASZ KIEŁCZYKOWSKI 7

Refaktoryzacja w celu uogólnienia. Za jej przykładem zrefaktorujmy nasze przepisy, by uzyskać ogólny przepis robienia pizzy. Pizza: 1. Przygotuj ciasto. 2. Dodaj sos. 3. Dodaj dodatki. 4. Dodaj przyprawy. 5. Upiecz. Jest kilka kroków, które różnią się szczegółami, ale główna idea/cel jest taki sam, jak, np. przygotuj ciasto. Tworząc z tego przepisu klasę ogólną z punków od 1. do 5. tworzymy metody abstrakcyjne, dzięki temu, nasze klasy potomne zostaną zmuszone do ich implementacji. To są te kroki algorytmu, które są zmienne w zależności od pizzy. Dodatkowo klasa udostępnia metodę PreparePizza, która służy do faktycznego uruchomienia algorytmu i przygotowania pizzy. W tym momencie jednak nie mamy wielkiego zysku z tego co zrobiliśmy, ponieważ wszystkie metody są abstrakcyjne, prócz tego, że tylko klasa ogólna zna tak naprawdę kroki algorytmu, a klasy potomne implementują poszczególne jego punkty, ale tak być nie musi! Niektóre zachowania mogą mieć, np. wartość domyślną jak krok dodawania sosu pomidorowego, który jest najczęściej stosowany. W tym momencie pojawia się prawdziwa moc, tzw. haczyki (hook methods). Implementują one w klasie nadrzędnej zachowanie domyślne, które możemy nadpisać w klasie podrzędnej. Spójrzmy jak wygląda stworzenie pizz: Pisałem wcześniej, że w przypadku 5 abstrakcyjnych metod nie mamy zbytnio zysku, prócz tego, że tylko klasa nadrzędna zna kroki algorytmów. Jest to bardzo ważna własność, ponieważ jest to główna idea Metody Szablonowej, która kieruje się regułą: Nie dzwoń do nas, to my zadzwonimy do Ciebie! Jest to tzw. zasada Hollywood, znana również pod nazwą inversion of control (IoC). Oznacza to, że klasa podrzędna implementująca wszystkie/niektóre kroki algorytmu nie wywołuje ich ze swojego kodu, nie uruchamia algorytmu. Wywołaniem zajmuje się klasa nadrzędna, która zna przebieg algorytmu, a klasa podrzędna działa jako klient. Przyjrzyjmy się schematowi UML naszej hierarchii: ŁUKASZ KIEŁCZYKOWSKI 8

5. Pytania na kolokwium 1. Podaj ogólną idee dependency injection i inversion of control. 2. Jak nazywają się metody umożliwiające nadpisanie w klasie podrzędnej we wzorcu Metoda Szablonowa? 3. Jakimi regułami kierują się wzorce Strategia i Metoda Szablonowa? ŁUKASZ KIEŁCZYKOWSKI 9