W poprzednim wpisie poruszaliśmy temat paradygmatów programowania. Dziś przedstawimy subiektywnie popularne paradygmaty programowania w C++.
Paradygmaty
Język C++ jest językiem umożliwiający bardzo swobodne projektowanie oraz programowanie. W zasadzie obowiązuje tylko jedna reguła, która jest zgodna z paradygmatem programowania imperatywnego: to co zostało zaprogramowane zostanie w takiej formie wykonane przez procesor. Pozostałe paradygmaty programowania są dobrowolne i stosowane według uznania.
Programowanie proceduralne
Paradygmat wskazuje, że program powinien być podzielony na podprogramy. W C++ podprogramy modelowane są w postaci funkcji – bloków kodu z przypisanym identyfikatorem. Każdy poprawny program musi posiadać jedną ściśle określoną funkcję main. Po spełnieniu tego wymogu cały program może być umieszczony właściwie w tej funkcji. Ponadto język umożliwia programowanie w kodzie maszynowym (dyrektywa asm) bez korzystania z pozostałych możliwości języka C++.
Programowanie strukturalne
Paradygmat zakazuje używania instrukcji skoku oraz wprowadza instrukcje warunkowe oraz pętle. Trudno wyobrazić sobie nietrywialny program bez instrukcji warunkowych oraz pętli, ale w języku dostępna jest zakazana instrukcja skoku goto, zatem wystarczy wykorzystać tą instrukcję, aby program był niezgodny z tym paradygmatem. Ponadto opisywana we wpisie technika return early może być traktowana jako niezgodna z tym paradygmatem.
Programowanie obiektowe
Jak nie programować obiektowo w C++? Wystarczy nie wykorzystywać klas, jednak jest to trudne, ponieważ podstawowa biblioteka języka – STL – w dużej mierze oparta jest na klasach. Jednocześnie używanie klas nie oznacza, że program automatycznie staje się zorientowany obiektowo w sposób poprawny. Programowanie obiektowe poza klasami i obiektami to również sposób dekompozycji programu.
Programowanie uogólnione
Podobnie jak w przypadku programowania obiektowego, programowanie uogólnione jest podstawową funkcją języka C++. W języku realizowane jest poprzez dyrektywę template stosowaną w kontekście klas oraz funkcji. W C++ paradygmat ten określany jest mianem metaprogramownia, co może być mylące z paradygmatem metaprogramowania – programowanie uogólnione może być traktowane jako przypadek szczególny paradygmatu metaprogramowania.
Programowanie współbieżne, równoległe oraz rozproszone
Język C++ nie posiada wbudowanych mechanizmów programowania współbieżnego oraz równoległego. Mechanizmy te zapewnione są poprzez biblioteki udostępniające takie prymitywy jak wątki oraz blokady. Ponadto w języku nie rozróżnia się programowania współbieżnego od rozproszonego, ponieważ różnica polega wyłącznie na wykorzystaniu platformy: jednowątkowej lub wielowątkowej.
Programowanie rozproszone jest jeszcze w mniejszym stopniu związane z językiem C++, ponieważ do stworzenia programu działającego w architekturze rozproszonej wystarczy biblioteka dostarczająca funkcjonalność komunikacji sieciowej.
Programowanie zorientowane zdarzeniowo
Podstawowym elementem paradygmatu jest zdarzenie. Zdarzenia kontrolują przepływ sterowania, który zdefiniowany jest poprzez funkcje obsługi tych zdarzeń. Wprowadzenie tego paradygmatu wiąże się z istotnym przemodelowaniem programu. Prominentnym przykładem wykorzystania tego paradygmatu jest biblioteka Qt służąca do tworzenia interfejsów graficznych.
Programowanie funkcyjne
Podstawowym założeniem tego paradygmatu jest czysta funkcja czyli funkcja, która nie zmienia stanu. W C++ może to być funkcja, metoda lub wyrażenie lambda. Język nie posiada wbudowanych mechanizmów gwarantujących niezmienność stanów funkcji. Jedyną wskazówką i ograniczeniem jest modyfikator const, jednak zmiana stanu obiektu w takiej metodzie może być dokonana między innymi poprzez modyfikator mutable lub wyrażenie const_cast. W przypadku normalnych funkcji nie istnieje żaden mechanizm ograniczający zmianę stanu.
Podsumowanie
Język C++ jest językiem możliwości. Sprzyja stosowaniu wielu paradygmatów, jednak nierzadko należy dołożyć starań, aby paradygmat był poprawnie zastosowany.
Twój zespół potrzebuje wsparcia we wdrożeniu paradygmatów w C++?
Leave a Reply