Frameworki i biblioteki w kwalifikacji INF.04: najważniejsze zasady, przykłady i 42 powiązane pytania w banku.
Framework nie jest większą biblioteką. To gotowy szkielet aplikacji: narzuca układ katalogów, cykl życia żądania i punkty, w których wolno dopisać własny kod. Za tę wygodę płaci się częścią kontroli nad przepływem sterowania, więc wybór między biblioteką a frameworkiem jest decyzją projektową. W zadaniach INF.04 trzeba zwykle rozpoznać, kto kogo wywołuje, gdzie trafia logika biznesowa i który plik odpowiada za zależności projektu.
Biblioteka, framework i odwrócenie sterowania
Bibliotekę wywołujesz ty: importujesz funkcję sortującą i sam decydujesz, w której linii ją uruchomić. Framework wywołuje twój kod: rejestrujesz kontroler pod ścieżką albo obsługę zdarzenia, a moment uruchomienia wybiera silnik frameworka. Ta zamiana kierunku to odwrócenie sterowania, znane też jako zasada Hollywood.
Dlatego React opisuje się jako bibliotekę do budowy interfejsu (routing i klienta HTTP dobierasz osobno), a Angular jest frameworkiem: w komplecie daje router, wstrzykiwanie zależności, klienta HTTP i układ katalogów wymuszony przez własne narzędzie wiersza poleceń. Tę samą rolę pełnią WPF i JavaFX na desktopie, Flutter i Jetpack Compose na urządzeniach mobilnych, a po stronie serwera Django, Laravel i Spring Boot.
MVC i MVVM: kto trzyma stan, a kto rysuje
W MVC żądanie trafia do kontrolera: ten odczytuje lub zmienia dane w modelu, a potem wskazuje widok. Widok nie sięga do bazy, a model nie wie, czy wynik trafi do HTML, czy do JSON. Uwaga na nazewnictwo: Django nazywa swój wzorzec MTV, więc funkcja pełniąca rolę kontrolera nazywa się tam widokiem, a szablon odpowiada widokowi z MVC.
MVVM zastępuje kontroler warstwą ViewModel i wiązaniem danych: ViewModel wystawia właściwości (czyLaduje, listaZadan) i zgłasza ich zmiany, więc kontrolka odświeża się sama. ViewModel nie zna klasy okna ani kontrolek, dzięki czemu testuje się go bez uruchamiania interfejsu. Wzorzec spotkasz w WPF, Avalonii i warstwie ViewModel na Androidzie.
ORM zamienia wiersz tabeli w obiekt
Mapowanie obiektowo-relacyjne łączy tabelę z klasą, kolumnę z polem, a wiersz z instancją. Klucz obcy staje się referencją: zamiast pisać JOIN, odczytujesz zamowienie.klient.nazwisko, a ORM w tle wykonuje zapytanie. Wartości trafiają do zapytania jako parametry, co domyślnie zamyka drogę wstrzyknięciu SQL; ochrona znika, gdy sam sklejasz surowy SQL z tekstu użytkownika.
Ceną wygody jest pułapka N+1 z leniwego doczytywania powiązań: pobranie 50 zamówień to jedno zapytanie, ale odczyt klienta w pętli dokłada 50 kolejnych. Wymuszenie pobrania powiązanych danych z góry sprowadza to do jednego lub dwóch zapytań:
Django
select_related, prefetch_related
SQLAlchemy
joinedload, selectinload
Eloquent (Laravel)
with
Dlatego przy ORM zaglądaj do logu wykonanych zapytań.
Plik zależności, plik blokady i wersjonowanie semantyczne
Ekosystem
Plik zależności
Plik blokady
npm
package.json
package-lock.json
Composer
composer.json
composer.lock
Python
requirements.txt / pyproject.toml
poetry.lock / uv.lock
Plik blokady zapisuje dokładne wersje całego drzewa zależności z sumami kontrolnymi: npm ci instaluje wyłącznie to, co stoi w blokadzie, więc dwa komputery dostają identyczny zestaw. Blokada należy do repozytorium, katalog node_modules nie.
Wersja semantyczna ma postać GŁÓWNA.POBOCZNA.POPRAWKA: poprawka błędu zmienia 2.4.1 w 2.4.2, zgodna wstecz funkcja daje 2.5.0, a zmiana łamiąca API 3.0.0. Zapis ^2.4.1 dopuszcza wszystko poniżej 3.0.0, a ~2.4.1 tylko poniżej 2.5.0. Wyjątek: dla ^0.2.3 npm podnosi wersję najwyżej do 0.2.x, bo w gałęzi 0.x każda zmiana pobocznej może łamać API.
Testy w projekcie opartym na frameworku
Test jednostkowy sprawdza jedną klasę bez bazy i sieci, a zależność podmieniasz atrapą, na przykład repozytorium zwracającym ustaloną listę trzech rekordów. Test integracyjny uruchamia prawdziwy stos: framework daje klienta testowego (Client w Django, TestClient w FastAPI, metoda get w testach Laravela), który wysyła żądanie do trasy i pozwala sprawdzić kod odpowiedzi oraz treść JSON.
Pojedynczy test składa się z przygotowania, wykonania i sprawdzenia. Testów jednostkowych pisze się najwięcej, bo trwają milisekundy; integracyjnych mniej, bo wymagają bazy, choćby SQLite w pamięci. Pamiętaj, że SQLite inaczej niż PostgreSQL traktuje typy i ograniczenia, więc część błędów wyjdzie dopiero na docelowym silniku. Test bez asercji albo zależny od kolejności uruchomienia daje złudne poczucie bezpieczeństwa: poziomy i techniki systematyzuje artykuł o testowaniu. Kiedy framework dokłada zbędnej złożoności
Framework zwraca się w projekcie utrzymywanym latami: routing, walidacja, migracje, sesje i uwierzytelnianie są już napisane, a nowa osoba w zespole zastaje znaną konwencję. Dochodzi przewidywalny cykl wydań: Django publikuje wersję funkcjonalną mniej więcej co osiem miesięcy, a co trzecia jest oznaczona jako LTS z trzema latami wsparcia. Przy skrypcie na 150 linii, który raz w tygodniu przetwarza plik CSV, ten sam zestaw to głównie koszt nauki i aktualizacji.
Sygnałem nadmiaru bywa strona wizytówka ładująca kilkaset kilobajtów JavaScriptu tam, gdzie wystarczy statyczny HTML, trzy warstwy abstrakcji nad jednym zapytaniem SQL albo plik konfiguracyjny dłuższy od logiki. Decyzję podejmuj, porównując czas wdrożenia i utrzymania z czasem napisania tej samej funkcji ręcznie. Architekturę samej aplikacji opisuje artykuł o aplikacjach, a zadania z projektowania znajdziesz w arkuszach INF.04.