Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 4 maja 2026 19:57
  • Data zakończenia: 4 maja 2026 20:28

Egzamin zdany!

Wynik: 28/40 punktów (70,0%)

Wymagane minimum: 20 punktów (50%)

Nowe
Analiza przebiegu egzaminu- sprawdź jak rozwiązywałeś pytania
Pochwal się swoim wynikiem!
Szczegółowe wyniki:
Pytanie 1

Jakie są różnice między typem łańcuchowym a typem znakowym?

A. Typ znakowy przechowuje pojedyncze znaki, a łańcuchowy ciągi znaków
B. Typ łańcuchowy przechowuje pojedyncze znaki, a znakowy długie ciągi znaków
C. Typ znakowy przechowuje dane logiczne, a łańcuchowy tekst
D. Typ łańcuchowy obsługuje liczby całkowite, a znakowy liczby zmiennoprzecinkowe
Typ znakowy (char) przechowuje pojedyncze znaki, natomiast typ łańcuchowy (string) przechowuje ciągi znaków. Różnica ta ma kluczowe znaczenie w programowaniu, ponieważ typ 'char' jest używany do operacji na pojedynczych literach, cyfrze lub symbolu, podczas gdy 'string' umożliwia przechowywanie i manipulowanie całymi wyrazami lub zdaniami. W wielu językach 'string' to bardziej złożona struktura danych, która zawiera tablicę znaków (array of characters), co pozwala na efektywną pracę z tekstem i budowanie interaktywnych aplikacji.

Pytanie 2

Która metoda tablicy w JavaScript dodaje nowy element na końcu tablicy?

A. pop()
B. push()
C. shift()
D. unshift()
Metoda push() w JavaScript jest kluczowym narzędziem do dodawania nowych elementów na końcu tablicy. Jest to technika powszechnie stosowana w programowaniu, która pozwala na dynamiczne zarządzanie danymi w aplikacjach. Stosując push(), zyskujemy możliwość zwiększania rozmiaru tablicy w locie, co jest szczególnie przydatne w przypadku pracy z danymi, które mogą się zmieniać lub być nieprzewidywalne. Na przykład, jeśli mamy tablicę przechowującą listę zakupów, możemy dodać nowy przedmiot za pomocą metody push: `zakupy.push('jogurt');`. Warto również zauważyć, że metoda ta zwraca nową długość tablicy po dodaniu elementu, co może być użyteczne w kontekście dalszego przetwarzania lub sprawdzania zawartości tablicy. Zastosowanie tej metody jest zgodne z zasadami dobrego programowania w JavaScript, które zaleca efektywne gospodarowanie pamięcią i elastyczne zarządzanie strukturami danych.

Pytanie 3

Jakie znaczenie ma framework w kontekście programowania?

A. System operacyjny, który umożliwia uruchamianie aplikacji
B. Program do graficznego projektowania interfejsów użytkownika
C. Zbiór gotowych bibliotek, narzędzi i zasad ułatwiających tworzenie aplikacji
D. Moduł do zarządzania systemami baz danych
Framework to zbiór gotowych bibliotek, narzędzi i reguł, które wspierają tworzenie aplikacji poprzez dostarczanie struktury ułatwiającej pracę programistów. Frameworki definiują standardowe komponenty aplikacji, umożliwiając programistom skoncentrowanie się na logice biznesowej zamiast na podstawowej architekturze aplikacji. Przykłady popularnych frameworków to .NET, Angular, Django i Spring. Frameworki przyspieszają proces programowania, poprawiają jakość kodu i wspierają skalowalność aplikacji, co czyni je nieodłącznym elementem nowoczesnego programowania.

Pytanie 4

Który z wymienionych składników jest charakterystyczny dla środowiska IDE przeznaczonego do tworzenia aplikacji mobilnych?

A. Edytor graficzny, narzędzia analityczne, klient FTP
B. Narzędzia do analizy danych, serwer webowy, przeglądarka internetowa
C. Kompilator, debugger, emulator urządzenia mobilnego
D. Edytor tekstowy, przeglądarka internetowa, system kontroli wersji
Kompilator, debugger i emulator urządzenia mobilnego to podstawowe narzędzia w każdym środowisku IDE przeznaczonym do tworzenia aplikacji mobilnych. Kompilator jest odpowiedzialny za przekształcenie kodu źródłowego na plik wykonywalny, co pozwala na uruchomienie aplikacji na urządzeniu. Debugger umożliwia wykrywanie i eliminowanie błędów, co jest kluczowe dla prawidłowego działania aplikacji. Emulator pozwala na symulowanie działania aplikacji na różnych urządzeniach i systemach, co ułatwia testowanie bez potrzeby fizycznego dostępu do wielu modeli telefonów czy tabletów. Taki zestaw narzędzi jest standardem w Android Studio, XCode oraz Visual Studio, co umożliwia pełen cykl tworzenia aplikacji mobilnych – od kodowania, przez testowanie, aż po wdrażanie.

Pytanie 5

Która z metod zarządzania projektem jest oparta na przyrostach realizowanych w sposób iteracyjny?

A. Model wodospadowy (waterfall)
B. Model prototypowy
C. Model spiralny
D. Metodyki zwinne (Agile)
Metodyki zwinne, czyli Agile, są naprawdę ciekawe, bo stawiają na iteracyjne podejście. To znaczy, że po trochu, krok po kroku realizujemy projekt, a każda iteracja dostarcza nam kawałek działającego produktu. Dzięki temu możemy łatwo dostosować się do zmieniających się wymagań klienta. W moim doświadczeniu, to świetny sposób na rozwijanie aplikacji, bo pozwala nam regularnie testować i wprowadzać zmiany. W Agile najważniejsza jest współpraca z klientem i szybkie dostarczanie wartości, co czyni ten model bardzo efektywnym, zwłaszcza w szybko zmieniających się warunkach.

Pytanie 6

Przedstawione w filmie działania wykorzystują narzędzie

A. generatora GUI przekształcającego kod do języka XAML
B. generatora kodu java
C. debuggera analizującego wykonujący kod
D. kompilatora dla interfejsu graficznego
Wybrana odpowiedź jest trafna, bo faktycznie narzędzie pokazane w filmie to generator GUI, który potrafi przekształcać kod do języka XAML. XAML (czyli Extensible Application Markup Language) jest powszechnie używany do deklaratywnego opisywania interfejsów użytkownika, na przykład w aplikacjach WPF czy UWP na platformie .NET. Jak dla mnie, korzystanie z takich generatorów to ogromna wygoda, bo pozwala błyskawicznie przenosić projekt graficzny do formatu czytelnego dla platformy Microsoftu. Z mojego doświadczenia, wiele zespołów programistycznych stosuje takie rozwiązania, żeby oszczędzić czas na ręcznym pisaniu XAML-a (co potrafi być naprawdę żmudne przy dużych projektach). Co ciekawe, takie narzędzia bardzo dobrze współpracują z designerskimi edytorami UI i potrafią zautomatyzować konwersję nawet z innych formatów graficznych, np. Sketch czy Adobe XD do XAML-a. Branżowe standardy zalecają, by wykorzystywać generatorów GUI właśnie do tego celu, bo minimalizuje to liczbę błędów, przyspiesza wdrożenie zmian i ułatwia współpracę między programistami a projektantami. Warto pamiętać, że XAML jest bardzo elastyczny i umożliwia potem ręczną edycję wygenerowanego kodu – czasem powstają drobne poprawki, ale ogólnie to naprawdę przydatne narzędzie. Ogólnie – jeśli tylko projektujesz UI pod .NET, to automatyczna konwersja do XAML-a to jest coś, co warto znać i wykorzystywać w praktyce.

