Nie tylko obiektowe. Mniej znane paradygmaty programowania
14.11.2024
Czy można pisać kod bez tworzenia klas i obiektów? Jakie są alternatywne podejścia do tworzenia programów komputerowych? Przeczytaj nasz artykuł.
Większość osób wstępnym etapie nauki kodowania poznaje podstawy programowania obiektowego, a swoje pierwsze programy pisze, dzieląc kolejne linijki na klasy. Obiektowość (OOP) to paradygmat programowania, który organizuje kod wokół struktur odzwierciedlających rzeczywiste byty i ich relacje. W OOP programiści tworzą modele oparte na koncepcji klas i obiektów. Takie podejście do pisania kodu jest współcześnie powszechnie stosowane. Głównie ze względu na to, że ułatwia zarządzanie złożonym oprogramowaniem i rozwijanie go, pozwala też wykorzystywać niektóre elementy kodu wiele razy. Czy jednak da się tworzyć programy w inny sposób? Jak wyglądają inne paradygmaty programowania? Na te pytanie odpowiadamy w kolejnych akapitach.
Czym jest paradygmat programowania?
Zanim jednak zaczniemy omawiać różne sposoby formułowania kodu, warto wyjaśnić pojęcie paradygmatu programowania. Jest to podejście do tworzenia programów i pisania kodu. Paradygmaty programowania nie są tym samym, co języki programowania, jednak mogą być z nimi związane. Niektóre języki programowania i technologie mogą w mniejszym lub większym stopniu bazować na określonym paradygmacie lub wybranych cechach.
Programowanie imperatywne
To paradygmat programowania, w którym polecenia, jakie działania ma wykonywać program, podawane są w bezpośredni sposób w formie instrukcji sterujących, np. instrukcji warunkowych lub pętli. Instrukcje przekładające się na kolejne działania w kodzie rozpisywane są krok po kroku. Programy imperatywne składają się z ciągu komend do wykonania. Wyobraź sobie prymitywny program składający się z samych if-ów. Tak, to właśnie ten przypadek. Przykładem kodu napisanego w paradygmacie imperatywnym może być:
suma = 0
for i in range(1, 6):
suma += i # Dodaj kolejne liczby do sumy
print("Suma liczb od 1 do 5:", suma)
Taki paradygmat przejawia się w wielu językach niskopoziomowych (np. Assembler), w których kod jest zbliżony do logiki działania kodu binarnego.
Programowanie proceduralne
Z paradygmatem proceduralnym mamy do czynienia wtedy, gdy tworzony program jest podzielony na procedury (czyli fragmenty wykonujące ściśle określone operacje), które mogą być wywoływane w różnych miejscach kodu. Pozwala to na dzielenie oprogramowania na moduły i łatwiejsze zarządzanie programami.
def sumuj(liczby):
suma = 0
for liczba in liczby:
suma += liczba
return suma
Taki kod przypomina nieco bardziej instrukcje w znanym Ci już programowaniu obiektowym, ponieważ podzielony jest na poszczególne funkcje. Ten paradygmat znajduje zastosowanie w aplikacjach systemowych i kompilatorach. Przykładem języka wykorzystującego procedury jest Pascal.
Programowanie funkcyjne
Programowanie funkcyjne to paradygmat, który koncentruje się na tworzeniu programów przy użyciu funkcji jako podstawowych jednostek wykonawczych, bez zmieniania stanu obiektów i danych globalnych. W przeciwieństwie do programowania imperatywnego, gdzie liczy się sekwencyjny przepływ i modyfikacja stanu, programowanie funkcyjne pozwala tworzyć programy, które traktują funkcje jako transformacje danych. W ten sposób unika się wielu efektów ubocznych przy wprowadzaniu zmian, co sprawia, że kod jest przewidywalny i łatwy do testowania.
Przykładem kodu funkcyjnego może być użycie funkcji wyższego rzędu, takiej jak map, która działa na listach bez zmiany ich zawartości:
liczby = [1, 2, 3, 4, 5] kwadraty = list(map(lambda x: x ** 2, liczby)) print("Kwadraty liczb:", kwadraty)
Kod funkcyjny jest charakterystyczny dla języków takich jak Haskell czy Lisp, ale również Python i Scala pozwalają wykorzystywać elementy programowania funkcyjnego. Podejście funkcyjne jest popularne w przetwarzaniu danych i uczenia maszynowego, gdzie czystość funkcji pomaga w pisaniu kodu odpornego na błędy.
Programowanie deklaratywne
W programowaniu deklaratywnym opisujemy, co chcemy osiągnąć, a nie jak to osiągnąć. W paradygmacie deklaratywnym programista tworzy kod, który bardziej przypomina deklaracje zapytań niż instrukcje krok po kroku. Powszechnie znanym przykładem tego podejścia jest SQL, język zapytań baz danych, który opisuje, jakie dane chcemy pobrać bez szczegółowego określania sposobu ich znalezienia:
SELECT imie, nazwisko FROM pracownicy WHERE stanowisko = 'Manager';
W podanej linijce SQL powiedzieliśmy programowi: “Z bazy danych pracownicy pobierz kolumny imie i nazwisko, w przypadku, gdy pozycja w kolumnie stanowisko to Manager”. Zauważ, że przekazujemy programowi instrukcje w bardzo bezpośredni sposób — wskazujemy konkretne operacje na danych, jakie ma wykonać, a nie rozpisujemy w instrukcjach, za pomocą jakich metod ma to zrobić.
Deklaratywne podejście można znaleźć także w narzędziach konfiguracyjnych, takich jak Terraform (do zarządzania infrastrukturą) czy CSS (do stylowania stron internetowych). Paradygmat ten znajduje też zastosowanie w rozwiązaniach chmurowych typu infrastruktura jako kod, gdzie bardzo ważne jest definiowanie stanu kluczowego elementów.
Programowanie reaktywne
Programowanie reaktywne to paradygmat oparty na reakcji na zdarzenia. Umożliwia tworzenie aplikacji, które w czasie rzeczywistym reagują na strumienie danych i zdarzeń. Paradygmat ten jest stosowany w aplikacjach webowych i mobilnych. Trudno się temu dziwić — współcześnie nawet stosunkowo proste aplikacje wymagają częstych, dynamicznych zmian w interfejsie użytkownika oraz szybkich reakcji na działania userów.
W JavaScript przykładem programowania reaktywnego jest korzystanie z bibliotek takich jak RxJS:
const { fromEvent } = require('rxjs');
const { map } = require('rxjs/operators');
const button = document.getElementById('clickButton');
const clicks = fromEvent(button, 'click');
const clickCount = clicks.pipe(map(() => 1));
clickCount.subscribe(() => console.log('Button clicked!'));
RxJS (Reactive Extensions for JavaScript) to biblioteka popularna w stacku front-endowym, zwłaszcza w ekosystemie Angular. Często bywa używana do obsługi zapytań sieciowych, interakcji z użytkownikiem oraz dynamicznych aktualizacji. Programowanie reaktywne znajduje zastosowanie w przypadku aplikacji wymagających wysokiej interakcji, jak czaty na żywo, strumieniowanie multimediów czy aplikacje IoT.
Trudno jednoznacznie przypisywać paradygmaty programowania konkretnym językom czy technologiom. Wiele z nich łączy ze sobą różne rozwiązania i podejścia. Nawet ucząc się języków uznawanych za typowo obiektowe, czym prędzej czy później zetkniesz się z funkcjonalnością, która realizuje inny paradygmat. Popularność konkretnych filozofii programowania zmienia się też w czasie wraz z rozwojem technologicznym. Starsze modele komputerów obsługiwano za pomocą instrukcji i procedur, obecnie triumfy święci obiektowość, jednak coraz więcej developerów skłania się ku podejściu funkcyjnemu. Warto orientować się w tematyce paradygmatów programowania również po to, by zachować otwartą głowę i nie zamykać się na jeden zestaw rozwiązań. Kto wie, może błyśniesz wiedzą na ten temat na rozmowie technicznej?
Jeśli interesujesz się programowaniem lub chcesz dalej rozwijać swoje umiejętności programistyczne, sprawdź ofertę naszych szkoleń.