Programowanie uogólnione
Z Wikipedii
Programowanie uogólnione (ang. Generic Programming) pozwala na pisanie kodu programu bez wcześniejszej znajomości typów danych, na których kod ten będzie pracował. Obecnie wiele języków programowania ma możliwość wykorzystywania uogólnień, np. C++, Java, Haskell.
[edytuj] Programowanie uogólnione w C++
Przykładowa deklaracja uogólnionego kodu w języku C++ wygląda następująco:
template<typename T> class List { ... };
gdzie T oznacza nieskonkretyzowany typ danych. W C++ takie uogólnienia nazywają się wzorcami (lub szablonami, ang. templates). W powyższej definicji klasy zamiast konkretnego typu danych użyto symbolu T. Powyższy wzorzec można wykorzystać następująco:
List<int> lista1; List<MojaKlasa> lista_mojej_klasy; List<std::string> lista2;
Podczas kompilacji następuje tak zwana konkretyzacja (ang. instantiation), podczas której kompilator na podstawie typów danych przekazanych wzorcowi generuje kod właściwy do obsługi danego typu.
Jedną z najbardziej znanych i najbardziej udanych aplikacji programowania uogólnionego jest standardowa biblioteka szablonów (STL). Od 1998 roku stanowi ona fragment biblioteki standardowej języka C++ i zawiera definicje licznych algorytmów (np. sort
) i pojemników (np. vector
i list
), które charakteryzują się wysoką sprawnością i łatwością użycia.
W języku C++ szablony stanowią też wygodny zamiennik dla makr preprocesora — nie tylko poprawiają czytelność kodu, ale także ułatwiają wyszukiwanie w nim błędów.
[edytuj] Zalety szablonów w C++
Wykorzystanie szablonów w programach pozwala skupić się bardziej na algorytmach niż na danych jakie są przetwarzane. Użycie szablonów pozwala zredukować ilość nadmiarowego kodu ponieważ jedną funkcjonalność można zaprogramować dla wielu typów danych. Następnie kompilator w konkretnym przypadku precyzuje typ i odpowiednio dostosowuje np. wywołania funkcji.
[edytuj] Krytyka szablonów w C++
Działanie szablonów w języku C++ przypomina bardzo zaawansowane makra preprocesora. Powoduje to, że kompilator ma zasadnicze trudności z wygenerowaniem prawidłowych, czytelnych komunikatów diagnostycznych w przypadku błędnego użycia poprawnego szablonu. Większość z nich dotyczy bowiem (poprawnego!) kodu bibliotecznego, co wprowadza programistę w konsternację. Jedyne użyteczne informacje diagnostyczne dotyczą miejsc konkretyzacji szablonu.
Powyższy problem spowodowany jest tym, że błędy z reguły dotyczą sposobu użycia szablonu, natomiast diagnostyka włączana jest dopiero po jego konkretyzacji, a więc zasadniczo w innym miejscu niż szablon ten jest faktycznie używany. Stąd wrażenie, że błędy znajdują się w bibliotekach, a nie w programie, który ich błędnie używa.
Pewną receptą na powyższy problem są tzw. koncepty. Obecnie są one popularnym rozszerzeniem wielu kompilatorów i prawdopodobnie pojawią się w nowym standardzie języka C++ (tzw. C++0x).