Pytanie 7

W zamieszczonej ramce znajdują się notatki testera dotyczące przeprowadzanych testów aplikacji. Jakiego typu testy planuje przeprowadzić tester?

  • zmierzyć czas zalogowania się użytkownika
  • ustalić domyślną liczbę produktów na stronie, dla której renderowanie jest akceptowalne czasowo
  • czy wizualizacja danych na mapie przebiega bez opóźnień?
  • czy czas logowania wzrasta znacznie przy logowaniu 10 użytkowników, 100, 1000?
  • jaka minimalna prędkość pobierania jest wymagana, aby aplikacja była zaakceptowana przez klienta?
A. Interfejsu
B. Wydajnościowe
C. Bezpieczeństwa
D. Jednostkowe
Testy wydajnościowe są kluczowe dla zapewnienia, że system działa sprawnie pod różnym obciążeniem. Są one wykonywane, aby zrozumieć, jak aplikacja zachowuje się w warunkach rzeczywistych, kiedy wiele użytkowników korzysta z niej jednocześnie. W pytaniu wymienione zostały zadania takie jak mierzenie czasu logowania się użytkowników oraz sprawdzanie, czy czas ten wzrasta wraz ze wzrostem liczby użytkowników. To typowe aspekty testów wydajnościowych. Takie testy pomagają określić limity skalowalności i zapewniają, że aplikacja może obsługiwać oczekiwaną liczbę użytkowników bez spadku wydajności. Standardy branżowe, takie jak ISO/IEC 25010, zwracają uwagę na konieczność testowania wydajności, by zidentyfikować potencjalne wąskie gardła i zapewnić satysfakcjonujące doświadczenia użytkownikom. Dobrymi praktykami są używanie narzędzi takich jak JMeter czy LoadRunner, które umożliwiają symulację obciążenia i analizę wyników w celu optymalizacji kodu i infrastruktury. Tego typu testy są nieodzowne przed wdrożeniem aplikacji produkcyjnej, aby zapewnić jej niezawodne działanie.

Pytanie 8

Który z poniższych przypadków stanowi test niefunkcjonalny?

A. Sprawdzenie działania przycisku
B. Weryfikacja poprawności logowania użytkownika
C. Sprawdzenie obsługi formularza rejestracji
D. Testowanie wydajności aplikacji pod dużym obciążeniem
Testowanie wydajności aplikacji pod dużym obciążeniem to przykład testu niefunkcjonalnego. Jego celem jest ocena, jak aplikacja zachowuje się przy dużej liczbie użytkowników lub operacji jednocześnie. Testy te pozwalają na identyfikację wąskich gardeł i optymalizację kodu oraz infrastruktury serwerowej. W ramach testów obciążeniowych analizowane są parametry takie jak czas odpowiedzi, zużycie zasobów (CPU, RAM) oraz stabilność aplikacji w warunkach skrajnego obciążenia. Testowanie wydajności jest kluczowe w aplikacjach webowych, e-commerce oraz systemach o dużej liczbie transakcji, gdzie każdy przestój może generować straty finansowe i negatywnie wpływać na doświadczenia użytkownika.

Pytanie 9

Z jakiego obiektu można skorzystać, aby stworzyć kontrolkę wskazaną strzałką na ilustracji?

Ilustracja do pytania
A. Box - dla biblioteki WPF; JField - dla biblioteki Swing
B. TextBox - dla biblioteki WPF; JTextField - dla biblioteki Swing
C. Windows - dla biblioteki WPF; JFrame - dla biblioteki Swing
D. Text - dla biblioteki WPF; JText - dla biblioteki Swing
Wybrałeś dokładnie to, co w praktyce programisty jest najważniejsze, czyli TextBox dla WPF i JTextField dla Swinga. Te dwa komponenty to absolutna podstawa, jeśli chodzi o pola do wprowadzania tekstu, zarówno w aplikacjach .NET, jak i Java. W WPF TextBox pozwala na przyjmowanie danych od użytkownika, obsługę zdarzeń, walidację, formatowanie tekstu – ogólnie wszystko, co potrzeba do pracy z tekstem w GUI. W Swingu JTextField jest odpowiednikiem, bardzo intuicyjnym i prostym w użyciu, świetnie się sprawdza przy prostych formularzach czy interfejsach użytkownika. Co ciekawe, oba te komponenty są bardzo elastyczne, można je stylizować, podłączać do systemów walidacji czy nawet rozbudowywać o własne mechanizmy autouzupełniania. Spotkałem się wielokrotnie z sytuacją, gdzie poprawne zastosowanie TextBoxa lub JTextFielda znacząco podnosiło jakość aplikacji – bo jednak wygoda użytkownika i poprawność danych są kluczowe. Takie wybory są zgodne z dokumentacją Microsoftu oraz Oracla, więc trzymasz się dobrych praktyk. Z mojej perspektywy, jeśli chcesz pisać nowoczesne, użytkowe aplikacje desktopowe, znajomość tych kontrolek to absolutny must-have.

Pytanie 10

Jakie kroki należy podjąć, aby skutecznie zabezpieczyć dane na komputerze?

A. Systematycznie aktualizować oprogramowanie i wykonywać kopie zapasowe
B. Nie używać kopii zapasowych
C. Przechowywać dane na niezabezpieczonych nośnikach przenośnych
D. Dzielić się hasłami do plików z współpracownikami
Regularne aktualizowanie oprogramowania oraz tworzenie kopii zapasowych to kluczowe działania zapewniające bezpieczeństwo danych na komputerze. Aktualizacje łatają luki w zabezpieczeniach i eliminują błędy, które mogą zostać wykorzystane przez hakerów. Kopie zapasowe chronią dane przed utratą spowodowaną awarią sprzętu, atakiem ransomware lub przypadkowym usunięciem. Najlepszą praktyką jest przechowywanie kopii zapasowych w różnych miejscach – lokalnie i w chmurze – co dodatkowo zwiększa poziom zabezpieczenia przed nieprzewidzianymi sytuacjami.

Pytanie 11

Na podstawie definicji zamieszczonej w ramce, wskaż, który z rysunków ilustruje komponent Chip zdefiniowany w bibliotece Angular Material?

Ilustracja do pytania
A. Rysunek 3
B. Rysunek 1
C. Rysunek 4
D. Rysunek 2
Komponent Chip w bibliotece Angular Material to interaktywny element, który reprezentuje fragment informacji, tag lub wybór. Może zawierać tekst, ikonę lub być klikalny, co czyni go niezwykle użytecznym w projektowaniu nowoczesnych interfejsów użytkownika. Komponenty tego typu często wykorzystywane są w formularzach lub systemach tagowania, umożliwiając użytkownikowi intuicyjne dodawanie lub usuwanie elementów. Wyróżnia się swoją minimalistyczną formą i możliwością dostosowania do różnych potrzeb projektowych.

