21.02.2015 Views

Style programowania - krótki przeglad

Style programowania - krótki przeglad

Style programowania - krótki przeglad

SHOW MORE
SHOW LESS

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 />

˛

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!