Programowanie modularne
Transkrypt
Programowanie modularne
Style programowania - krótki przeglad ˛ Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 [email protected] c 2005 Bogdan Kreczmer? Copyright ? Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udostepiony ˛ 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 ninijesza˛ 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. 2 Programowanie z wykorzystaniem podprogramów Styl charakterystyczny dla przypadku wykorzystywania asemblera oraz wczesnej wersji Basic’a. 3 Programowanie z wykorzystaniem podprogramów Wielość wzajemnych powiaza ˛ ń prowadzi do tworzenia sie˛ nieczytelnych konstrukcji programów. 4 Programowanie z wykorzystaniem podprogramów Zmienne lokalne poprawiaja˛ wykorzystanie pamieci ˛ oraz czytelność programu. 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. 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. 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. 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. ˛ 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++ 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. 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. 12 Abstrakcja typów danych Podejście oparte na abstrakcji danych pozwala traktować na równi typy wbudowane i typy definiowane przez programista. Pozwala również bezpośrednio odwoływać sie˛ do struktur danych i dokonywanych na nich operacji. 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++ 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. 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. 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. 15 Programowanie obiektowe Podejście oparte na abstrakcji danych pozwala traktować na równi typy wbudowane i typy definiowane przez programista. Pozwala również bezpośrednio odwoływać sie˛ do struktur danych i dokonywanych na nich operacji. 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 17 Programowanie obiektowe Podstawowe cechy programowania obiektowego: dziedziczenie – możliwość tworzenia nowych struktur danych poprzez struktur wcześniej zdefiniowanych wraz ze wszystkimi ich atrybutami i metodami. 17 Programowanie obiektowe Podstawowe cechy programowania obiektowego: dziedziczenie – możliwość tworzenia nowych struktur danych poprzez 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. 17 Programowanie obiektowe Podstawowe cechy programowania obiektowego: dziedziczenie – możliwość tworzenia nowych struktur danych poprzez 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. 18 Programowanie obiektowe Czy programowanie obiektowe może mieć jakieś wady ? 18 Programowanie obiektowe Czy programowanie obiektowe może mieć jakieś wady ? Ależ tak ! Jest wciaż ˛ mało elastyczne !!!! :-0 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ć. :-( 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? 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)); 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. 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. 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. 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++.