Pytanie 12

Który język programowania jest używany do stylizacji stron internetowych?

A. JavaScript
B. CSS
C. HTML
D. PHP
CSS, czyli Cascading Style Sheets, jest językiem stylizacji, który służy do opisywania wyglądu dokumentów napisanych w HTML i XML. Umożliwia on oddzielenie treści od prezentacji, co jest kluczowe w tworzeniu nowoczesnych, responsywnych i estetycznie atrakcyjnych stron internetowych. Dzięki CSS można definiować różne aspekty stylów, takie jak kolory, czcionki, marginesy, a także układ elementów na stronie. Przykładowo, za pomocą prostych reguł CSS można zmienić kolor tła na zielony, a tekst na biały, co można osiągnąć przy pomocy następującego kodu: `body { background-color: green; color: white; }`. Współczesne standardy CSS, jak CSS3, wprowadzają także zaawansowane techniki, takie jak animacje czy przejścia, co daje jeszcze większe możliwości w stylizacji stron. Ponadto, dobre praktyki obejmują użycie arkuszy stylów w zewnętrznych plikach, co pozwala na ich ponowne wykorzystanie i lepszą organizację kodu, a także ułatwia zarządzanie stylem w dużych projektach.

Pytanie 13

Jaki rodzaj testów można scharakteryzować przedstawionym opisem?

NazwaOpisCzynnościPo teście
Formularz osobowySprawdzenie odpowiedzi formularza na błędy użytkownika1. czy wpisano wszystkie wymagane pola?
2. czy e-mail zawiera znak @?
3. czy nr telefonu zawiera cyfry, zgodnie ze wzorcem?
4. czy jest zgoda na przetwarzanie danych?
Usunąć z bazy danych wpisane podczas testowania osoby
A. testy funkcjonalne
B. testy jednostkowe
C. testy zgodności
D. testy wydajnościowe
Dokładnie o takie testy tutaj chodzi! Testy funkcjonalne skupiają się na sprawdzaniu, czy system realizuje funkcje zgodnie z wymaganiami biznesowymi i oczekiwaniami użytkownika. W tym przypadku chodzi o formularz osobowy, który ma określone zasady walidacji – na przykład obowiązkowe pola, poprawny format e-maila czy numer telefonu zgodny ze wzorcem. Sprawdza się też, czy użytkownik wyraził zgodę na przetwarzanie danych. To wszystko to typowe przypadki testów funkcjonalnych, bo nie interesuje nas tu ani wydajność systemu, ani szczegóły implementacji kodu, tylko efekt w postaci poprawnego działania funkcji z punktu widzenia użytkownika. Moim zdaniem właśnie w takich testach najłatwiej złapać błędy, które są naprawdę uciążliwe dla użytkowników końcowych. Branżowe standardy, takie jak ISTQB, podkreślają, że testy funkcjonalne badają zachowanie systemu na podstawie specyfikacji, a nie sposobu realizacji. Praktyka pokazuje, że nawet proste formularze często zawierają bzdurne błędy (np. nie sprawdza się formatu maila albo nie wymaga zgody RODO), więc takie testy są wręcz niezbędne. Dodatkowo, dobrym zwyczajem jest po takich testach „posprzątać” po sobie dane testowe, żeby nie zaśmiecać bazy – to też jest element dobrze przeprowadzonego testowania funkcjonalnego.

Pytanie 14

Jaką funkcję pełni operator "|" w języku C++?

A. Bitowe "xor"
B. Operację przesunięcia bitów w prawo
C. Logiczne "lub"
D. Bitowe "lub"
Operator `||` to operator logiczny `OR`, który działa na wartościach logicznych i zwraca `true`, jeśli przynajmniej jeden z operandów jest prawdziwy, ale nie operuje na poziomie bitów. Operator `^` to operator `XOR` (exclusive or), który zwraca `1` tylko wtedy, gdy jeden z operandów ma wartość `1`, a drugi `0`. Operator `>>` to operator przesunięcia bitowego w prawo, który przesuwa bity liczby w prawo o określoną liczbę miejsc, co skutkuje podzieleniem liczby przez potęgę dwójki. Każdy z tych operatorów działa inaczej niż `|`, który jest operatorem bitowego `OR`.

Pytanie 15

Co to jest JWT (JSON Web Token)?

A. Protokół komunikacji między frontendem a backendem
B. Biblioteka JavaScript do manipulacji danymi JSON
C. Otwarty standard do bezpiecznego przekazywania informacji między stronami jako obiekt JSON
D. Format przechowywania danych w bazach NoSQL
JWT, czyli JSON Web Token, to otwarty standard (RFC 7519), który definiuje sposób bezpiecznego przekazywania informacji między stronami jako obiekt JSON. Głównym celem JWT jest zapewnienie autoryzacji i integralności danych. Token składa się z trzech części: nagłówka, ładunku i podpisu. Nagłówek określa algorytm użyty do podpisu, ładunek zawiera dane użytkownika (np. identyfikator, role), a podpis umożliwia weryfikację, że token nie został zmieniony po jego wydaniu. Dzięki tej strukturze JWT jest popularny w aplikacjach webowych, gdzie użytkownicy muszą być autoryzowani w różnych sekcjach aplikacji. Praktycznym zastosowaniem JWT jest autoryzacja API, gdzie serwery mogą weryfikować tożsamość użytkowników na podstawie tokenów przesyłanych w nagłówkach HTTP, co zwiększa bezpieczeństwo i elastyczność w komunikacji między systemami. Warto podkreślić, że JWT powinny być używane zgodnie z najlepszymi praktykami, takimi jak stosowanie HTTPS, aby chronić dane przed przechwyceniem, oraz regularne odnawianie tokenów, aby zminimalizować ryzyko ich wykorzystywania przez osoby nieuprawnione.

Pytanie 16

Które z wymienionych poniżej błędów podczas wykonywania programu można obsłużyć poprzez zastosowanie wyjątków?

A. Niekompatybilność typów danych w kodzie
B. Błąd w składni
C. Błąd dzielenia przez zero
D. Błąd kompilacyjny
Błędy składniowe są wykrywane na etapie kompilacji i nie mogą być obsługiwane za pomocą wyjątków – kompilator generuje komunikat o błędzie, zanim program zostanie uruchomiony. Błędy kompilacji, takie jak niezgodność typów danych, również są wychwytywane na etapie kompilacji i wymagają poprawienia kodu źródłowego. Wyjątki są przeznaczone do obsługi błędów, które występują w czasie wykonywania programu, a nie błędów wykrywanych przez kompilator. Dlatego obsługa błędów składniowych i kompilacyjnych wymaga innego podejścia niż mechanizm wyjątków.

Pytanie 17

Zgodnie z dokumentacją dotyczącą menu Navbar z biblioteki Bootstrap 4, w celu stworzenia menu należy zdefiniować listę

