Pułapki programowania obiektowego. Adam Sawicki stycznia 2011

Podobne dokumenty
Problem Próby rozwiązania Maszyna stanów Inne zastosowania Podsumowanie. Maszyny stanów. Programowanie gier bez Unity, cz. 3.

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

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

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

Programowanie obiektowe - 1.

Podstawy Programowania Obiektowego

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

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

Technologie i usługi internetowe cz. 2

Projektowanie obiektowe oprogramowania Wykład 5 wzorce strukturalne Wiktor Zychla 2016

Programowanie obiektowe

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

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

Listy powiązane zorientowane obiektowo

Programowanie obiektowe

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

Podstawy Języka Java

Programowanie obiektowe

Programowanie obiektowe

Programowanie Zespołowe

Szablony funkcji i szablony klas

Programowanie obiektowe

Programowanie obiektowe i zdarzeniowe

Programowanie obiektowe

Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h

Programowanie obiektowe

Projektowanie klas c.d. Projektowanie klas przykład

Analiza i projektowanie aplikacji Java

Zaawansowane programowanie w języku C++ Programowanie obiektowe

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

Programowanie obiektowe

Modelowanie obiektowe

POLITECHNIKA POZNAŃSKA. Programowanie systemów informatycznych LAB 30h

Wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Programowanie obiektowe

C++ - [4-7] Polimorfizm

W powyższym kodzie utworzono wyliczenie dni tygodnia.

Zaawansowane programowanie w C++ (PCP)

Język programowania. Andrzej Bobyk

Wprowadzenie do programowania aplikacji mobilnych

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Zasady programowania Dokumentacja

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Zaawansowane programowanie w C++ (PCP)

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

Modelowanie i Programowanie Obiektowe

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

Laboratorium 02: Obiektowe modelowanie dziedziny [2h]

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Kurs WWW. Paweł Rajba.


Programowanie obiektowe

Brain Game. Wstęp. Scratch

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

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

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Analiza i projektowanie obiektowe 2016/2017. Wykład 10: Tworzenie projektowego diagramu klas

Enkapsulacja, dziedziczenie, polimorfizm

Kurs programowania aplikacji bazodanowych

Podstawy programowania w języku C i C++

Kurs programowania. Wykład 12. Wojciech Macyna. 7 czerwca 2017

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Programowanie gier eventy. Dalton & Cartman KNTG Polygon, 21 grudnia 2015 r.

Wprowadzenie do szablonów szablony funkcji

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Metody Metody, parametry, zwracanie wartości

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie obiektowe

Paradygmaty programowania. Paradygmaty programowania

Programowanie komputerowe. Zajęcia 7

Wprowadzenie do szablonów szablony funkcji

Czym są właściwości. Poprawne projektowanie klas

Programowanie obiektowe język C++

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

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

Klasy abstrakcyjne i interfejsy

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

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

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

Java Język programowania

Wstęp do programowania obiektowego. Wykład 2

Programowanie obiektowe w języku

Podstawy inżynierii oprogramowania

10. Programowanie obiektowe w PHP5

Języki i techniki programowania Ćwiczenia 4 Wzorce

Klasy abstrakcyjne, interfejsy i polimorfizm

Materiały do zajęć VII

Języki programowania imperatywnego

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Wykład 8: klasy cz. 4

Programowanie obiektowe

Szablony funkcji i klas (templates)

Programowanie obiektowe

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

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

Programowanie obiektowe Wykład 1. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Transkrypt:

Pułapki programowania obiektowego Adam Sawicki - www.asawicki.info 2 stycznia 2011

Wstęp Programowanie obiektowe (ang. object-oriented programming, OOP) paradygmat, w którym programy tworzy się pisząc powiązane ze sobą klasy obiektów łączących kod z danymi i reprezentujących pewne byty modelowanego problemu W tym: Enkapsulacja, Abstrakcja, Dziedziczenie, Polimorfizm Do tego: składnia w C++, wzorce projektowe, dobre praktyki, popularne zwyczaje Czy zawsze najlepsze? Chciałbym podjąć polemikę 2

Fanatyzm obiektowy Część I 3

Programowanie obiektowe OOP można rozważać na różnych płaszczyznach: Ideologiczna zasady programowania obiektowego i abstrakcyjne znaczenie jego założeń, Techniczna jak się używa programowania obiektowego w danym języku i jak ono działa, Praktyczna jak używać go w programach dla swojego pożytku, a nie tylko dla zasady. Tak jak ze wszystkim, nadmierna radykalność i ślepe poparcie bez myślenia rodzi fanatyzm, a to jest złe. 4

Przykład Gra w kółko i krzyżyk podejście obiektowe 1. Znajdujemy klasy identyfikując rzeczowniki 5

Przykład 2. Projektujemy powiązania między klasami 6

Przykład 3. Implementujemy klasy Co umieścić w tych klasach, żeby nie były puste??? W której klasie umieścić potrzebne dane i kod??? 7

Przykład Alternatywne podejście: Data-Oriented Design (DOD) Pytanie: Jakie dane powinna przechowywać gra? Tablica 3 x 3 pól Symbol Plansza[3][3]; Każde pole jest w jednym ze stanów: puste, kółko, krzyżyk enum Symbol { Pusty, Kolko, Krzyzyk }; Czyj jest teraz ruch: gracza 1 lub 2 int KtoryGracz; 8

Przykład Następnie pomyśleć, co po kolei kod powinien robić z tymi danymi Wykonanie ruchu przez gracza Sprawdzenie, czy ruch jest prawidłowy Wstawienie symbolu do tablicy Sprawdzenie, czy gracz wygrał Rozpoczęcie tury przeciwnego gracza 9

