Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Pobierz materiał do EPUB Pobierz materiał do MOBI Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

Wybrane paradygmaty programowania

Zanim przystąpimy do omawiania paradygmatów programowania, wyjaśnijmy co oznacza samo pojęcie paradygmat.

Greckie słowo parádeigma oznacza wzór lub przykład. Według filozofa Thomasa Kuhna paradygmaty są zbiorami pojęć i teorii składających się na podstawy określonej dziedziny nauki. W ujęciu programistycznym termin paradygmat jest używany w celu określenia zbioru mechanizmów, które są dostępne podczas pisania programu. Niektóre z takich mechanizmów programista może zdefiniować poprzez narzucone przez niego dobre praktyki oraz język programowania, który dostarcza konstrukcji ułatwiających tworzenie kodu. Wybierając dany paradygmat programowania, programista określa sposób realizacji przepływu sterowania i wykonywania programu komputerowego.

Początkowo programy wykorzystywały paradygmat programowania imperatywnego. Opisywały one proces wykonywania jako sekwencję niskopoziomowych instrukcji zmieniających stan programu. Programy z uwagi na stan zaawansowania technologicznego nie przypominały współczesnych aplikacji. Zadania, jakie miały zrealizować programy uruchamiane na pierwszych komputerach, sprowadzały się do wykonania sekwencji instrukcji i podania końcowego wyniku.

W miarę upływu czasu i rozwoju technologii zmieniały się zadania stawiane komputerom, a programy stawały się bardziej skomplikowane. Pojawiła się potrzeba pisania czytelnego kodu. Powstawały wzorce programowania, czyli paradygmaty – dostosowywano je do rozwiązywania coraz to nowych problemów.

Obecnie można wyróżnić wiele paradygmatów programowania. Omówimy kilka z nich:

  • programowanie strukturalne,

  • programowanie proceduralne,

  • programowanie funkcyjne,

  • programowanie obiektowe.

Programowanie strukturalne

Programowanie strukturalne polega na podziale kodu na hierarchicznie ułożone bloki z jednym punktem wejścia i jednym lub wieloma punktami wyjścia. Wprowadzone zostały konstrukcje blokowe (typu if...then...else, pętli: while, for, repeat) oraz podprogramy – zestawy instrukcji, których wykonanie można zlecić w dowolnym momencie. Wykorzystanie takich elementów pozwala zrezygnować z posługiwania się instrukcjami skoków warunkowych lub bezwarunkowych (takich jak goto w języku C), których użycie jest konieczne w kodzie maszynowymkod maszynowykodzie maszynowym.

Dzięki wprowadzeniu konstrukcji blokowych program lepiej odzwierciedla schemat blokowy, a w rezultacie staje się bardziej czytelny. Istotne jest także wyeliminowanie z kodu instrukcji skoków – ich nieprzemyślane użycie może powodować błędy w działaniu programu.

Strukturalność zakłócają instrukcje break oraz continue, które przerywają pętle. Działają one jak niezalecane instrukcje skoków. Używamy ich jednak, gdyż potrafią podnieść czytelność kodu. Należy jednak uważać przy ich stosowaniu, aby nie utworzyć ukrytych pułapek w programie. Zaleca się stosowanie tych instrukcji na początku lub końcu bloku, z którego mają nas wyprowadzić.

Programowanie proceduralne

Programowanie proceduralne jest rozwinięciem programowania strukturalnego. W kodzie pojawiają się wywołania procedur, które zastępują podprogramy. Procedura jest rozszerzeniem podprogramu – pozwala na przekazywanie mu parametrów. Dzięki temu rezygnuje się ze sztywno zdefiniowanych bloków kodu, zyskując większą elastyczność i możliwość odmiennego działania podprogramów, zależną od przekazanych parametrów.

Programowanie funkcyjne