A standard navigation bar is created with the .navbar class, followed by a responsive collapsing class:
.navbar-expand-xl|lg|md|sm (stacks the navbar vertically on extra large, large, medium or small screens).
To add links inside the navbar, use a <ul> element with class="navbar-nav". Then add <li> elements with a
.nav-item class followed by a <a> element with a .nav-link class...
Use any of the .bg-color classes to change the background color of the navbar (.bg-primary, .bg-success,
.bg-info, .bg-warning, .bg-danger, .bg-secondary, .bg-dark and .bg-light)
Tip: Add a white text color to all links in the navbar with the .navbar-dark class, or use the .navbar-light
class to add a black text color.
Źródło: https://www.w3schools.com/bootstrap4
A. < ul class="a, .nav-item" > ... < /ul>
B. < ol class="a, .nav-item" > ... < /ol>
C. < ul class="navbar-nav" > ... < /ul>
D. < ol class="navbar-nav" > ... < /ol>
Wybrałeś dokładnie taki kod, jaki zaleca oficjalna dokumentacja Bootstrapa 4. Użycie <ul class="navbar-nav"> … </ul> jest podstawą do tworzenia nawigacji w tym frameworku. Cała magia polega na tym, że Bootstrap styluje właśnie elementy listy nieuporządkowanej (ul) z klasą "navbar-nav". To pozwala prawidłowo wyświetlić menu poziomo, z zachowaniem responsywności i spójności z resztą interfejsu. Wewnątrz każdej listy dodaje się <li class="nav-item">, a w nich <a class="nav-link"> z linkami – wtedy całość zachowuje się zgodnie z założeniami Bootstrapa. W praktyce widać to na prawie każdej stronie korzystającej z tego frameworka – niezależnie czy robisz prostą wizytówkę, czy rozbudowaną aplikację webową. Takie podejście zapewnia nie tylko poprawne style, ale też dobre wsparcie dla dostępności (a11y), bo listy są dla czytników ekranu czytelniejsze niż np. <div>. Moim zdaniem, trzymanie się tej struktury jest kluczowe, jeśli chcesz, żeby twoje menu działało dobrze na różnych przeglądarkach i urządzeniach. Z moich doświadczeń wynika, że próby modyfikowania tej struktury kończą się często problemami ze stylami, a nawet łamaniem responsywności. Lepiej nie kombinować i stosować to, co już sprawdzone – oszczędza to mnóstwo nerwów przy późniejszym rozwijaniu projektu.

Pytanie 18

Który z dokumentów stosowanych w metodologii Agile zawiera listę funkcjonalności produktu uporządkowanych według ich ważności?

A. Diagram Gantta
B. Backlog sprintu
C. Harmonogram projektu
D. Product backlog
Product backlog to dokument zawierający listę funkcjonalności produktu uporządkowanych według priorytetów. Jest to jedno z głównych narzędzi w metodykach Agile, szczególnie w Scrumie, gdzie backlog stanowi podstawę do planowania sprintów. Zawiera on wszystkie elementy, które muszą zostać zaimplementowane, w tym nowe funkcje, poprawki błędów oraz zadania techniczne. Priorytety są ustalane przez właściciela produktu (Product Ownera) i dostosowywane na bieżąco w zależności od zmieniających się wymagań i potrzeb biznesowych. Dzięki backlogowi zespół może skupić się na dostarczaniu najważniejszych funkcji, co pozwala na szybkie reagowanie na feedback i rozwój aplikacji zgodnie z oczekiwaniami klienta.

Pytanie 19

Co to jest Redux?

A. Biblioteka do zarządzania stanem aplikacji w JavaScript
B. Narzędzie do optymalizacji wydajności aplikacji React
C. Framework do tworzenia aplikacji mobilnych
D. System kontroli wersji dla projektów JavaScript
Redux to biblioteka służąca do zarządzania stanem aplikacji w JavaScript, a szczególnie popularna w kontekście aplikacji opartych na bibliotece React. Umożliwia centralizację stanu, co sprawia, że zarządzanie nim staje się bardziej przewidywalne i łatwiejsze w utrzymaniu. W koncepcji Redux stan aplikacji jest przechowywany w jednym, niezmiennym obiekcie, co pozwala na ścisłe kontrolowanie jego zmian poprzez wysyłanie akcji. Użytkownicy mogą dzięki temu łatwo śledzić, co się dzieje w aplikacji. Przykładem zastosowania może być aplikacja do zarządzania zadaniami, w której użytkownik może dodawać, edytować lub usuwać zadania. Dzięki Redux, wszystkie zmiany w stanie są rejestrowane, a ich historia może być używana do debugowania czy implementacji funkcji cofania zmian. Dobrą praktyką w pracy z Redux jest stosowanie middleware, takiego jak redux-thunk, co pozwala na obsługę asynchronicznych akcji, a także wykorzystanie narzędzi jak Redux DevTools, które wspierają developerów w monitorowaniu stanu aplikacji.

Pytanie 20

Jaki będzie wynik działania poniższego kodu JavaScript?

function foo() { console.log(a); var a = 1; console.log(a); } foo();
A. undefined, undefined
B. 1, 1
C. undefined, 1
D. ReferenceError, 1
Wynikiem działania tego kodu nie może być 'ReferenceError, 1', ponieważ w sytuacji, gdy zmienna 'a' została zadeklarowana za pomocą 'var', nie może wystąpić błąd referencyjny związany z odwołaniem się do niej przed jej przypisaniem. Wartość zmiennej 'a' przed jej przypisaniem to 'undefined', a nie 'ReferenceError', co jest typowym nieporozumieniem w kontekście hoisting. W przypadku zmiennych zadeklarowanych za pomocą 'let' lub 'const', rzeczywiście moglibyśmy napotkać 'ReferenceError', gdyż te zmienne mają tzw. „temporal dead zone” przed ich zadeklarowaniem. Wynik 'undefined, undefined' również nie jest poprawny, ponieważ po pierwszym 'console.log' zmienna 'a' jest jeszcze niezainicjalizowana i wyświetli 'undefined', ale drugie 'console.log' z pewnością wyświetli wartość '1', po przypisaniu. Odpowiedź '1, 1' jest również błędna, ponieważ pierwsze logowanie 'a' przed przypisaniem z pewnością da 'undefined'. Ważne jest zrozumienie zasad hoisting oraz jak różne typy deklaracji zmiennych wpływają na ich zakres i inicjalizację, aby unikać nieporozumień w przyszłości.

Pytanie 21

W standardzie dokumentacji testów oprogramowania IEEE 829-1998 opisany jest dokument, który zawiera dane o tym, jakie przypadki testowe były wykorzystane, przez kogo i czy zakończyły się sukcesem. Co to jest?