Wnioski Programowanie obiektowe nie jest idealne Niektórzy twierdzą nawet, że nie spełniło swoich założeń Modelowanie rzeczywistych obiektów? Co modeluje manager, helper, listener, obeserver, locker i inne -ery? Źle użyte działa przeciwko wydajności, jak też prostocie i czytelności kodu Warto je stosować, ale z rozwagą Znać i doceniać alternatywne możliwości Nie szukać gotowych klocków uciekając od myślenia 10

Mania wrapowania Część II 11

Mania wrapowania Wielu programistów czuje potrzebę, żeby naukę czy wykorzystanie w swoim programie jakiejś biblioteki zacząć od napisania własnej otoczki (wrappera) zamykającego jej interfejs. Robią to niemal odruchowo i bez zastanowienia, czy to potrzebne. Jakie argumenty za tym stoją? 12

Przykład 1 FMOD Biblioteka dźwiękowa FMOD wczytanie dźwięku WAV FMOD::Sound *Sound; FmodSystem->createSound( WavFileName, FMOD_LOOP_OFF FMOD_2D MOD_SOFTWARE, 0, &Sound); Jimmy jest przerażony, chce uprościć interfejs Te parametry są niepotrzebne Chcę mieć mniej parametrów Nie chcę sięgać do dokumentacji FMOD wolę własny interfejs 13

Przykład 1 FMOD Jimmy pisze własną klasę dźwięku, która zamyka FMOD::Sound class CSound { private: FMOD::Sound *Sound; public: void Load(const char *WavFileName); }; void CSound::Load(const char *WavFileName) { FmodSystem->createSound( WavFileName, FMOD_LOOP_OFF FMOD_2D FMOD_SOFTWARE, 0, &Sound); } 14

Przykład 1 FMOD Jimmy potrzebuje możliwości zapętlenia dźwięku Musi dodać parametr Loop Musi zamieniać parametr ze swojej postaci do postaci FMOD void CSound::Load(const char *WavFileName, bool Loop) { } FmodSystem->createSound( WavFileName, (Loop? FMOD_LOOP_NORMAL : FMOD_LOOP_OFF) FMOD_2D FMOD_SOFTWARE, 0, &Sound); 15

Przykład 1 FMOD Jimmy odkrywa odtwarzanie w dwie strony i też chce to zapewnić Musi zdefiniować własny enum LOOP_MODE Musi zamieniać swój enum na ten z FMOD enum LOOP_MODE { LOOP_MODE_NONE, LOOP_MODE_NORMAL, LOOP_MODE_BIDI }; void CSound::Load(const char *WavFileName, LOOP_MODE LoopMode) { unsigned LoopFlag = 0; switch (LoopMode) { case LOOP_MODE_NONE: LoopFlag = FMOD_LOOP_OFF; break; case LOOP_MODE_NORMAL: LoopFlag = FMOD_LOOP_NORMAL; break; case LOOP_MODE_BIDI: LoopFlag = FMOD_LOOP_BIDI; break; } FmodSystem->createSound(WavFileName, LoopFlag FMOD_2D FMOD_SOFTWARE, 0, &Sound); } 16

Przykład 1 FMOD Wreszcie duża część możliwości FMOD jest przepisana do własnego interfejsu Trzeba zrobić do niego własną dokumentację Zamiast flag FMOD trzeba pamiętać własne Jaka to różnica? Warto było??? 17

Przykład 2 DirectX Zrobię wrapper na DirectX, to potem będę mógł wymienić renderer na OpenGL bez modyfikowania kodu gry. 18

Przykład 2 DirectX Jakie jest prawdopodobieństwo, że P 1 skończysz kod swojej gry/silnika P 2 będziesz potrzebował mieć drugą implementację renderera P 3 uda się zaimplementować renderer w OpenGL bez większych zmian w jego interfejsie P 1 P 2 P 3 0 Znasz już dobrze zarówno DirectX, jak i OpenGL? Jeśli nie P 3 = 0 19

Przykład 3 WinAPI i MFC Ktoś w Microsoft: WinAPI jest niefajne, bo jest strukturalne. Napiszmy obiektową otoczkę. // WinAPI HDC hdc = GetWindowDC(hwnd); MoveToEx(hdc, 0, 0, NULL); LineTo(hdc, 100, 100); ReleaseDC(hdc); // MFC CDC *dc = wnd->getdc(); dc->moveto(0, 0); dc->lineto(100, 100); wnd->releasedc(dc); Czy to zrobiło aż tak dużą różnicę? Warto było??? Efekt? MFC to tylko cienka otoczka na WinAPI. Nikt go nie lubi. 20

Mania wrapowania Jaka wobec tego jest alternatywa? Bardzo prosta! W porę zastanowić się, czy nie wystarczy używać w swoim programie interfejsu danej biblioteki bezpośrednio. Napisać wrapper warto, kiedy zapewnia przynajmniej jedno z poniższych: Znacząco upraszcza interfejs Dodaje naprawdę dużo nowej funkcjonalności Wprowadza dużo wyższy poziom abstrakcji Faktycznie posiada kilka różnych implementacji 21

Podsumowanie DOD służy raczej do optymalizacji wydajności: kod bardziej przyjazny dla pamięci cache, kod łatwiejszy do zrównoleglenia, ale wielu odrzuca przedwczesną optymalizację nadinterpretując znany cytat Donalda Knutha, więc pokazałem tutaj, jak krytyczne spojrzenie na OOP może pomóc także w uproszczeniu kodu. 22

Bibliografia Fanatyzm obiektowy, Adam Sawicki http://www.asawicki.info/download/misc/fanatyzm_obiektowy.html Materiały o Data-Oriented Design Lista wkrótce na mojej stronie domowej 23