Style programowania

advertisement
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
˛
Download