A. Raport Podsumowujący Testy
B. Dziennik Testów
C. Plan Testów
D. Specyfikacja Procedury Testowej
Dokładnie – Dziennik Testów to ten dokument z IEEE 829-1998, który ma za zadanie rejestrować, które przypadki testowe zostały wykonane, przez kogo, kiedy oraz jaki był ich rezultat. Z mojego doświadczenia to jest taka codzienna „księga kucharska” testera – wpisujesz co zrobiłeś, o której i czy poszło zgodnie z planem. W prawdziwych projektach dziennik testów bywa nieoceniony: pozwala w każdej chwili wrócić do szczegółów, zweryfikować kto co testował i dlaczego test przerwano, a nawet rozliczać się z czasu pracy. To podstawa rozliczalności (ang. traceability) procesu testowania, co jest szczególnie ważne przy audytach czy testach dla klientów z branż regulowanych, np. medycyna czy bankowość. Sam standard IEEE 829-1998 bardzo konkretnie określa, jakie dane mają się tam znaleźć – to nie tylko „odhaczenie”, ale pełna informacja o przebiegu i wyniku każdego testu, ewentualnych problemach czy wyjątkowych sytuacjach. W praktyce, czy to prowadzisz Excela, dokumentację papierową czy system typu JIRA/Xray, dobrze prowadzony dziennik testów pozwala potem zidentyfikować luki w pokryciu przypadków, powtórzyć testy po naprawach czy po prostu udowodnić, że procedura była zgodna z wymaganiami. Warto to sobie wyrobić jako nawyk. Sam nieraz wracałem do starych dzienników, żeby sprawdzić „co poszło nie tak” parę miesięcy wcześniej – bez tego byłaby loteria!

Pytanie 22

Jakie jest główne zadanie kontrolera w architekturze MVC (Model-View-Controller)?

A. Przechowywanie danych aplikacji
B. Zarządzanie sesją użytkownika
C. Obsługa logiki biznesowej i przetwarzanie danych wejściowych od użytkownika
D. Prezentowanie danych użytkownikowi
W architekturze MVC kontroler pełni kluczową rolę w procesie przetwarzania danych aplikacji. Jego głównym zadaniem jest obsługa logiki biznesowej oraz przetwarzanie danych, które pochodzą od użytkownika. Kontroler działa jako pośrednik pomiędzy modelem a widokiem, odbierając żądania użytkownika, przetwarzając je (często z wykorzystaniem logiki biznesowej) i decydując, które dane modelu powinny być przekazane do widoku. W praktyce oznacza to, że kontroler interpretuje dane wejściowe, modyfikuje stan modelu na ich podstawie, a następnie wybiera odpowiedni widok do wyświetlenia wyników użytkownikowi. Takie podejście pozwala na lepszą organizację kodu i oddzielenie logiki aplikacji od interfejsu użytkownika, co jest zgodne z dobrymi praktykami projektowania oprogramowania. Dzięki temu aplikacje są bardziej skalowalne i łatwiejsze w utrzymaniu.

Pytanie 23

Zgodnie z informacjami zawartymi w ramce, wskaż, który z rysunków ilustruje element przypisany do klasy Badge określonej w bibliotece Bootstrap?

Ilustracja do pytania
A. D
B. C
C. A
D. B
Wybrałeś wariant B i to zdecydowanie właściwy trop. Badge w Bootstrapie to nic innego jak taki mały, liczbowy wskaźnik – najczęściej widoczny przy nazwach kategorii, powiadomieniach czy komentarzach – który sygnalizuje użytkownikowi ile czegoś się pojawiło albo ile czeka akcji do wykonania. W praktyce, taki element to nie tylko liczba w kolorowym prostokącie czy kółku, ale też bardzo czytelny komunikat do użytkownika, co się ostatnio zmieniło lub co wymaga uwagi. Właśnie dlatego, w przykładzie B, mamy niebieskie prostokąty z liczbami przy różnych sekcjach (News, Comments, Updates) – to klasyczny przykład badge’a w Bootstrapie, często stylowanego klasą .badge i powiązaną kolorystyką. Warto zwrócić uwagę, że takie badge’e są nie tylko wizualne, ale też semantyczne – są rozpoznawalne przez czytniki ekranu, co jest zgodne z dobrymi praktykami dostępności (WCAG). Stosując badge’e, zwiększamy czytelność i dostępność interfejsu użytkownika, bo od razu wiadomo, gdzie coś nowego się pojawiło. Moim zdaniem, korzystanie z badge’y to jeden z prostszych i skuteczniejszych sposobów na poprawę UX – no i są bardzo łatwe do wdrożenia, wystarczy jedna klasa CSS i gotowe.

Pytanie 24

Jakie jest podstawowe środowisko do tworzenia aplikacji desktopowych przy użyciu języka C#?

A. Eclipse
B. PyCharm
C. NetBeans
D. MS Visual Studio
MS Visual Studio to potężne zintegrowane środowisko programistyczne (IDE) zaprojektowane przez firmę Microsoft, które oferuje pełne wsparcie dla języka C#. Dzięki bogatym funkcjom, takim jak IntelliSense, które ułatwia pisanie kodu poprzez podpowiadanie składni oraz dostępność narzędzi do debugowania, programiści mogą efektywnie rozwijać aplikacje desktopowe. MS Visual Studio obsługuje różne frameworki, takie jak .NET Framework oraz .NET Core, co pozwala na budowanie aplikacji o różnej architekturze. W praktyce, programiści mogą tworzyć aplikacje w oparciu o Windows Presentation Foundation (WPF) lub Windows Forms, co umożliwia tworzenie rozbudowanych interfejsów użytkownika. Dodatkowo, MS Visual Studio oferuje szereg narzędzi do współpracy zespołowej, integracji z systemami kontroli wersji oraz wsparcie dla testowania jednostkowego. Jako standard w branży, MS Visual Studio jest często preferowanym wyborem w projektach komercyjnych i korporacyjnych, z uwagi na jego wszechstronność oraz wsparcie ze strony społeczności programistycznej.

Pytanie 25

Jaką komendę w języku C++ używa się do wielokrotnego uruchamiania tego samego bloku kodu?

A. break
B. switch
C. while
D. if
Instrukcja `if` to warunkowe wykonanie kodu, które nie powtarza bloku kodu wielokrotnie, a jedynie raz, jeśli warunek jest spełniony. Instrukcja `break` służy do natychmiastowego przerwania wykonywania pętli lub bloku kodu, ale sama w sobie nie powtarza kodu. Instrukcja `switch` umożliwia wielokrotne sprawdzanie różnych wartości jednej zmiennej, ale nie działa jak pętla – jest to struktura warunkowa, a nie iteracyjna. Żadna z tych instrukcji nie powtarza kodu tak, jak pętla `while`.

Pytanie 26

Które z podejść do tworzenia aplikacji najlepiej uwzględnia przyszłe zmiany w funkcjonalności?

A. Tworzenie bez wcześniejszej specyfikacji technicznej
B. Zastosowanie modularnej architektury aplikacji
C. Pisanie kodu bez jakiejkolwiek dokumentacji
D. Skupienie się tylko na estetce aplikacji
Użycie modularnej architektury aplikacji to najlepsze podejście do projektowania systemów, które muszą uwzględniać przyszłe modyfikacje funkcjonalności. Modularność pozwala na podział aplikacji na mniejsze, niezależne komponenty, które mogą być rozwijane, testowane i aktualizowane niezależnie od siebie. Takie podejście zwiększa elastyczność, ułatwia zarządzanie kodem i pozwala na szybkie wdrażanie nowych funkcji bez konieczności ingerencji w cały system. Architektura modularna jest szczególnie przydatna w dużych projektach, gdzie zmiany są częste, a wymagania dynamicznie się zmieniają.

