Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 8 czerwca 2026 00:49
  • Data zakończenia: 8 czerwca 2026 01:12

Egzamin zdany!

Wynik: 34/40 punktów (85,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 oprogramowanie służy do monitorowania błędów oraz zarządzania projektami?

A. Jasmine
B. Git
C. Jira
D. Bugzilla
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 2

Jaki jest kluczowy zamysł wzorca "Kompozyt" (Composite)?

A. Danie możliwości dynamicznej zmiany zachowania obiektu
B. Określenie interfejsu komunikacji pomiędzy składnikami systemu
C. Umożliwienie klientom obsługi obiektów oraz ich zbiorów w spójny sposób
D. Stworzenie jednej klasy do zarządzania wieloma obiektami tego samego rodzaju
Zarządzanie wieloma obiektami tego samego typu to cecha wzorca Fabryka (Factory) lub Builder, a nie Kompozyt. Definiowanie interfejsu komunikacji między komponentami systemu to rola wzorca Mediator, który organizuje interakcje między różnymi obiektami. Umożliwienie dynamicznej zmiany zachowania obiektu jest domeną wzorca Strategia (Strategy) lub Dekorator (Decorator), które oferują elastyczność w zakresie modyfikacji zachowania podczas działania programu.

Pytanie 3

Jaki jest zasadniczy cel ataku phishingowego?

A. Zakłócanie pracy sieci przez nadmiarowe zapytania
B. Kradzież haseł z pamięci operacyjnej urządzenia
C. Uniemożliwienie dostępu do usług internetowych
D. Zbieranie danych osobowych za pomocą podszywających się stron lub wiadomości
Głównym celem ataku phishingowego jest przejęcie danych osobowych ofiary, co realizowane jest poprzez wykorzystanie fałszywych stron internetowych lub wiadomości. Atakujący tworzą atrakcyjne i wiarygodne kopie legalnych stron, często podszywając się pod znane instytucje bankowe, portale społecznościowe czy serwisy e-commerce. Użytkownik, nieświadomy zagrożenia, wprowadza swoje dane logowania, numery kart kredytowych lub inne wrażliwe informacje, które trafiają w ręce cyberprzestępców. Aby ułatwić ten proces, phisherzy często wykorzystują techniki inżynierii społecznej, takie jak fałszywe powiadomienia o konieczności weryfikacji konta. Przykłady skutecznych ataków phishingowych obejmują kampanie wysyłania e-maili, które informują użytkowników o rzekomych problemach z kontem, kierując ich na podszyte strony. Standardy bezpieczeństwa, takie jak DMARC, SPF i DKIM, są kluczowe dla ochrony przed tego rodzaju atakami, jednak ich brak lub niewłaściwe wdrożenie zwiększa podatność na phishing.

Pytanie 4

Jak najlepiej przełożyć oczekiwania klienta na dokumentację techniczną dla programistów?

A. Pomijając szczegółowe wymagania techniczne
B. Opracowując wizualne makiety bez dokładnych opisów
C. Tworząc szczegółowy dokument z funkcjami oraz wymaganiami technicznymi
D. Rozmawiając wyłącznie z zespołem programistów
Sporządzenie szczegółowego dokumentu z funkcjami i wymaganiami technicznymi to najlepszy sposób na przełożenie wymagań klienta na specyfikację techniczną. Dokumentacja techniczna jest podstawą do stworzenia aplikacji zgodnej z oczekiwaniami klienta i pozwala na precyzyjne określenie zakresu prac. Zawiera ona opisy funkcjonalności, diagramy architektury, wymagania dotyczące wydajności oraz harmonogram wdrożenia, co minimalizuje ryzyko błędów i nieporozumień podczas realizacji projektu.

Pytanie 5

Jakie są różnice między konstruktorem a zwykłą metodą w klasie?

A. Konstruktor zawsze nosi tę samą nazwę co klasa i nie zwraca wartości
B. Konstruktor powinien zwracać jakąś wartość
C. Konstruktor można wywołać bez konieczności tworzenia obiektu
D. Konstruktor jest uruchamiany jedynie przez destruktor
Konstruktor różni się od zwykłych metod klasy tym, że nosi taką samą nazwę jak klasa i nie zwraca żadnej wartości, nawet `void`. Konstruktor jest wywoływany automatycznie podczas tworzenia obiektu i nie można go wywołać ręcznie jak zwykłą metodę. Jego zadaniem jest inicjalizacja pól obiektu i przygotowanie go do działania. Przykład w C++: `class Samochod { public: Samochod() { marka = "Ford"; } }`. W przeciwieństwie do innych metod konstruktor nie wymaga deklaracji typu zwracanego, co jest jedną z jego najbardziej charakterystycznych cech.

Pytanie 6

Jakie kroki należy podjąć po wykryciu błędu w kodzie podczas testowania?

A. Pominąć błąd, jeżeli aplikacja funkcjonuje poprawnie
B. Zgłosić błąd użytkownikowi końcowemu
C. Usunąć moduł, który zawiera błąd
D. Naprawić błąd i przeprowadzić ponowne testy aplikacji
Po znalezieniu błędu w kodzie podczas testowania kluczowym krokiem jest poprawienie błędu i ponowne przetestowanie aplikacji. Taki cykl iteracyjny pozwala na eliminację błędów i zapewnienie, że aplikacja działa zgodnie z oczekiwaniami. Testowanie po każdej poprawce jest niezbędne, aby upewnić się, że wprowadzone zmiany nie wpłynęły negatywnie na inne części aplikacji. Taka praktyka jest integralną częścią Continuous Integration (CI) i Continuous Deployment (CD), które zakładają częste wdrażanie i testowanie kodu. Poprawienie błędów na wczesnym etapie rozwoju minimalizuje koszty i czas potrzebny na naprawę błędów w fazie produkcyjnej, co przyczynia się do stabilności i wysokiej jakości końcowego produktu.

Pytanie 7

Który z poniższych jest popularnym systemem zarządzania bazami danych NoSQL?

A. MongoDB
B. MySQL
C. PostgreSQL
D. Oracle
MongoDB to jeden z najbardziej popularnych systemów zarządzania bazami danych NoSQL, który został zaprojektowany z myślą o elastyczności, skalowalności i prostocie użytkowania. W odróżnieniu od tradycyjnych baz danych SQL, MongoDB przechowuje dane w formacie dokumentów BSON, co umożliwia łatwą integrację z danymi o zmiennej strukturze. Dzięki temu programiści mogą szybko prototypować aplikacje i wprowadzać zmiany w modelu danych bez konieczności przeprowadzania skomplikowanych migracji schematów. MongoDB znajduje zastosowanie w wielu nowoczesnych aplikacjach, od startupów po duże przedsiębiorstwa, w takich dziedzinach jak analiza danych, zarządzanie treścią, czy aplikacje mobilne. W praktyce, dzięki rozproszonej architekturze, możliwe jest łatwe skalowanie poziome, co oznacza dodawanie nowych instancji bazy danych w miarę rosnących potrzeb. Warto również zwrócić uwagę na bogate wsparcie dla technologii chmurowych oraz ekosystem narzędzi analitycznych, co czyni MongoDB świetnym wyborem dla aplikacji wymagających dużej wydajności i elastyczności.

Pytanie 8

Jaki z wymienionych komponentów jest kluczowy do inicjalizacji pola klasy podczas tworzenia instancji obiektu?

A. Metoda statyczna
B. Funkcja zaprzyjaźniona
C. Konstruktor
D. Instrukcja warunkowa
Konstruktor jest niezbędny do inicjalizacji pól klasy podczas tworzenia nowego obiektu. Bez konstruktora obiekt mógłby zostać utworzony w stanie nieokreślonym, co może prowadzić do błędów w działaniu programu. Konstruktor automatycznie przypisuje wartości do pól lub wykonuje inne niezbędne operacje przygotowawcze. Przykład w C++: `class Samochod { public: Samochod() { marka = "Nieznana"; } }`. W tym przypadku konstruktor ustawia domyślną wartość dla pola `marka`, co eliminuje konieczność ręcznego przypisywania wartości po utworzeniu obiektu.

Pytanie 9

Jakie działanie związane z klasą abstrakcyjną jest niedozwolone?

A. Definiowanie pól publicznych
B. Określenie metody wirtualnej
C. Rozszerzanie tej klasy
D. Utworzenie instancji tej klasy
Klasy abstrakcyjne w programowaniu obiektowym to fundament, który umożliwia wprowadzenie abstrakcji i polimorfizmu. Ich głównym celem jest zdefiniowanie wspólnego interfejsu dla klas pochodnych, natomiast nie można tworzyć ich instancji. Przykładem może być klasa abstrakcyjna 'Pojazd', która definiuje metody takie jak 'przyspiesz' i 'hamuj', ale sama nie ma implementacji tych metod. Klasy, które dziedziczą po 'Pojazd', takie jak 'Samochód' czy 'Motocykl', implementują te metody, co umożliwia ich użycie. Zgodnie z zasadami SOLID, klasa abstrakcyjna powinna być używana jako baza dla innych klas, a nie jako samodzielny obiekt. W związku z tym, próbując stworzyć instancję klasy abstrakcyjnej, napotkamy błąd kompilacji. Takie zachowanie jest zgodne z wieloma językami programowania, takimi jak Java, C# czy C++, gdzie klasy abstrakcyjne są kluczowym elementem budowy hierarchii klas oraz wzorów projektowych.

Pytanie 10

Jakie znaczenie ma polimorfizm w programowaniu obiektowym?

A. Pozwala na tworzenie obiektów z wielu różnych klas równocześnie
B. Umożliwia jednej metodzie działać w różnorodny sposób w zależności od klasy, do której należy
C. Dzieli program na klasy oraz obiekty
D. Ogranicza dostęp do atrybutów klasy
Polimorfizm to zdolność obiektów do używania tej samej metody lub interfejsu, ale z różnymi implementacjami, w zależności od klasy obiektu. Dzięki polimorfizmowi można wywołać metodę `obiekt.wyswietl()`, która zachowuje się inaczej w klasie `Samochod` i inaczej w klasie `Motocykl`, mimo że nazwa metody pozostaje taka sama. Polimorfizm ułatwia rozbudowę aplikacji, ponieważ nowe klasy mogą być dodawane bez modyfikacji istniejącego kodu, co zwiększa elastyczność i rozszerzalność programu. Jest to jedna z najważniejszych zasad programowania obiektowego, obok dziedziczenia i hermetyzacji.

Pytanie 11

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. Jednostkowe
D. Bezpieczeństwa
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 12

Jakie oprogramowanie służy jako przykład programu do komunikacji audio-wideo?

A. Microsoft Teams
B. Google Drive
C. Slack
D. Notion
Microsoft Teams to naprawdę fajne narzędzie do komunikacji. Łączy w sobie czat, wideo i audio, więc wszystko masz w jednym miejscu. Zostało stworzone przez Microsoft, żeby ułatwić współpracę w zespołach. To idealne, gdy trzeba prowadzić spotkania online z kilkoma osobami. Myślę, że to super rozwiązanie dla firm, które pracują zdalnie. Dzięki WebRTC jakość transmisji audio i wideo jest naprawdę wysoka. Można w nim organizować spotkania, webinary, a nawet stworzyć przestrzeń dla zespołów projektowych, gdzie można dzielić się plikami i prowadzić dyskusje. A jak jeszcze połączysz go z innymi aplikacjami Microsoft 365, jak OneNote czy SharePoint, to masz pełny zestaw do zarządzania projektami. Dobrze też, że Microsoft Teams dba o ochronę danych osobowych, więc jest bezpieczny dla różnych organizacji.

Pytanie 13

Który protokół jest używany do bezpiecznej komunikacji przez Internet?

A. HTTP
B. SMTP
C. FTP
D. HTTPS
HTTPS (Hypertext Transfer Protocol Secure) to protokół komunikacyjny, który zapewnia bezpieczną transmisję danych w Internecie poprzez zastosowanie kryptografii. W przeciwieństwie do swojego poprzednika HTTP, HTTPS korzysta z SSL/TLS (Secure Sockets Layer/Transport Layer Security), co pozwala na szyfrowanie danych przesyłanych pomiędzy przeglądarką internetową a serwerem. Dzięki temu, wszelkie informacje, takie jak dane osobowe, hasła czy numery kart kredytowych, są chronione przed podsłuchiwaniem i manipulacją. Użycie HTTPS jest obecnie standardem w branży, zwłaszcza w przypadku stron internetowych, które przetwarzają wrażliwe dane, takich jak sklepy internetowe czy serwisy bankowe. Przykłady zastosowania HTTPS obejmują popularne platformy e-commerce, które implementują ten protokół, aby zbudować zaufanie użytkowników oraz zwiększyć bezpieczeństwo transakcji online. Warto również zauważyć, że wyszukiwarki internetowe, takie jak Google, preferują strony korzystające z HTTPS, co wpływa na ich pozycjonowanie w wynikach wyszukiwania. Wprowadzenie HTTPS jest zatem nie tylko kwestią bezpieczeństwa, ale także praktyki zgodnej z wymaganiami SEO.

Pytanie 14

W jakiej metodzie zarządzania projektami nacisk kładzie się na ograniczenie marnotrawstwa?

A. Waterfall
B. Prototypowy
C. Scrum
D. Kanban
Scrum to inna metodologia zwinna, ale jej celem jest iteracyjne dostarczanie produktów w ramach określonych sprintów, a nie minimalizacja marnotrawstwa. Waterfall to tradycyjny model sekwencyjny, który nie koncentruje się na eliminacji marnotrawstwa, lecz na dokładnym zaplanowaniu projektu na etapie początkowym. Model prototypowy opiera się na iteracyjnym tworzeniu i testowaniu prototypów, ale jego głównym celem jest uzyskanie feedbacku od użytkowników, a nie optymalizacja przepływu pracy.

Pytanie 15

Co oznacza walidacja kodu programu?

A. Czynnością polegającą na kompilowaniu kodu
B. Czynnością dotyczącą publikacji aplikacji w sklepie
C. Czynnością weryfikującą poprawność i zgodność kodu z założeniami
D. Czynnością związaną z tworzeniem dokumentacji kodu
Walidacja kodu programu to proces sprawdzania jego poprawności i zgodności z założeniami projektowymi oraz standardami programistycznymi. Celem walidacji jest wykrycie błędów logicznych, składniowych i zgodności kodu z wymaganiami aplikacji. Walidacja może obejmować analizę statyczną kodu (bez jego wykonywania) oraz testy jednostkowe i integracyjne, które sprawdzają funkcjonalność aplikacji. Dzięki walidacji programiści mogą uniknąć błędów na późniejszych etapach rozwoju projektu, co znacząco zwiększa niezawodność i stabilność aplikacji. Proces ten jest nieodzowny w metodykach Agile i Continuous Integration, gdzie regularne testowanie kodu stanowi podstawę dostarczania wysokiej jakości oprogramowania.

Pytanie 16

Który z wymienionych dokumentów jest najczęściej stosowany w zarządzaniu pracą zespołu Scrum?

A. Product backlog
B. Specyfikacja techniczna
C. Diagram Gantta
D. Lista zasobów ludzkich
Diagram Gantta jest fajnym narzędziem do pokazywania harmonogramu, ale nie ma go w zarządzaniu backlogiem. Specyfikacja techniczna to co innego – tam są szczegóły implementacyjne, a nie priorytety funkcji. Lista zasobów ludzkich to temat o zarządzaniu personelem, a nie o zadaniach i priorytetach w Scrumie. Więc tu bardziej musisz uważać na to, co do czego pasuje.

Pytanie 17

Co to jest ORM w kontekście programowania?

A. Output Rendering Module - moduł renderujący dane wyjściowe w aplikacjach
B. Operational Reliability Management - zarządzanie niezawodnością operacyjną systemów
C. Object-Relational Mapping - technika konwersji danych między systemami typów w relacyjnych bazach danych
D. Organized Resource Model - model organizacji zasobów w aplikacjach webowych
Object-Relational Mapping (ORM) to technika programistyczna, która pozwala na konwersję danych pomiędzy obiektami w programowaniu obiektowym a relacyjnymi bazami danych. Dzięki ORM, programiści mogą operować na danych w sposób bardziej naturalny, wykorzystując obiekty i ich właściwości zamiast skomplikowanych zapytań SQL. Przykłady popularnych frameworków ORM to Hibernate dla Javy, Entity Framework dla .NET oraz Django ORM dla Pythona. Te narzędzia upraszczają komunikację z bazą danych, co zwiększa wydajność i ułatwia zarządzanie kodem. Dzięki zastosowaniu ORM, programiści mogą również łatwiej stosować zasady programowania obiektowego oraz wzorce projektowe, co prowadzi do lepszej organizacji kodu i jego łatwiejszej konserwacji. Wspierają one również migracje schematów bazy danych oraz zarządzanie relacjami między obiektami, co jest istotne w kontekście złożonych aplikacji webowych i systemów informatycznych.

Pytanie 18

Który system operacyjny jest podstawowym środowiskiem do tworzenia aplikacji mobilnych w języku Swift?

A. Android
B. LG UX
C. iOS
D. Windows UWP
Swift to język programowania stworzony przez Apple specjalnie z myślą o ekosystemie tej firmy, czyli głównie o systemach iOS, macOS, watchOS oraz tvOS. To właśnie iOS jest podstawową, domyślną platformą, na której programiści wykorzystują Swift do budowania aplikacji mobilnych. Praktycznie każda nowoczesna aplikacja na iPhone’a czy iPada, która powstała po 2014 roku, jest przynajmniej w części napisana w Swifcie, bo to obecnie standard branżowy w świecie Apple. Moim zdaniem to jest super wygodne, bo Apple dostarcza kompletne narzędzia do pracy ze Swiftem, jak Xcode czy rozbudowane frameworki (UIKit, SwiftUI). Z mojego doświadczenia wynika, że programowanie w Swifcie dla iOS to nie tylko prostsza składnia, ale też większa stabilność i bezpieczeństwo aplikacji – Apple bardzo dba o aktualizacje narzędzi i dobre praktyki. Warto też pamiętać, że od wersji SwiftUI rozwijanie aplikacji na iOS stało się jeszcze bardziej intuicyjne, bo można korzystać z deklaratywnego podejścia do interfejsów. W realnych projektach spotyka się też Objective-C, ale obecnie Swift wygrywa czytelnością i wsparciem społeczności. Gdyby ktoś chciał tworzyć aplikacje mobilne poza ekosystemem Apple, to niestety Swift nie będzie najlepszym wyborem – właśnie dlatego iOS jest tym środowiskiem, do którego Swift został stworzony i tam najbardziej się sprawdza.

Pytanie 19

Jakie elementy powinny być ujęte w dokumentacji programu?

A. Strategia marketingowa aplikacji
B. Opis funkcji, klas i zmiennych w kodzie
C. Zestawienie błędów zidentyfikowanych w trakcie testów
D. Szczegóły dotyczące konfiguracji serwera
Opis funkcji, klas i zmiennych w kodzie to kluczowy element dokumentacji programu. Tego rodzaju dokumentacja pozwala na lepsze zrozumienie struktury aplikacji, jej logiki biznesowej oraz wzajemnych zależności pomiędzy poszczególnymi komponentami. Dokumentacja techniczna obejmuje szczegółowe informacje na temat implementacji, interfejsów API, schematów baz danych oraz sposobów integracji z innymi systemami. Dzięki niej programiści mogą szybciej wdrażać się w projekt, a błędy i niejasności są minimalizowane. Kompleksowa dokumentacja zawiera także przykłady użycia poszczególnych funkcji, co dodatkowo ułatwia rozwój i rozbudowę aplikacji. W dobrze prowadzonym projekcie dokumentacja kodu jest na bieżąco aktualizowana, co zwiększa jego przejrzystość i wspiera proces refaktoryzacji.

Pytanie 20

Co to jest WebSockets?

A. Protokół komunikacyjny zapewniający dwukierunkową komunikację między przeglądarką a serwerem
B. Biblioteka JavaScript do manipulacji danymi JSON
C. Format zapisu danych w bazach NoSQL
D. Metoda zabezpieczania połączeń HTTP
WebSockets to protokół komunikacyjny, który umożliwia dwukierunkową, pełnodupleksową komunikację między klientem a serwerem. To oznacza, że zarówno przeglądarka, jak i serwer mogą wysyłać dane w dowolnym momencie, co znacząco różni się od tradycyjnego modelu HTTP, gdzie klient inicjuje każde połączenie. Przykładem zastosowania WebSockets jest aplikacja czatu w czasie rzeczywistym, gdzie użytkownicy mogą widzieć wiadomości natychmiastowo, bez potrzeby odświeżania strony. Dodatkowo, WebSockets zmniejszają opóźnienia w komunikacji, co jest kluczowe w aplikacjach wymagających szybkiej interakcji, takich jak gry online czy platformy do handlu. Warto zaznaczyć, że WebSockets są zdefiniowane w standardzie IETF jako RFC 6455, a ich wykorzystanie powinno być zgodne z najlepszymi praktykami w zakresie bezpieczeństwa, takimi jak użycie protokołu wSecure WebSockets (wss://) do zapewnienia bezpieczeństwa przesyłanych danych.

Pytanie 21

Co zostanie wypisane w konsoli po wykonaniu poniższego kodu?

let i = 0;
while (i < 5) {
  i++;
  if (i === 3) continue;
  console.log(i);
}
A. 1, 2, 4, 5
B. 0, 1, 2, 3, 4
C. 1, 2, 3, 4, 5
D. 0, 1, 2, 4, 5
W przedstawionym kodzie mamy do czynienia z pętlą while, która działa, dopóki zmienna i jest mniejsza od 5. Na początku i jest równe 0, a w każdej iteracji pętli i jest zwiększane o 1. Wewnątrz pętli mamy warunek, który sprawdza, czy i jest równe 3. Jeżeli tak, to używamy instrukcji continue, co oznacza, że pomijamy resztę kodu w tej iteracji i wracamy do początku pętli. Przeanalizujmy, co się stanie w kolejnych iteracjach: w pierwszej iteracji i jest 1, więc wypisujemy 1, w drugiej iteracji i jest 2, więc wypisujemy 2. Gdy i osiąga 3, warunek if jest spełniony i przechodzimy do następnej iteracji, nie wypisując nic. Następnie i staje się 4 i 5, które również są wypisywane. W efekcie na konsoli zostanie wypisane 1, 2, 4, 5. Takie podejście pokazuje, jak ważne jest zrozumienie działania pętli i instrukcji sterujących w JavaScript, co jest kluczowe w programowaniu i pozwala na efektywne zarządzanie przepływem kodu.

Pytanie 22

Który z wymienionych poniżej przykładów ilustruje prawidłowy szkielet zarządzania wyjątkami w języku C++?

A. try { kod } except { obsługa }
B. try { kod } handle { obsługa }
C. try { kod } finally { obsługa }
D. try { kod } catch { obsługa }
Jak to wygląda w C++? Kluczowym elementem jest szkielet z blokami 'try' i 'catch'. W bloku 'try' piszesz kod, który może spowodować błąd, a 'catch' zajmuje się sytuacjami, kiedy coś pójdzie nie tak. Dzięki temu nie musisz się martwić, że program nagle przestanie działać, bo masz kontrolę nad tym, jak reagować w trudnych momentach. Obsługa wyjątków to naprawdę ważna sprawa w programowaniu, bo pomaga wyłapać różne problemy, czy to z danymi, z pamięcią, czy z plikami. Z mojego doświadczenia, to po prostu sprawia, że aplikacje są bardziej stabilne i działa to na korzyść zarówno programisty, jak i użytkownika.

Pytanie 23

Przedstawione logo praw Creative Commons umożliwia bezpłatne użytkowanie dzieła:

Ilustracja do pytania
A. pod warunkiem zachowania go w oryginalnej formie
B. w celu modyfikacji lub remiksowania
C. pod warunkiem udostępnienia go na tej samej zasadzie licencyjnej
D. w działaniach komercyjnych
To, że odpowiedź dotycząca modyfikacji i remiksowania jest poprawna, wynika bezpośrednio z zasad licencji Creative Commons, a w tym przypadku – oznaczenia BY-NC. Licencja ta pozwala na używanie utworów, w tym także ich przerabianie i tworzenie nowych dzieł pochodnych, pod warunkiem podania autora i nieużywania do celów komercyjnych. W praktyce oznacza to, że możesz wziąć na przykład czyjąś grafikę na tej licencji, przerobić ją, dodać coś od siebie, zrobić z tego plakat na szkolną wystawę lub użyć fragmentu w prezentacji – o ile tylko przestrzegasz warunków. Z mojego doświadczenia wynika, że wiele osób myli się co do tego, że modyfikacja jest zabroniona – a właśnie Creative Commons daje tutaj spore pole do popisu. Zasada remiksowania jest wręcz promowana, bo pozwala rozwijać kulturę. Oczywiście, cały czas trzeba pamiętać o atrybucji twórcy i nie używać dzieła do zarabiania, bo wtedy łamiesz warunki licencji. W środowisku technicznym to jest bardzo praktyczne – możesz wzorować się na czyjejś pracy, rozwijać ją i poprawiać, co w branży IT, grafiki czy edukacji jest na porządku dziennym. Warto też zerkać do oficjalnych wytycznych Creative Commons: one wprost potwierdzają, że modyfikacja i adaptacja są dozwolone przy BY-NC, pod warunkiem braku komercji. W sumie – świetna opcja na rozwój własnych projektów!

Pytanie 24

Która z operacji logicznych zwróci wartość "true", gdy obie zmienne są sobie równe?

A. x != y
B. x == y
C. x && y
D. x || y
Operator `==` w języku C++ i wielu innych językach programowania (np. Python, Java, JavaScript) służy do porównywania dwóch wartości. Zwraca `true`, jeśli obie wartości są sobie równe, oraz `false`, jeśli są różne. Przykład: `if (x == y)` sprawdza, czy zmienna `x` jest równa zmiennej `y`. Operator ten jest kluczowy w instrukcjach warunkowych oraz pętlach, gdzie konieczne jest porównywanie wartości w celu podejmowania decyzji na podstawie wyniku tego porównania.

Pytanie 25

Do implementacji w aplikacji jednokierunkowej funkcji skrótu, zwanej funkcją haszującą, można wykorzystać algorytm

A. MD5
B. RSA
C. DES
D. AES
MD5 to przykład klasycznej funkcji skrótu, czyli właśnie tej funkcji, która generuje z dowolnie długych danych wejściowych stałej długości skrót (hash). Funkcje haszujące są szeroko stosowane w informatyce, szczególnie tam, gdzie potrzebna jest szybka weryfikacja integralności danych albo przechowywanie haseł w bazie danych w sposób bezpieczny (chociaż MD5 dziś już nie poleca się do haseł przez znane luki bezpieczeństwa – lepsze są SHA-256 czy bcrypt). To, co wyróżnia funkcje skrótu jak MD5, to ich jednokierunkowość: znając wynik, praktycznie nie jesteśmy w stanie odtworzyć oryginalnych danych wejściowych, a nawet minimalnie różniące się dane dają zupełnie inne hashe. Przykład praktyczny? Sprawdzenie sumy kontrolnej pliku po pobraniu z internetu – porównujemy hash MD5 z podanym na stronie wydawcy i mamy pewność, że plik nie został podmieniony. W praktyce branżowej, zgodnie z normami bezpieczeństwa jak np. ISO/IEC 27001, funkcje haszujące są podstawą wielu procesów kryptograficznych. Moim zdaniem, znajomość takich algorytmów jak MD5, nawet jeśli już nie jest zalecany w nowych systemach, to podstawa do zrozumienia ogólnego działania funkcji skrótu i różnicy między nimi a szyfrowaniem. Często spotykałem się z myleniem tych pojęć, więc warto to dobrze rozumieć.

Pytanie 26

Który z operatorów w języku C++ służy do pobierania adresu zmiennej?

A. &gt;
B. delete
C. *
D. &amp;
Wielka sprawa, że wiesz, że operator '&' w C++ jest do przypisywania adresów zmiennych. Dzięki temu możesz stworzyć wskaźnik, który wskazuje na konkretne miejsce w pamięci, co daje ci dużą moc do manipulowania wartościami. Używając tego operatora, możesz naprawdę dobrze zarządzać pamięcią i poprawić wydajność swojego kodu. Jest to kluczowe, zwłaszcza, gdy pracujesz z dynamiczną alokacją pamięci, albo kiedy iterujesz przez tablice czy tworzysz takie struktury jak listy czy drzewa. To narzędzie jest po prostu super ważne w programowaniu!

Pytanie 27

W jaki sposób określa się wypadek związany z pracą?

A. Każdy incydent wynikający z działania osób trzecich
B. Nagłe zdarzenie związane z pracą, powodujące uraz lub śmierć
C. Każde zdarzenie, które wymaga interwencji technicznej w miejscu zatrudnienia
D. Każde zdarzenie, które prowadzi do opóźnienia w wykonaniu obowiązków
Wypadek przy pracy to nagłe zdarzenie związane z wykonywaną pracą, które powoduje uraz lub śmierć pracownika. Wypadki te mogą być wynikiem zaniedbań, nieprzestrzegania zasad BHP lub nieodpowiedniego zabezpieczenia stanowiska pracy. Przykładami wypadków przy pracy są upadki z wysokości, porażenia prądem, oparzenia chemiczne lub uszkodzenia ciała przez maszyny. Pracodawca jest zobowiązany do zgłaszania każdego wypadku przy pracy, prowadzenia dochodzenia w celu ustalenia przyczyn i wdrażania działań zapobiegających powtórzeniu się podobnych sytuacji. Wypadki przy pracy są jedną z głównych przyczyn absencji oraz roszczeń pracowniczych, dlatego prewencja i edukacja w zakresie BHP są niezwykle istotne.

Pytanie 28

Który typ testów jest wykonywany na pojedynczych komponentach lub funkcjach w izolacji?

A. Testy akceptacyjne
B. Testy systemowe
C. Testy integracyjne
D. Testy jednostkowe
Testy jednostkowe to podstawowy rodzaj testów, które koncentrują się na weryfikacji pojedynczych komponentów lub funkcji aplikacji w izolacji. Ich celem jest upewnienie się, że dany element kodu działa zgodnie z oczekiwaniami. Przykładowo, jeśli mamy funkcję, która oblicza sumę dwóch liczb, test jednostkowy sprawdzi, czy ta funkcja poprawnie zwraca wynik dla różnych zestawów danych wejściowych. Zastosowanie testów jednostkowych jest kluczowe w nowoczesnym programowaniu, ponieważ pozwala na szybkie wykrywanie błędów na wczesnym etapie rozwoju oprogramowania. Dzięki nim można również łatwiej wprowadzać zmiany w kodzie, gdyż mając pewność, że pojedyncze komponenty działają prawidłowo, można modyfikować całą aplikację bez obaw o wprowadzenie nowych błędów. W praktyce, testy jednostkowe są często zautomatyzowane i stanowią integralną część ciągłej integracji (CI), co pozwala na szybkie i efektywne testowanie kodu przy każdej zmianie. Dobre praktyki w zakresie testów jednostkowych obejmują pisanie testów przed właściwą implementacją kodu (tzw. TDD - Test Driven Development) oraz stosowanie odpowiednich narzędzi, takich jak JUnit dla Javy czy NUnit dla .NET.

Pytanie 29

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

A. indeks jest równy lub większy od rozmiaru tablicy
B. wartość przewyższa jego indeks
C. wartość przekracza rozmiar tablicy
D. indeks mieści się w zakresie od 0 do n-1, gdzie n oznacza rozmiar tablicy
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 30

Który z poniższych wzorców projektowych jest używany do tworzenia pojedynczej instancji klasy w całej aplikacji?

A. Factory
B. Singleton
C. Decorator
D. Observer
Wzorzec projektowy Singleton jest kluczowym rozwiązaniem w sytuacjach, gdy chcemy zapewnić istnienie tylko jednej instancji danej klasy w całej aplikacji. Singleton kontroluje instancję wewnętrznie, co oznacza, że niezależnie od tego, ile razy próbujemy stworzyć obiekt tej klasy, zawsze otrzymamy ten sam obiekt. W praktyce, wzorzec ten jest szeroko stosowany w sytuacjach, gdzie zarządzanie zasobami, takimi jak połączenia z bazą danych czy konfiguracyjne obiekty, musi być centralizowane. Przykładowo, przy użyciu wzorca Singleton możemy mieć jeden obiekt zarządzający połączeniem z bazą danych, co redukuje nadmiarowe zasoby i zwiększa wydajność. Istotne jest jednak, aby zaimplementować Singleton zgodnie z zasadami wielowątkowości, aby uniknąć problemów w aplikacjach równoległych, co jest zgodne z najlepszymi praktykami branżowymi. Dodatkowo, wzorzec ten podkreśla znaczenie zarządzania stanem aplikacji oraz przestrzegania zasad odpowiedzialności klas, co wspiera czystość i utrzymanie kodu.

Pytanie 31

Testy mające na celu identyfikację błędów w interfejsach między modułami bądź systemami nazywane są testami

A. integracyjnymi
B. bezpieczeństwa
C. wydajnościowymi
D. jednostkowymi
Testy integracyjne mają na celu wykrycie błędów w interfejsach i połączeniach między modułami lub systemami. Głównym celem tych testów jest sprawdzenie, czy różne komponenty aplikacji współpracują ze sobą zgodnie z oczekiwaniami. Testy integracyjne są przeprowadzane po testach jednostkowych, ale przed testami systemowymi. W praktyce testy te obejmują scenariusze, w których kilka modułów wymienia dane lub współdziała w ramach wspólnego procesu. Integracja jest kluczowa dla zapewnienia, że cały system działa jako spójna całość, co minimalizuje ryzyko błędów na etapie produkcji i poprawia jakość końcowego produktu. Przykładem może być test komunikacji między modułem autoryzacji użytkowników a modułem płatności w aplikacji e-commerce.

Pytanie 32

W przedstawionym filmie ukazano kreator interfejsu użytkownika, dla którego automatycznie powstaje

A. kod Java
B. obsługa wciśniętego przycisku
C. kod XML
D. obsługa przycisku ekranu dotykowego
Kod XML jest obecnie najczęściej stosowanym formatem do definiowania wyglądu interfejsów użytkownika w takich narzędziach jak Android Studio czy różnego rodzaju designery graficzne. Kiedy projektujesz layout aplikacji mobilnej albo desktopowej, duża część nowoczesnych narzędzi tworzy właśnie pliki XML, które następnie są interpretowane przez system w czasie uruchamiania aplikacji. Ułatwia to rozdzielenie logiki aplikacji od jej prezentacji, co wydaje się fundamentalne przy większych projektach. Moim zdaniem takie podejście daje ogromne korzyści – można łatwo modyfikować wygląd bez dotykania kodu źródłowego. W praktyce, jeśli używasz np. Android Studio, zbudujesz interfejs przeciągając przyciski czy pola tekstowe, a pod spodem dostaniesz czytelny plik XML. To przyspiesza pracę, zwiększa czytelność projektu i pozwala na późniejsze automatyczne generowanie dokumentacji albo testów interfejsu. Takie standardy są rekomendowane nie tylko przez Google, ale też szeroko stosowane w innych środowiskach, jak chociażby XAML w Microsoft czy FXML w JavaFX. Przezroczystość działania tych narzędzi sprawia, że łatwiej jest pracować zespołowo, bo każdy może szybko zorientować się w strukturze UI patrząc na XML-a. Samo generowanie kodu XML przez narzędzia graficzne to duży krok w kierunku lepszej organizacji pracy i zgodności ze współczesnymi praktykami branżowymi.

Pytanie 33

Które z wymienionych narzędzi najlepiej chroni dane na urządzeniach mobilnych?

A. Nieaktualne oprogramowanie
B. Hasło ustawione na urządzeniu
C. Zainstalowanie aplikacji rozrywkowych
D. Szyfrowanie danych na urządzeniu
Szyfrowanie danych na urządzeniu przenośnym to jedna z najskuteczniejszych metod zabezpieczania poufnych informacji. Szyfrowanie przekształca dane w formę, która jest nieczytelna dla osób nieposiadających odpowiedniego klucza deszyfrującego. Dzięki temu, nawet jeśli urządzenie zostanie zgubione lub skradzione, dane pozostają zabezpieczone przed nieautoryzowanym dostępem. Szyfrowanie to standardowa praktyka stosowana przez największe firmy technologiczne i jest zalecana we wszystkich urządzeniach przenośnych, takich jak laptopy i smartfony.

Pytanie 34

W przedstawionej ramce znajduje się fragment opisu metody compile języka Java wykorzystywanej w kontekście wyrażeń regularnych. Który symbol powinien być użyty, aby znaleźć dopasowanie na końcu tekstu?

MetacharacterDescription
|Find a match for any one of the patterns separated by | as in: cat|dog|fish
.Find just one instance of any character
^Finds a match as the beginning of a string as in: ^Hello
$Finds a match at the end of the string as in: World$
\dFind a digit
\sFind a whitespace character
\bFind a match at the beginning of a word like this: \bWORD, or at the end of a word like this: WORD\b
\uxxxxFind the Unicode character specified by the hexadecimal number xxxx
Źródło https://www.w3schools.com/java/java_regex.asp dostęp 20.08.2020
A. $
B. .
C. ^
D. |
Znak dolara $ w wyrażeniach regularnych w języku Java jest używany do oznaczenia końca ciągu znaków. Jeśli chcemy sprawdzić, czy konkretny wzorzec występuje na końcu danego tekstu, używamy właśnie tego metaznaku. Przykładowo, wyrażenie regularne World$ dopasuje tekst, w którym słowo World pojawia się na samym końcu. Jest to przydatne w wielu scenariuszach, takich jak walidacja struktury tekstu czy filtrowanie logów, gdzie ważna jest pozycja występowania wzorca. Konwencja ta jest zgodna z ogólnymi standardami regex, co czyni ją intuicyjną i uniwersalną w zastosowaniu. Dolar pełni kluczową rolę w automatyzacji procesów w przetwarzaniu tekstu, umożliwiając efektywne dopasowywanie końcowych wzorców w aplikacjach Java. Użycie $ jest zgodne z dobrymi praktykami kodowania, szczególnie w kontekście walidacji danych wejściowych, gdzie określenie końca ciągu jest często wymagane. Jest to także popularne w analizie danych, gdzie dane muszą spełniać określone kryteria co do ich zakończenia, takie jak rozszerzenia plików czy określone etykiety tekstowe.

Pytanie 35

Kod przedstawiony w języku XML/XAML określa:

<Switch
    android:id = "@+id/switch1"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:background = "#00ffff"
    android:text = "Switch"
    tools:layout_editor_absoluteX = "176dp"
    tools:layout_editor_absoluteY = "389dp" />
A. stepper
B. listę rozwijaną
C. przełącznik
D. suwak
Kod przedstawiony w pytaniu to klasyczny przykład wykorzystania komponentu Switch w Androidzie. Switch, jak sama nazwa wskazuje, służy do przełączania między dwoma stanami — najczęściej włącz/wyłącz, aktywne/nieaktywne. Z punktu widzenia interfejsów mobilnych, przełącznik bardzo często znajduje zastosowanie w ustawieniach aplikacji, np. do szybkiego włączania trybu ciemnego, aktywacji powiadomień czy zezwalania na lokalizację. Ten konkretny xml zawiera podstawowe atrybuty, jak android:id, layout_width, layout_height oraz background, czyli kolor tła, co od razu sugeruje, że nie jest to np. dropdown czy suwak. Co ciekawe, Switch różni się od CheckBoxa tym, że wizualnie lepiej komunikuje zmianę trybu (przesuwający się znacznik), co moim zdaniem zwiększa użyteczność, szczególnie jeśli użytkownik ma szybko zrozumieć, co ustawia. Standardy Material Design wręcz zalecają stosowanie Switch do kontrolowania pojedynczych ustawień, bo jest to bardziej czytelne niż inne widgety. Warto pamiętać, że Switch ma różne warianty i można go rozbudować o obsługę zdarzeń onCheckedChangeListener w kodzie Java albo Kotlin, przez co staje się bardzo elastyczny. Odpowiedź przełącznik jest więc zgodna ze wszystkimi cechami tej kontrolki i jej zastosowaniami w praktyce.

Pytanie 36

Jaką wartość zwróci poniższa funkcja dla argumentu n = 5?

function silnia(n) {
  if (n <= 1) return 1;
  return n * silnia(n - 1);
}
A. 24
B. 60
C. 5
D. 120
Funkcja silnia(n) oblicza wartość silni z liczby n, co jest matematyczną operacją polegającą na mnożeniu wszystkich liczb całkowitych dodatnich od 1 do n. Dla argumentu n = 5, obliczamy silnię w następujący sposób: silnia(5) = 5 * silnia(4). Następnie, silnia(4) = 4 * silnia(3), a silnia(3) = 3 * silnia(2), gdzie silnia(2) = 2 * silnia(1), a silnia(1) zwraca 1, ponieważ jest to warunek bazowy. Teraz możemy podstawić wartości: silnia(2) = 2 * 1 = 2, silnia(3) = 3 * 2 = 6, silnia(4) = 4 * 6 = 24, a na końcu silnia(5) = 5 * 24 = 120. Tak więc, wartość zwrócona przez funkcję dla n = 5 to 120. W praktyce, obliczanie silni jest przydatne w różnych dziedzinach, takich jak kombinatoryka, statystyka czy analiza danych. Zrozumienie tej koncepcji jest kluczowe w programowaniu, ponieważ często wykorzystuje się rekurencję do rozwiązywania problemów, które można podzielić na mniejsze podproblemy. Korzystając z rekurencyjnych funkcji, warto pamiętać o podstawowych warunkach, które kończą wywołania rekurencyjne, aby uniknąć nieskończonych pętli.

Pytanie 37

Które z poniższych NIE jest zasadą programowania SOLID?

A. Open/Closed Principle (Zasada otwarte/zamknięte)
B. Dependency Inversion Principle (Zasada odwrócenia zależności)
C. Single Responsibility Principle (Zasada pojedynczej odpowiedzialności)
D. Code Reuse Principle (Zasada ponownego użycia kodu)
Odpowiedź "Code Reuse Principle" jest prawidłowa, ponieważ nie stanowi ona jednej z pięciu zasad programowania SOLID. SOLID to akronim, który odnosi się do pięciu podstawowych zasad, które mają na celu ułatwienie tworzenia oprogramowania, które jest łatwe w utrzymaniu i rozwijaniu. W skład tych zasad wchodzą: Zasada pojedynczej odpowiedzialności (Single Responsibility Principle), Zasada otwarte/zamknięte (Open/Closed Principle), Zasada segregacji interfejsów (Interface Segregation Principle), Zasada odwrócenia zależności (Dependency Inversion Principle) oraz Zasada Liskov (Liskov Substitution Principle). Przykładowo, Zasada pojedynczej odpowiedzialności zakłada, że każda klasa powinna mieć jedną, jasno określoną odpowiedzialność, co pozwala na łatwiejsze testowanie i modyfikowanie kodu bez wpływu na inne jego części. Użycie zasad SOLID w praktyce prowadzi do lepszego rozdzielenia logiki aplikacji i ułatwia jej rozwój oraz utrzymanie, co jest kluczowe w długoterminowych projektach programistycznych.

Pytanie 38

Co oznacza termin 'hoisting' w JavaScript?

A. Metoda ładowania skryptów z zewnętrznych źródeł
B. Technika zarządzania pamięcią polegająca na usuwaniu nieużywanych obiektów
C. Optymalizacja kodu wykonywana przez silnik JavaScript
D. Przenoszenie deklaracji zmiennych i funkcji na górę ich zakresu podczas fazy kompilacji
Termin 'hoisting' w JavaScript odnosi się do mechanizmu, który przenosi deklaracje zmiennych oraz funkcji na górę ich zakresu, zanim kod zostanie wykonany. To oznacza, że zmienne i funkcje mogą być używane przed ich faktycznym zadeklarowaniem w kodzie. Dla zmiennych zadeklarowanych za pomocą 'var', ich deklaracja jest unoszona, ale nie inicjalizacja. To oznacza, że można odwołać się do zmiennej przed jej przypisaniem, ale jej wartość będzie 'undefined'. W przypadku funkcji, cała deklaracja jest przenoszona, co pozwala na wywoływanie funkcji przed ich zdefiniowaniem. Przykład takiego działania to: `console.log(a); var a = 5;` - w tym przypadku, logowanie zmiennej 'a' przed przypisaniem zwróci 'undefined'. Zrozumienie hoistingu jest kluczowe dla pisania poprawnego i czytelnego kodu w JavaScript oraz unikania pułapek, które mogą prowadzić do trudnych do wykrycia błędów. Holistyczne podejście do hoistingu zachęca programistów do stosowania deklaracji na początku funkcji lub skryptu, co poprawia przejrzystość i zarządzanie zakresem w kodzie.

Pytanie 39

Jakie pola powinny być umieszczone w klasie nadrzędnej w strukturze dziedziczenia?

A. Pola, które są tylko prywatne
B. Pola, które są wykorzystywane tylko w funkcjach statycznych
C. Pola, które są charakterystyczne jedynie dla pojedynczej klasy pochodnej
D. Pola, które są wspólne dla wszystkich klas pochodnych
W klasie bazowej w hierarchii dziedziczenia umieszcza się pola, które są wspólne dla wszystkich klas pochodnych. Dzięki temu klasy pochodne mogą dziedziczyć te same właściwości, co eliminuje konieczność ich wielokrotnego definiowania. Jest to jedna z głównych zalet programowania obiektowego, umożliwiająca reużywalność kodu i zwiększenie spójności w projekcie. Przykładem może być klasa 'Pracownik', która zawiera pola takie jak 'imię', 'nazwisko' i 'wynagrodzenie', a klasy pochodne, takie jak 'Inżynier' czy 'Księgowy', mogą dziedziczyć te same pola, dodając jedynie specyficzne właściwości dla swojej roli.

Pytanie 40

Z podanej definicji pola licznik można wywnioskować, iż

class MojaKlasa
{
    private static int licznik;
    ...
A. pole nie może być zmieniane w kodzie klasy
B. bieżąca wartość pola jest wspólna dla wszystkich instancji klasy i nie może być zmieniana
C. bieżąca wartość pola jest wspólna dla wszystkich instancji klasy
D. pole jest związane z określoną instancją klasy i jego wartość jest unikalna tylko dla tej instancji
Warto się chwilę zatrzymać i przeanalizować, skąd biorą się błędne przekonania dotyczące pól statycznych. Bardzo częstym nieporozumieniem jest utożsamianie słowa static z czymś „niezmiennym” albo uniemożliwiającym modyfikacje. Tymczasem static oznacza tyle, że pole nie jest związane z pojedynczym obiektem, tylko z całą klasą – czyli wszystkie obiekty tej klasy dzielą jedną, wspólną wartość licznik. To nie jest tak, że static czyni pole stałym – żeby pole było niezmienne, potrzeba słowa kluczowego final (w Javie), a tutaj go ewidentnie nie ma. Często osoby początkujące mylą static z final i stąd pojawia się przekonanie, że pole nie może być modyfikowane – co nie jest prawdą. Równie błędne jest zakładanie, że każde pole, które nie jest static, jest automatycznie unikalne per instancja. Gdybyśmy usunęli static z definicji licznik, wtedy rzeczywiście każda instancja MojaKlasa miałaby swoją własną wersję tej zmiennej, ale w tym przypadku wszystkie obiekty współdzielą tę samą wartość. Jeszcze inny błąd to przekonanie, że pole prywatne (private) nie może być zmieniane w kodzie klasy – w rzeczywistości private ogranicza dostęp do pola tylko do wnętrza klasy, ale metody tej klasy mają pełne prawo je modyfikować. Tak więc, patrząc z perspektywy dobrych praktyk programistycznych i samej składni, static to po prostu cecha, która decyduje o zakresie współdzielenia pola pomiędzy instancjami, a nie o jego niezmienności czy widoczności na zewnątrz. Moim zdaniem kluczowe jest wyciągnięcie z tego wniosku, że static to współdzielenie, a nie blokada zmian – i na tym polega istota poprawnej odpowiedzi w tym pytaniu.