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