Pytanie 27

W języku Java wyjątek ArrayIndexOutOfBoundsException występuje, gdy następuje próba dostępu do elementu tablicy, którego

A. wartość przekracza rozmiar tablicy
B. indeks jest równy lub większy od rozmiaru tablicy
C. indeks mieści się w zakresie od 0 do n-1, gdzie n oznacza rozmiar tablicy
D. wartość przewyższa jego indeks
Temat ArrayIndexOutOfBoundsException w Javie często rodzi nieporozumienia, zwłaszcza gdy ktoś nie do końca rozumie sposób indeksowania tablic w tym języku. Wydaje się naturalne myśleć, że błąd pojawia się, gdy wartość przechowywana w tablicy przekracza jakiś limit albo że indeksy są liczone od jeden czy od wartości logicznych, ale to nie tak. Tablica w Javie zawsze ma indeksy zaczynające się od 0, a kończące na długość minus jeden. Przekonanie, że wyjątek pojawia się, gdy wartość przekracza rozmiar tablicy, jest dość mylące, bo silnik Javy w ogóle nie analizuje wartości elementów, tylko patrzy na indeks. W innym błędnym podejściu wskazuje się, że wyjątek wystąpi, gdy indeks mieści się w zakresie od 0 do n-1 – to przeczy całej idei tablicy w Javie, bo właśnie te indeksy są w pełni poprawne: to jest naturalny, dozwolony zakres. Jeszcze inny mylny trop to przekonanie, że chodzi o wartość elementu przewyższającą jego indeks – nie ma to żadnego znaczenia, bo tablica może przechowywać dowolne wartości pod dowolnym indeksami, a wyjątek jest związany wyłącznie z odwołaniem się do nieistniejącego indeksu, czyli np. próbą dostępu do szóstego elementu w pięcioelementowej tablicy. Takie nieporozumienia zwykle wynikają z braku praktycznego doświadczenia lub z mylenia zasad działania tablic z innymi strukturami danych. Z mojego doświadczenia wynika, że najlepsze efekty daje po prostu pamiętanie, by zawsze operować na indeksach w zakresie 0 do length - 1 oraz korzystać z length w warunkach pętli. Profesjonalni programiści często automatyzują testy na takich przypadkach, bo to klasyczne źródło bugów w dużych projektach – lepiej nauczyć się od razu, niż potem szukać błędów na produkcji.

Pytanie 28

Jakie są typowe frameworki/biblioteki używane w aplikacjach webowych?

A. Visual Studio, Eclipse, angular, React.js, Node.js
B. ASP.NET Core, jQuery, Joomla!, Wordpress, Angular
C. ASP.NET Core, Django, Angular, React.js, Node.js
D. jquery, Joomla!, Wordpress, android Studio, Xamarin
Wybrana grupa frameworków i bibliotek — ASP.NET Core, Django, Angular, React.js, Node.js — to w praktyce jedne z najbardziej rozpoznawalnych i szeroko wykorzystywanych rozwiązań w branży tworzenia aplikacji webowych. Każdy z nich pełni trochę inną rolę, co powoduje, że są stosowane na różnych warstwach aplikacji. Na przykład ASP.NET Core oraz Django to frameworki po stronie serwera, obsługujące backend, logikę biznesową i komunikację z bazą danych. Są bardzo popularne zwłaszcza tam, gdzie liczy się szybkość wdrożenia i bezpieczeństwo. Node.js również zalicza się do backendowych technologii, z tym że pozwala pisać po stronie serwera w JavaScript, co bywa ogromnym plusem, gdy zespół jest mocno frontendowy. Angular i React.js to natomiast narzędzia, które pomagają budować rozbudowane, interaktywne interfejsy użytkownika po stronie klienta. Takie podejście, gdzie backend i frontend są rozdzielone, to obecnie standard — tzw. architektura SPA (Single Page Application) albo nawet JAMstack. Warto pamiętać, że dobrym zwyczajem jest korzystać właśnie z takich nowoczesnych frameworków, bo zapewniają solidne wsparcie społeczności, regularne aktualizacje i kompatybilność z nowymi standardami webowymi. Moim zdaniem, jeżeli myśli się poważnie o pracy jako developer webowy, to znajomość przynajmniej dwóch z wymienionych narzędzi to absolutny must-have. Przy okazji — wiele firm prowadzi projekty wieloplatformowe, więc umiejętność korzystania z tych frameworków można łatwo przenieść również do świata mobilnego czy nawet IoT.

Pytanie 29

W którym przypadku algorytm sortowania bąbelkowego działa z optymalną wydajnością?

A. Dla tablicy z dużą liczbą powtórzeń
B. Dla tablicy uporządkowanej malejąco
C. Dla tablicy losowej
D. Dla tablicy uporządkowanej rosnąco
W przypadku tablicy posortowanej malejąco algorytm bąbelkowy działa najmniej efektywnie, ponieważ wymaga pełnej liczby przejść i zamian, osiągając złożoność O(n²). Dla losowych tablic sortowanie bąbelkowe również wykonuje dużą liczbę porównań i zamian. Tablice o dużej liczbie powtórzeń mogą zwiększać liczbę iteracji, ponieważ algorytm nadal musi porównać wszystkie elementy, aby upewnić się, że są one we właściwej kolejności.

Pytanie 30

Jakie słowa kluczowe są stosowane w języku C++ do zarządzania wyjątkami?

A. throw i handle
B. try i raise
C. try i catch
D. except i finally
Słowa 'throw' i 'handle' nie są standardową konstrukcją obsługi wyjątków w C++. 'Throw' służy do zgłaszania wyjątków, ale 'handle' nie jest używane w tym kontekście – zamiast tego stosuje się 'catch'. 'Except' i 'finally' są składnią charakterystyczną dla Pythona, a nie dla C++. 'Raise' to również słowo kluczowe używane w Pythonie do zgłaszania wyjątków, ale nie występuje w C++ – tam używa się 'throw'.

Pytanie 31

Jakie oprogramowanie służy do monitorowania błędów oraz zarządzania projektami?

A. Jira
B. Bugzilla
C. Jasmine
D. Git
Bugzilla to narzędzie do śledzenia błędów, które skupia się głównie na identyfikacji oraz zarządzaniu defektami w oprogramowaniu. Choć może być używane w kontekście zarządzania projektami, jego funkcjonalności są ograniczone w porównaniu do kompleksowych rozwiązań, takich jak Jira. Bugzilla jest bardziej odpowiednie dla zespołów, które potrzebują prostszych narzędzi do śledzenia błędów, ale nie zapewnia takich możliwości zarządzania projektami jak Jira. Git to system kontroli wersji, który umożliwia zarządzanie kodem źródłowym, ale nie jest narzędziem do śledzenia błędów ani do zarządzania projektami jako takimi. Git pozwala programistom na współpracę i śledzenie zmian w kodzie, jednakże brakuje mu funkcji zarządzania projektami oraz integracji z procesami Agile, które są kluczowe w nowoczesnym rozwoju oprogramowania. Jasmine to framework do testowania jednostkowego aplikacji JavaScript, który koncentruje się na pisaniu testów i nie jest narzędziem do zarządzania projektami ani do śledzenia błędów. Pomimo że testowanie jednostkowe jest istotną częścią cyklu życia oprogramowania, Jasmine nie oferuje funkcjonalności związanych z zarządzaniem projektami, co czyni go nieodpowiednim w kontekście tego pytania.

