Style programowania - krótki przeglad ˛ Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 [email protected] c 2005–2008 Bogdan Kreczmer? Copyright ? Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udostepniony ˛ pod warun- kiem wykorzystania wyłacznie ˛ do własnych prywatnych potrzeb i może on być kopiowany wyłacznie ˛ w całości, razem z niniejsza˛ strona˛ tytułowa. ˛ 1 Ważniejsze style programowania • Programowanie proceduralne Nacisk kładzie sie˛ na przetwarzanie, tzn. zbudowania algorytmu potrzebnego do wykonania wymaganych obliczeń. • Programowanie modularne Uwypukla powiazanie ˛ danych z procedurami oraz ukrywa dane, które wykorzystywane sa˛ tylko w pewnych blokach obliczeniowych reprezentowanych przez moduły. • Programowanie z abstrakcja˛ danych Zakłada możliwość definiowania typów, które maja˛ te same własności jak typy wbudowane. • Programowanie obiektowe Tworzenie struktur pochodnych poprzez dziedziczenie z możliwościa˛ modyfikacji dzieki ˛ polimorfizmowi. Hermetyzacja wybranych struktur. • Programowanie uogólnione Umożliwia tworzenie parametryzowanych struktur i funkcji/procedur, dla których parametrami jest typ danych. Style programowania - krótki przeglad ˛ 2 Programowanie z wykorzystaniem podprogramów Styl charakterystyczny dla przypadku wykorzystywania asemblera oraz wczesnej wersji Basic’a. Style programowania - krótki przeglad ˛ 3 Programowanie z wykorzystaniem podprogramów Wielość wzajemnych powiaza ˛ ń prowadzi do tworzenia sie˛ nieczytelnych konstrukcji programów. Style programowania - krótki przeglad ˛ 4 Programowanie z wykorzystaniem podprogramów Zmienne lokalne poprawiaja˛ wykorzystanie pamieci ˛ oraz czytelność programu. Style programowania - krótki przeglad ˛ 5 Programowanie proceduralne Paradygmat programowania proceduralnego: Zdecyduj jakie chcesz mieć procedury; stosuj najlepsze algorytmy jakie możesz znaleźć. Przykład jezyków ˛ programowania wspierajacych ˛ ten paradygmat: Pascal, C, Java, C++, Python, Perl itd. Style programowania - krótki przeglad ˛ 6 Programowanie proceduralne Podstawowe wady “czystego” programowania proceduralnego. • Brak możliwości wyróżnienia powiaza ˛ ń miedzy ˛ strukturami danych, a procedurami operujacymi ˛ na nich. • Konieczność stosowania różnych nazw procedur nawet w przypadku, gdy wykonuja˛ te same operacje, a jedyna˛ różnica˛ jest typ danych, na których wykonywana jest ta operacja. • Umieszczanie wszystkich elementów w jednakowym obszarze zasiegu ˛ ważności definicji uniemożliwia “hermetyzacje” ˛ wybranych partii programy i łatwego rozdzielenia całego zadania na poszczególne podzadania. Style programowania - krótki przeglad ˛ 7 Programowanie modularne Zbiór powiazanych ˛ ze soba˛ procedur, struktur danych oraz zmiennych nazywamy modułem. W tym sensie moduł realizuje centralizacje˛ struktur danych oraz procedur i funkcji obsługujacych ˛ wspomniane struktury danych. Style programowania - krótki przeglad ˛ 8 Programowanie modularne Ten typ programowania pozwala ukryć pomocnicze funkcje i struktury danych. Możliwe jest dość precyzyjne określenie co jest udostepniane ˛ na “zewnatrz” ˛ i z czego dany moduł korzysta. Pozwala to ukryć ewentualne późniejsze modyfikacje struktur wewnetrznych. ˛ Style programowania - krótki przeglad ˛ 9 Programowanie modularne Paradygmat programowania modularnego: Zdecyduj jakie chcesz mieć moduły; podziel program w taki sposób, aby ukryć dane w modułach. Przykład jezyków ˛ programowania wspierajacych ˛ ten paradygmat: Modula 2, Ada, C, Java, C++ Style programowania - krótki przeglad ˛ 10 Programowanie modularne (najważniejsze cechy) • Ukrywanie funkcji, struktur danych oraz zmiennych majacych ˛ znacznie lokalne w danym module • Możliwość całkowitego ukrycia “udostepnianych” ˛ struktur danych. Na zewnatrz ˛ modułu widoczne sa˛ jedynie ich cechy i własności. Odwoływanie sie˛ do konkretnego egzemplarza tworzonej struktury danych realizowane jest poprzez deskryptory. Wada˛ tej techniki jest brak możliwości kontroli zgodności typów na etapie kompilacji. • Możliwość odizolowania sie˛ od nazw funkcji i zmiennych modułu używanych w innych modułach. • Możliwość precyzyjnego określenia co z danego modułu jest widoczne i udostepniane ˛ na zewnatrz, ˛ a co nie. Mechanizm ten pozwala również określić co dany moduł importuje z innych modułów. • Łatwiejsza organizacja pracy zespołowej. Style programowania - krótki przeglad ˛ 11 Programowanie modularne Programowanie modularne umożliwia centralizacje˛ wszystkich danych jednego typu pod kontrola˛ jednego modułu bed ˛ acego ˛ zarzadc ˛ a˛ danego typu. Daje to jednak wciaż ˛ znaczaco ˛ gorsze wsparcie niż dla typów wbudowanych. Wady czystego programowania modularnego: • brak możliwości stosowania operatorów, • w przypadku stosowania deskryptorów brak możliwości ścisłej kontroli typów na poziomie kompilacji, • brak możliwości określenia dopuszczalności domyślnych konwersji oraz ich zdefiniowania. Style programowania - krótki przeglad ˛ 12 Abstrakcja typów danych Podejście oparte na abstrakcji danych pozwala traktować na równi typy wbudowane i typy definiowane przez programiste. ˛ Pozwala również bezpośrednio odwoływać sie˛ do struktur danych i dokonywanych na nich operacji. Style programowania - krótki przeglad ˛ 13 Abstrakcja typów danych Paradygmat programowania z zastosowaniem abstrakcji danych: Zdecyduj jakie chcesz mieć typy; dla każdego typu dostarcz pełny zbiór operacji. Przykład jezyków ˛ programowania wspierajacych ˛ ten paradygmat: Ada, Clu, C++ Style programowania - krótki przeglad ˛ 14 Abstrakcja typów danych Programowanie z wykorzystaniem abstrakcji danych pozwala na tworzenie struktur, które moga˛ być dobrze izolowane od reszty programu. Zawieraja˛ one zarówno odpowiednie pola danych, jak też zdefiniowane metody i operacje dokonywane na nich. Style programowania - krótki przeglad ˛ 14 Abstrakcja typów danych Programowanie z wykorzystaniem abstrakcji danych pozwala na tworzenie struktur, które moga˛ być dobrze izolowane od reszty programu. Zawieraja˛ one zarówno odpowiednie pola danych, jak też zdefiniowane metody i operacje dokonywane na nich. Podstawowa˛ wada˛ jest brak elastyczności. Style programowania - krótki przeglad ˛ 14 Abstrakcja typów danych Programowanie z wykorzystaniem abstrakcji danych pozwala na tworzenie struktur, które moga˛ być dobrze izolowane od reszty programu. Zawieraja˛ one zarówno odpowiednie pola danych, jak też zdefiniowane metody i operacje dokonywane na nich. Podstawowa˛ wada˛ jest brak elastyczności. Przykład: Konstruujac ˛ typy MacierzWJ (transformacje wektorów wyrażonych we współrz˛ednych jednorodnych) oraz Macierz4x4 należy zdefiniować oddzielne struktury danych wraz z metodami i operacjami, choć MacierzWJ jest jedynie uszczegółowieniem typu Macierz4x4. Style programowania - krótki przeglad ˛ 15 Programowanie obiektowe Podejście oparte na podejściu obiektowym umożliwia budowanie nowych typów danych na bazie wcześniej zdefiniowanych struktur. Style programowania - krótki przeglad ˛ 16 Programowanie obiektowe Paradygmat programowania obiektowego: Zdecyduj jakie chcesz mieć klasy; dla każdej klasy dostarcz pełny zbiór operacji; korzystajac ˛ z mechanizmu dziedziczenia, jawnie wskaż to, co jest wspólne. Przykład jezyków ˛ programowania wspierajacych ˛ ten paradygmat: C++, Java, Python Style programowania - krótki przeglad ˛ 17 Programowanie obiektowe Podstawowe cechy programowania obiektowego: dziedziczenie – możliwość tworzenia nowych struktur danych z wykorzystaniem struktur wcześniej zdefiniowanych wraz ze wszystkimi ich atrybutami i metodami. Style programowania - krótki przeglad ˛ 17 Programowanie obiektowe Podstawowe cechy programowania obiektowego: dziedziczenie – możliwość tworzenia nowych struktur danych z wykorzystaniem struktur wcześniej zdefiniowanych wraz ze wszystkimi ich atrybutami i metodami. hermetyzacja – możliwość ograniczanie dostepu ˛ do wybranych struktur danych. Pozwala to definiować ściśle określony interfejs dostepu ˛ do tych struktur. Style programowania - krótki przeglad ˛ 17 Programowanie obiektowe Podstawowe cechy programowania obiektowego: dziedziczenie – możliwość tworzenia nowych struktur danych z wykorzystaniem struktur wcześniej zdefiniowanych wraz ze wszystkimi ich atrybutami i metodami. hermetyzacja – możliwość ograniczanie dostepu ˛ do wybranych struktur danych. Pozwala to definiować ściśle określony interfejs dostepu ˛ do tych struktur. polimorfizm – możliwość modyfikacji metod (określanych mianem metod wirtualnych) w strukturach bazowych poprzez ich redefiniowanie w strukturach pochodnych. Style programowania - krótki przeglad ˛ 18 Programowanie obiektowe Czy programowanie obiektowe może mieć jakieś wady ? Style programowania - krótki przeglad ˛ 18 Programowanie obiektowe Czy programowanie obiektowe może mieć jakieś wady ? Ależ tak ! Jest wciaż ˛ mało elastyczne !!!! :-0 Style programowania - krótki przeglad ˛ 18 Programowanie obiektowe Czy programowanie obiektowe może mieć jakieś wady ? Ależ tak ! Jest wciaż ˛ mało elastyczne !!!! :-0 We wcześniejszym przykładzie typy Macierz4x4 i MacierzWJ zostały zdefiniowane dla typu float. Aby zdefiniować je dla typu double należy wszystko na nowo przepisać. :-( Style programowania - krótki przeglad ˛ 18 Programowanie obiektowe Czy programowanie obiektowe może mieć jakieś wady ? Ależ tak ! Jest wciaż ˛ mało elastyczne !!!! :-0 We wcześniejszym przykładzie typy Macierz4x4 i MacierzWJ zostały zdefiniowane dla typu float. Aby zdefiniować je dla typu double należy wszystko na nowo przepisać. :-( Czy nie można byłoby stworzyć ogólnych mechanizmów nie tylko definiowania struktur, ale również pisania funkcji, np. funkcji umożliwiajacych ˛ sortowanie dowolnych struktur bez konieczności dokonywania rzutowania lub konwersji typów? Style programowania - krótki przeglad ˛ 19 Programowanie uogólnione Przykład z biblioteki C realizacji uogólnionych algorytmów dla tworzenia, manipulowania i przeszukiwania struktury drzewa binarnego. #include <search.h> void *tsearch(const void *key, void **rootp, int(*compar)(const void *, const void *)); void *tfind(const void *key, const void **rootp, int(*compar)(const void *, const void *)); void *tdelete(const void *key, void **rootp, int(*compar)(const void *, const void *)); void twalk(const void *root, void(*action)(const void *nodep, const VISIT which, const int depth)); Style programowania - krótki przeglad ˛ 20 Programowanie uogólnione Programowanie uogólnione pozwala tworzyć uniwersalne struktury, w których nie ma (lub sa˛ one zminimalizowane) ograniczeń na typ pól. Daje możliwość skoncentrowania sie˛ na ogólnych mechanizmach manipulowania strukturami danych. Można stworzyć np. wzorzec listy. Style programowania - krótki przeglad ˛ 21 Programowanie uogólnione Konkretyzacja typu nastepuje ˛ w momencie odwołania sie˛ do wzorca wraz ze wszystkimi parametrami. Sa˛ one nazwami typów składowych. Odwołanie nastepuje ˛ wraz z deklaracja˛ obiektu danej klasy. Nazwe˛ typu można czynić bardziej wygodna˛ używajac ˛ typedef. Style programowania - krótki przeglad ˛ 22 Programowanie uogólnione Paradygmat programowania uogólnionego: Zdecyduj jakie chcesz mieć algorytmy; parametryzuj je w taki sposób, by działały dla różnych typów i struktur. Style programowania - krótki przeglad ˛ 22 Programowanie uogólnione Paradygmat programowania uogólnionego: Zdecyduj jakie chcesz mieć algorytmy; parametryzuj je w taki sposób, by działały dla różnych typów i struktur. Przykład jezyków ˛ programowania wspierajacych ˛ ten paradygmat: C++ Programowanie uogólnione jest podstawowa˛ technika˛ programowania użyta˛ przy tworzeniu standardowej biblioteki szablonów (STL), która jest jednym z podstawowych składników ANSI/ISO C++. Style programowania - krótki przeglad ˛