Programowanie funkcyjne swoje początki zawdzięcza powstaniu rachunku lambdarachunek lambdarachunku lambda. Znaczącym krokiem w rozwoju programowania było zaimplementowanie w językach programowania funkcji matematycznych. Pojęcie funkcja oznacza procedurę mogącą zwracać pewną wartość. Ułatwiło to tworzenie funkcji rekurencyjnych. W rezultacie przestaje nas interesować, w jaki sposób działa podprogram (procedura/funkcja). Ważny jest rezultat działania, czyli zwracana wartość.

Programowanie obiektowe

W przypadku omówionych dotychczas technik programowania dane są oddzielone od funkcji (podprogramów). Funkcji służącej do dodawania dwóch liczb możemy przekazać dowolne dwie zmienne całkowite lub zmiennoprzecinkowe – i otrzymamy wynik. W przypadku programowania obiektowego jest inaczej.

Samo pojęcie obiekt oznacza kontener na dane (zmienną lub zestaw zmiennych – mogą być one różnych typów), któremu towarzyszą funkcje zaprojektowane specjalnie w celu przetwarzania zawartości kontenera. Oficjalna definicja obiektu brzmi następująco: jest to element łączący stan (dane) z opisem ich zachowania (funkcjami).

Posłużmy się przykładem: kontener zawiera trzy liczby zmiennoprzecinkowe, a zdefiniowano dla niego funkcje obliczania sum i iloczynów liczb oraz wyznaczania wyróżnika równania kwadratowego z wszystkich elementów. Co istotne, żadna spośród trzech wymienionych funkcji nie może być wywołana dla dowolnych zmiennych, lecz wyłącznie dla liczb wchodzących w skład obiektu (czyli zapisanych w kontenerze). Definicja przytoczonego kontenera może być następująca:

Linia 1. Klasa TrzyLiczby. Linia 2. zmienne całkowite a przecinek b przecinek c. Linia 4. metoda suma otwórz nawias okrągły zamknij nawias okrągły. Linia 5. zwróć a plus b plus c. Linia 7. metoda iloczyn otwórz nawias okrągły zamknij nawias okrągły. Linia 8. zwróć a asterysk b asterysk c. Linia 10. metoda wyróżnik podkreślnik równania podkreślnik kwadratowego otwórz nawias okrągły zamknij nawias okrągły. Linia 11. zwróć b asterysk b minus 4 asterysk a asterysk c.

Gdzie metoda jest funkcją, która zawsze jest własnością obiektu. Co oznacza, że nie może istnieć metoda bez przypisanego do niej obiektu.

Istotą programowania obiektowego jest budowanie aplikacji z komunikujących się ze sobą obiektów. Taka metoda sprawdza się podczas pisania współczesnych programów, wyposażonych zazwyczaj w interfejs graficzny. Składa się on z wielu współpracujących ze sobą elementów: okien, przycisków, list jedno- lub wielokrotnego wyboru itp. Dla potrzeb narzędzi służących do pisania programów zgodnie z paradygmatem obiektowym tworzone są obszerne biblioteki zawierające gotowe obiekty, które można dowolnie wykorzystywać.

Słownik

kod maszynowy
kod maszynowy

zestaw rozkazów, za których wykonanie odpowiada bezpośrednio procesor; składa się z ciągu zer i jedynek, które są interpretowane jako rozkazy i ich argumenty; generowany jest w procesie kompilacji lub w wyniku wykonywania kodu interpretowanego

makro assembler
makro assembler

niskopoziomowy język programowania; w odróżnieniu od klasycznego assemblera, w którym używamy tylko instrukcji procesora, makro assembler zawiera uproszczone konstrukcje (makra), które dopiero później są zamieniane na instrukcje procesora

rachunek lambda
rachunek lambda

formalny system logiki matematycznej wprowadzony w latach 30. XX w. przez matematyka Alonzo Churcha; służy do badania zagadnień związanych z podstawami matematyki; algorytmy zapisane w rachunku lambda można zaimplementować na maszynie Turinga

rejestr procesora
rejestr procesora

obszar pamięci znajdujący się wewnątrz procesora, służący do przechowywania danych tymczasowych; procesor kopiuje dane z pamięci do rejestru w celu ich przetwarzania