Pytanie 32

Co to jest BEM w kontekście CSS?

A. Browser Extension Module - moduł rozszerzeń przeglądarki
B. Bootstrap Element Manager - narzędzie do zarządzania elementami Bootstrap
C. Metodologia nazewnictwa klas CSS: Block, Element, Modifier
D. Backend Encryption Method - metoda szyfrowania danych w backendzie
BEM, czyli Block, Element, Modifier, to metodologia służąca do organizacji i strukturyzacji kodu CSS, co znacząco ułatwia zarządzanie i rozwijanie projektów internetowych. W BEM każda klasa CSS jest zbudowana w sposób, który jasno definiuje jej rolę w kontekście całej aplikacji. Na przykład, blok to niezależny komponent, taki jak 'navbar' czy 'button', element to część bloku, która nie ma sensu sama w sobie, jak 'navbar__item', a modyfikator wskazuje na różne stany lub warianty bloku lub elementu, jak 'button--primary' lub 'button--disabled'. Zastosowanie BEM pozwala na lepszą czytelność kodu oraz unikanie konfliktów nazw, co jest kluczowe w dużych projektach. Praktyka ta jest szeroko stosowana w branży, a wiele frameworków CSS, takich jak Bootstrap, przyjmuje zasady BEM dla swoich komponentów, co wspiera stworzenie spójnego i łatwego w utrzymaniu stylu. Zrozumienie BEM jest fundamentem dla programistów front-end, ponieważ pozwala na efektywniejszą współpracę w zespole oraz lepszą organizację kodu.

Pytanie 33

Która z metod zarządzania projektami stawia na przejrzystość oraz wizualizację bieżących zadań?

A. Kanban
B. Waterfall
C. Agile
D. Scrum
Kanban to metodologia zarządzania projektami, która kładzie nacisk na transparentność i wizualizację pracy w toku (work in progress). Tablica Kanban, podzielona na kolumny oznaczające różne etapy realizacji zadań, pozwala na bieżąco śledzić postęp prac i identyfikować ewentualne blokady. Transparentność procesów umożliwia zespołowi optymalizację przepływu zadań i minimalizację zaległości. W Kanbanie ważna jest elastyczność i możliwość dostosowywania liczby zadań w toku (WIP), co pozwala na uniknięcie przeciążenia zespołu i zwiększenie produktywności.

Pytanie 34

Wykorzystanie typu DECIMAL w MySQL wymaga wcześniejszego określenia długości (liczby cyfr) przed oraz po przecinku. Jak należy to zapisać?

A. łańcuchowy
B. logiczny
C. zmiennoprzecinkowy
D. stałoprzecinkowy
Typ łańcuchowy w MySQL odnosi się do przechowywania danych tekstowych, takich jak VARCHAR czy CHAR, które są używane do przechowywania łańcuchów znaków. W przeciwieństwie do typu DECIMAL, nie ma on zastosowania do reprezentacji wartości numerycznych, co sprawia, że nie nadaje się do obliczeń matematycznych wymagających precyzji. Typ zmiennoprzecinkowy (FLOAT, DOUBLE) z kolei jest używany do przechowywania liczb, które mogą obejmować wartości z przecinkiem dziesiętnym, ale mogą cierpieć na problemy z precyzją, ponieważ są reprezentowane w formie binarnej. Ze względu na sposób przechowywania, liczby zmiennoprzecinkowe mogą prowadzić do niezamierzonych błędów zaokrągleń, co czyni je mniej odpowiednimi w kontekście finansowym. Typ logiczny (BOOLEAN) ma na celu przechowywanie wartości prawda/fałsz i nie jest dostosowany do przechowywania wartości liczbowych. Podsumowując, wszystkie trzy wymienione typy są nieodpowiednie do przechowywania liczb dziesiętnych z określoną precyzją, co stanowi kluczową cechę typu DECIMAL, który oferuje większą kontrolę nad dokładnością obliczeń.

Pytanie 35

Jaką właściwość ma sieć synchroniczna?

A. Gwarantuje większą elastyczność w przesyłaniu danych
B. Transmisja danych odbywa się w wyznaczonych interwałach czasowych
C. Nie jest konieczna synchronizacja zegarów
D. Przekazywanie danych zachodzi w sposób niesystematyczny
Sieć synchroniczna charakteryzuje się tym, że transmisja danych odbywa się w ustalonych odstępach czasu, co oznacza, że wszystkie urządzenia w sieci są zsynchronizowane do jednego zegara. Taki sposób przesyłania danych pozwala na precyzyjne określenie momentu, w którym dane są wysyłane i odbierane, co redukuje opóźnienia i błędy w komunikacji. Przykładem sieci synchronicznej jest system TDM (Time Division Multiplexing), który dzieli czas na różne sloty, przydzielając każdy slot konkretnemu użytkownikowi lub urządzeniu. Dzięki temu każdy uczestnik sieci ma gwarancję, że w swoim czasie dostanie dostęp do medium transmisyjnego. Standardy takie jak SONET (Synchronous Optical Network) i SDH (Synchronous Digital Hierarchy) są przykładami technologii, które wykorzystują synchronizację do efektywnego przesyłania danych na dużych odległościach. Takie podejście jest powszechnie stosowane w telekomunikacji, gdzie wysoka wydajność i niezawodność transmisji są kluczowe dla jakości usług.

Pytanie 36

Jaką istotną właściwość ma algorytm rekurencyjny?

A. Jest podzielony na wiele niezwiązanych funkcji
B. Zawiera wywołanie samego siebie
C. Funkcjonuje tylko w przypadku tablic dynamicznych
D. Wywołuje się wielokrotnie w jednej iteracji
Wywołanie funkcji wielokrotnie w jednej iteracji jest charakterystyczne dla algorytmów iteracyjnych, a nie rekurencyjnych. Podział algorytmu na wiele niezależnych funkcji to część modularności i nie wskazuje jednoznacznie na rekurencję. Algorytmy działające wyłącznie na tablicach dynamicznych mogą być zarówno iteracyjne, jak i rekurencyjne, jednak to rekurencyjne wywołanie samego siebie stanowi kluczowy wyróżnik rekurencyjnego podejścia do problemów.

Pytanie 37

W zaprezentowanym kodzie stworzono abstrakcyjną klasę figura oraz klasę prostokąta, która dziedziczy po niej, zawierającą zdefiniowane pola i konstruktory. Wskaż minimalną wersję implementacji sekcji /* metody klasy */ dla klasy Prostokat:

abstract class Figura
{
    abstract double Pole();
    abstract double Obwod();
}

public class Prostokat extends Figura
{
    private double a;
    private double b;

    ... /* Konstruktory */
    ... /* Metody klasy */
}
AB
public double Pole() {
    return a * b;
}

public double Obwod() {
    return 2*a + 2*b;
}
public double Pole() {
    return a * b;
}
CD
public double LiczPole()
{
    return a * b;
}

public double LiczObwod()
{
    return 2*a + 2*b;
}
abstract double Pole()
{
    return a * b;
}

abstract double LiczObwod()
A. D
B. B
C. C
D. A
Analizując pozostałe propozycje implementacji, łatwo zauważyć pewne typowe błędy, które pojawiają się podczas pracy z dziedziczeniem i klasami abstrakcyjnymi. Przede wszystkim odpowiedzi, które pomijają implementację jednej z metod abstrakcyjnych zadeklarowanych w klasie Figura (jak w przypadku wariantu B), nie spełniają podstawowego wymogu języka Java – klasa pochodna musi zaimplementować wszystkie metody zadeklarowane jako abstract w klasie bazowej. W odpowiedzi B mamy tylko metodę Pole(), więc przy próbie kompilacji kodu pojawiłby się błąd i konieczność oznaczenia Prostokata jako klasy abstrakcyjnej, co zupełnie mija się z celem. Z kolei odpowiedź C wprowadza metody o innych nazwach (LiczPole, LiczObwod) niż te zadeklarowane w klasie Figura. To bardzo częsty błąd początkujących – niepoprawnie myślą, że wystarczy zaimplementować metody o tej samej funkcjonalności, bez zachowania ich nazw. Tymczasem kontrakt narzucony przez klasę bazową musi być spełniony dokładnie, razem z nazwami, typami argumentów i zwracanym typem. Ignorowanie tych szczegółów prowadzi do niespójności i niekompatybilności klas pochodnych. No i ostatnia propozycja – D – zawiera próbę napisania metody z modyfikatorem abstract w klasie, która już nie jest abstrakcyjna, co jest wprost błędem kompilacji. Dodatkowo, używanie abstract razem z ciałem metody jest niezgodne z językiem – metody abstrakcyjne nie mogą mieć implementacji w klasie abstrakcyjnej, a tym bardziej w pochodnej. To wszystko pokazuje, jak ważne w programowaniu obiektowym jest zrozumienie zasad dziedziczenia, poprawnego nadpisywania metod oraz konsekwentne trzymanie się sygnatur narzucanych przez klasy bazowe. Z praktyki wiem, że takie błędy potrafią zablokować rozwój projektu albo wymusić czasochłonne refaktoryzacje. Warto od początku przyzwyczaić się do czytania kodu bazowego i dokładnego kopiowania sygnatur metod – to oszczędza dużo nerwów i nieporozumień w pracy zespołowej.

Pytanie 38

Który z wymienionych objawów może sugerować nagłe zagrożenie dla zdrowia?

A. Obniżony nastrój w ciągu dnia
B. Zwiększona efektywność pracy
C. Intensywne pocenie się w gorącym otoczeniu
D. Ostry ból w klatce piersiowej
Ostry ból w klatce piersiowej to jeden z najbardziej alarmujących objawów wskazujących na nagłe zagrożenie zdrowotne, takie jak zawał serca lub zatorowość płucna. Tego rodzaju ból jest często opisywany jako gniotący, ściskający lub rozlewający się na inne części ciała, takie jak ramię, szyja czy żuchwa. W takich przypadkach kluczowe jest szybkie wezwanie pomocy medycznej, ponieważ każda minuta opóźnienia może zwiększyć ryzyko powikłań lub śmierci. Edukacja w zakresie rozpoznawania tego objawu może uratować życie, dlatego tak ważne jest rozróżnianie go od innych mniej groźnych objawów.

Pytanie 39

Jakie jest podstawowe zastosowanie wzorca projektowego Singleton?

A. Szybsza komunikacja pomiędzy obiektami
B. Zapewnienie jednej instancji obiektu w aplikacji
C. Tworzenie wielu instancji obiektu na podstawie klasy
D. Optymalizacja pamięci poprzez dziedziczenie
Wzorzec projektowy Singleton jest jednym z najbardziej rozpoznawalnych wzorców w świecie programowania obiektowego. Jego głównym celem jest zapewnienie istnienia dokładnie jednej instancji danej klasy w całej aplikacji, co jest kluczowe w sytuacjach, gdy posiadanie wielu instancji mogłoby prowadzić do problemów z synchronizacją lub niepożądanymi skutkami w stanach programu. Singleton jest często stosowany w kontekście zarządzania zasobami, takimi jak połączenia z bazą danych, gdzie jednoczesne posiadanie wielu połączeń może prowadzić do nieefektywnego wykorzystania zasobów. Wzorzec ten jest również używany do implementowania globalnych punktów dostępu, co umożliwia centralne zarządzanie pewnymi zasobami lub stanami w aplikacji. Z punktu widzenia dobrych praktyk, ważne jest, aby Singleton był zaimplementowany w sposób bezpieczny dla wątków, aby uniknąć problemów z wyścigami, które mogą wystąpić, gdy wiele wątków próbuje jednocześnie utworzyć instancję Singletona. Stosowanie Singletona może wprowadzać pewne ograniczenia w testowaniu jednostkowym, z uwagi na jego globalny charakter, jednak odpowiednia konstrukcja kodu, na przykład poprzez wstrzykiwanie zależności, może pomóc w zachowaniu elastyczności testowania.

Pytanie 40

Jakie zdarzenie jest wywoływane, gdy kliknięta zostaje myszą nieaktywna kontrolka lub okno?

A. keyup
B. focus
C. validating
D. blur
Wybór innego zdarzenia niż focus najczęściej wynika z pomylenia kontekstu użycia tych eventów w interfejsie użytkownika. Zdarzenie blur, choć mocno związane z focus, jest wywoływane kiedy element traci aktywność, a nie gdy ją zdobywa. To częsty błąd, bo oba pojęcia są niejako swoimi przeciwieństwami i często się je myli, zwłaszcza na początku nauki programowania interfejsów. Zdarzenie keyup z kolei dotyczy wyłącznie interakcji z klawiaturą i oznacza, że użytkownik puścił klawisz – to zupełnie inny typ wejścia i nie ma żadnego związku z klikaniem myszą w nieaktywną kontrolkę. Spotkałem się z sytuacją, gdzie ktoś mylnie kojarzył keyup z aktywowaniem pola tekstowego, ale to wynika raczej z nieporozumienia, bo keyup nie zmienia stanu aktywności (focus) żadnego elementu. Zdarzenie validating najczęściej występuje w niektórych frameworkach desktopowych (np. Windows Forms), jednak nie jest ogólnym standardem dla systemów zdarzeń i nie wywołuje się przy kliknięciu na nieaktywny element – bardziej służy do sprawdzania poprawności danych przed ich zatwierdzeniem. Błędne przekonanie, że validating lub blur mogą odpowiadać za uzyskanie aktywności przez kontrolkę, bierze się często z intuicyjnego myślenia o przełączaniu się między polami, ale w rzeczywistości tylko focus odpowiada za ten konkretny przypadek. Dlatego warto odróżniać te zdarzenia i świadomie używać ich zgodnie ze standardami, żeby nie pogubić się w logice aplikacji i zachować przewidywalność zachowania interfejsu.