Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 28 kwietnia 2026 18:27
  • Data zakończenia: 28 kwietnia 2026 18:38

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

Na przedstawionym obrazie widać fragment emulacji systemu iOS z prostą aplikacją. Górna część ekranu nachodzi na pasek stanu baterii. Który z poniższych zapisów powinien zostać użyty w miejscu znaków zapytania, aby ustawić jedynie marginesy górne tylko dla systemu iOS?

Ilustracja do pytania
A. x:TypeArguments="Thickness"<br/> iOS= "0, 20, 0, 0"<br/> Android= "0, 0, 0, 0"<br/> WinPhone= "0, 0, 0, 0"
B. x:TypeArguments="Thickness" <br/> (0, 20, 0, 0)
C. x:TypeArguments="Thickness"<br/> iOS= "0, 0, 0, 0"<br/> Android= "0, 20, 0, 0"<br/> WinPhone= "0, 0, 0, 0"
D. x:TypeArguments="Thickness"<br/> iOS= 20
Odpowiedź czwarta jest prawidłowa, ponieważ prawidłowo wykorzystuje mechanizm OnPlatform w XAML do zastosowania specyficznych ustawień dla różnych platform. W przypadku iOS zastosowano margines górny wynoszący 20 jednostek, co jest konieczne, aby uwzględnić przestrzeń zajmowaną przez status bar systemowy. Takie podejście jest zgodne z dobrymi praktykami projektowania aplikacji wieloplatformowych, gdzie różne platformy mogą wymagać różnych ustawień interfejsu użytkownika. Przykładowo, w aplikacjach tworzonych przy użyciu Xamarin.Forms, korzystanie z OnPlatform pozwala na dynamiczne dostosowywanie interfejsu w zależności od platformy, co zwiększa elastyczność i poprawia doświadczenie użytkownika. Dodatkowo, zastosowanie marginesów tylko dla platformy iOS pozwala na zachowanie spójności i pełną kontrolę nad wyglądem aplikacji na innych platformach takich jak Android czy Windows Phone, gdzie takie dostosowanie nie jest konieczne. Uwzględnienie tych różnic jest kluczowe dla tworzenia aplikacji, które wyglądają i działają dobrze na wszystkich docelowych urządzeniach.

Pytanie 2

Jakie wartości może przyjąć zmienna typu boolean?

A. true, false
B. trzy dowolne liczby naturalne
C. 1, -1
D. O oraz każdą liczbę całkowitą
Zmienna typu logicznego (boolowskiego) w językach programowania, takich jak C++, Java czy Python, może przyjmować tylko dwie wartości: true (prawda) oraz false (fałsz). Te wartości są fundamentalne w logice komputerowej, ponieważ umożliwiają podejmowanie decyzji oraz kontrolowanie przepływu programu poprzez struktury warunkowe, takie jak instrukcje if, while czy for. Na przykład, w języku Python, tworząc zmienną logiczną, możemy użyć operatorów porównania, aby określić, czy dwie wartości są równe: is_equal = (5 == 5), co ustawia is_equal na true. Zmienne logiczne są zdefiniowane w standardach programowania, takich jak IEEE 754 dla reprezentacji liczb zmiennoprzecinkowych, gdzie wartość logiczna jest kluczowa dla operacji porównawczych. Dobrze zrozumiana logika boolowska jest niezbędna dla programistów, ponieważ stanowi podstawę algorytmu decyzyjnego oraz wpływa na efektywność kodu.

Pytanie 3

Jak nazywa się technika umożliwiająca asynchroniczne wykonywanie operacji w JavaScript?

A. Promise
B. Object
C. Function
D. Variable
Promise to technika w JavaScript, która umożliwia obsługę operacji asynchronicznych. W odróżnieniu od tradycyjnych funkcji, które mogą blokować wykonanie kodu do momentu zakończenia operacji, Promise pozwala na kontynuację wykonywania kodu, a wyniki operacji są dostępne, gdy zostaną one zakończone. Główne zastosowanie Promise polega na obsłudze operacji takich jak żądania sieciowe, które mogą trwać nieprzewidywalnie długo. Przykładem jest użycie Promise do wykonania zapytania do API: fetch('https://api.example.com/data') .then(response => response.json()) .then(data => console.log(data)). Dobrą praktyką jest stosowanie asynchronizacji z użyciem async/await, co pozwala na bardziej czytelny kod. Promise jest częścią ECMAScript 2015 (ES6) i stanowi podstawę dla bardziej zaawansowanych technik, takich jak async/await, co pozwala na jeszcze prostszą obsługę asynchronicznych operacji. Zrozumienie Promise jest kluczowe dla efektywnego programowania w JavaScript, zwłaszcza w kontekście aplikacji webowych, gdzie asynchroniczność odgrywa kluczową rolę.

Pytanie 4

Jak nazywa się proces znajdowania i usuwania błędów w kodzie?

A. Debugowanie
B. Kompilowanie
C. Kompensowanie
D. Interpretowanie
Debugowanie to niezwykle istotny etap w procesie tworzenia oprogramowania, polegający na identyfikowaniu i eliminowaniu błędów w kodzie źródłowym. Jest to proces, który wymaga zrozumienia logiki programu oraz umiejętności analitycznych, aby skutecznie odnaleźć przyczynę problemu i ją usunąć. Debugowanie jest kluczowe dla zapewnienia, że aplikacja działa zgodnie z zamierzeniami i jest wolna od błędów, które mogłyby wpłynąć na jej funkcjonalność lub stabilność. W praktyce debugowanie może obejmować różne techniki, takie jak użycie narzędzi do śledzenia wykonania kodu, analizę logów czy testowanie jednostkowe. Programiści często korzystają z dedykowanych środowisk programistycznych (IDE), które oferują funkcje ułatwiające debugowanie, takie jak punkty przerwań czy inspekcja zmiennych. Dobrym przykładem jest Visual Studio, które umożliwia śledzenie wartości zmiennych w czasie rzeczywistym. Debugowanie jest również częścią dobrych praktyk programistycznych, które zakładają regularne testowanie i kontrolę jakości kodu. Dzięki temu możliwe jest nie tylko eliminowanie błędów, ale także poprawa wydajności i bezpieczeństwa aplikacji.

Pytanie 5

Co to jest JWT (JSON Web Token)?

A. Protokół komunikacji między frontendem a backendem
B. Format przechowywania danych w bazach NoSQL
C. Otwarty standard do bezpiecznego przekazywania informacji między stronami jako obiekt JSON
D. Biblioteka JavaScript do manipulacji danymi JSON
Chociaż odpowiedzi sugerują alternatywne podejścia do zarządzania danymi w aplikacjach, to nie są one związane z funkcjonalnością JWT. Stwierdzenie, że JWT to biblioteka JavaScript do manipulacji danymi JSON, jest błędne, ponieważ JWT nie jest technologią programistyczną, lecz protokołem komunikacyjnym opartym na standardzie JSON. Istnieją biblioteki JavaScript, które mogą być używane do generowania i weryfikowania JWT, jednak sama technologia nie jest związaną z manipulacją danymi. Ponadto, błędne jest również postrzeganie JWT jako formatu przechowywania danych w bazach NoSQL. JWT nie służy do przechowywania danych, ale do ich przekazywania w formie tokenów, które mogą być interpretowane przez różne systemy. W końcu, opisanie JWT jako protokołu komunikacji między frontendem a backendem jest nieprecyzyjne. JWT jest narzędziem do autoryzacji i nie definiuje samego protokołu komunikacyjnego, a jedynie sposób na przesyłanie informacji w formie tokenów. Kluczowym błędem myślowym jest mylenie struktury tokenów z mechanizmami komunikacji – JWT działa jako środek autoryzacji, a nie jako protokół komunikacyjny. Zrozumienie tej różnicy jest istotne dla prawidłowego wykorzystania JWT w aplikacjach webowych.

Pytanie 6

Co to jest IndexedDB?

A. Indeks danych używany przez wyszukiwarki internetowe
B. Niskopoziomowe API do przechowywania dużych ilości danych w przeglądarce użytkownika
C. System zarządzania bazami SQL w aplikacjach backendowych
D. Format indeksowania danych w bazach NoSQL
Odpowiedzi, które wskazują na inne znaczenia IndexedDB, wynikają z nieporozumień dotyczących funkcji i zastosowania tej technologii. IndexedDB nie jest indeksem danych używanym przez wyszukiwarki internetowe, ponieważ jego głównym celem jest przechowywanie danych lokalnie na urządzeniu użytkownika, a nie indeksowanie ich w sieci. Takie myślenie prowadzi do błędnych wniosków na temat jego funkcjonalności, ponieważ indeksy w wyszukiwarkach takie jak Google służą do szybkiego odnajdywania informacji w ogromnych zbiorach danych dostępnych w Internecie, a nie do lokalnego przechowywania czy manipulacji informacjami. Ponadto, nie jest to system zarządzania bazami SQL w aplikacjach backendowych. IndexedDB działa w przeglądarkach i jest zaprojektowane do pracy w środowisku klienta, podczas gdy bazy SQL, takie jak MySQL czy PostgreSQL, są zazwyczaj używane na serwerach i wymagają odrębnego podejścia do zarządzania danymi. Również twierdzenie, że IndexedDB jest formatem indeksowania danych w bazach NoSQL, jest mylące. IndexedDB to nie format, lecz interfejs API, który wspiera przechowywanie danych w strukturze obiektowej, co czyni go bardziej elastycznym w kontekście przechowywania danych niż tradycyjne bazy NoSQL. W rezultacie, błędne koncepcje wynikają z niepełnego zrozumienia, jak działa IndexedDB oraz jakie są jego główne zastosowania i ograniczenia.

Pytanie 7

Co to jest API w kontekście programowania?

A. Interfejs programistyczny aplikacji, który definiuje sposób komunikacji między różnymi komponentami oprogramowania
B. System zarządzania relacyjnymi bazami danych
C. Narzędzie do testowania interfejsu użytkownika aplikacji
D. Metoda kompresji danych w aplikacjach webowych
API, czyli Interfejs Programistyczny Aplikacji, to zestaw reguł i protokołów, które umożliwiają różnym komponentom oprogramowania komunikację ze sobą. W praktyce API działa jako most między różnymi systemami, pozwalając na wymianę danych oraz funkcji. Na przykład, API może być wykorzystywane do integracji z zewnętrznymi serwisami, takimi jak systemy płatności, co pozwala na łatwe wdrożenie funkcji zakupów online w aplikacji. Stosowanie API zgodnie z zasadami RESTful czy GraphQL jest powszechną praktyką, ponieważ ułatwia rozwój i utrzymanie aplikacji, umożliwiając tworzenie skalowalnych rozwiązań. Co więcej, dobrze zdefiniowane API zwiększa bezpieczeństwo aplikacji, ograniczając bezpośredni dostęp do wewnętrznych mechanizmów oraz danych. Firmy często tworzą dokumentację API, aby programiści mogli szybko zrozumieć, jak z niego korzystać, co jest zgodne z zasadami dobrych praktyk w branży programistycznej.

Pytanie 8

Co następuje, gdy błąd nie zostanie uchwycony przez blok catch?

A. Błąd zostanie zignorowany przez kompilator
B. Program kontynuuje działanie, pomijając błąd
C. Instrukcja throw zostanie automatycznie wykreślona
D. Program zakończy działanie z błędem
Jeśli wyjątek nie zostanie przechwycony przez blok 'catch', program zakończy działanie z błędem i wygeneruje komunikat o nieobsłużonym wyjątku. Jest to domyślne zachowanie w C++ i innych językach obsługujących wyjątki, co ma na celu zapobieganie dalszemu wykonywaniu kodu, który mógłby prowadzić do nieprzewidywalnych rezultatów. Obsługa wyjątków jest kluczowym elementem zapewniania stabilności i bezpieczeństwa aplikacji – brak jej implementacji może prowadzić do awarii programu. Dlatego zaleca się, aby zawsze stosować odpowiednie bloki 'try-catch' wokół kodu, który może generować wyjątki.

Pytanie 9

Jaki jest wymagany sposób do realizacji algorytmu sortowania bąbelkowego na n-elementowej tablicy?

A. n-liczby warunków
B. dwie pętle funkcjonujące na co najmniej (n+1) elementach każda
C. jedna pętla operująca na 2n elementach oraz warunek
D. dwie pętle działające na najwyżej n-elementach każda
Aby zaimplementować algorytm sortowania bąbelkowego, potrzebne są dwie pętle iteracyjne, które porównują i zamieniają miejscami elementy tablicy. Zewnętrzna pętla iteruje po całej tablicy, natomiast wewnętrzna pętla wykonuje kolejne porównania i przestawia elementy, jeśli są one w nieprawidłowej kolejności. Algorytm sortowania bąbelkowego charakteryzuje się prostotą, ale jego złożoność obliczeniowa wynosi O(n²), co czyni go mało efektywnym dla dużych zbiorów danych. Niemniej jednak, jest to jedno z pierwszych ćwiczeń programistycznych, które wprowadza do zagadnień algorytmicznych i uczy podstaw iteracji oraz manipulacji tablicami. Pomimo swojej niskiej wydajności, sortowanie bąbelkowe jest często wykorzystywane do celów edukacyjnych oraz w przypadkach, gdy prostota implementacji ma większe znaczenie niż szybkość działania.

Pytanie 10

Jakie środowisko deweloperskie jest powszechnie wykorzystywane do produkcji aplikacji webowych w języku Java?

A. Android Studio
B. PyCharm
C. XCode
D. Eclipse
XCode to środowisko programistyczne przeznaczone głównie do tworzenia aplikacji na systemy Apple, takie jak macOS, iOS, iPadOS, a nie do aplikacji webowych w języku Java. Android Studio jest dedykowane tworzeniu aplikacji mobilnych na system Android i nie jest używane w środowisku webowym dla Javy. PyCharm to narzędzie skoncentrowane na języku Python i nie posiada natywnego wsparcia dla programowania w Javie, co czyni go nieodpowiednim wyborem dla aplikacji webowych opartych na tym języku.

Pytanie 11

Który z wymienionych elementów stanowi przykład zbiorowej ochrony?

A. Ekran akustyczny
B. Kask ochronny
C. Zatyczki do uszu
D. Okulary ochronne
Ekran akustyczny to przykład środka ochrony zbiorowej, który redukuje poziom hałasu w miejscu pracy, chroniąc większą grupę pracowników jednocześnie. Środki ochrony zbiorowej mają na celu eliminowanie zagrożeń u źródła i zabezpieczanie całego środowiska pracy, a nie pojedynczych osób. Ekrany akustyczne są często stosowane w zakładach produkcyjnych, gdzie hałas maszyn może przekraczać dopuszczalne normy. Dzięki nim można zmniejszyć poziom hałasu i poprawić komfort pracy, bez konieczności wyposażania każdego pracownika w ochronniki słuchu. Środki ochrony zbiorowej są bardziej efektywne w długoterminowej perspektywie, ponieważ zmniejszają ryzyko dla wszystkich pracowników na danym stanowisku.

Pytanie 12

Jaki komponent środowiska IDE jest niezbędny do tworzenia aplikacji webowych?

A. Debugger, edytor kodu, integracja z systemem kontroli wersji
B. Narzędzie do tworzenia grafiki
C. Emulator urządzeń mobilnych
D. Zarządzanie bazami danych
Debugger, edytor kodu oraz integracja z systemem kontroli wersji to kluczowe elementy środowiska IDE, które umożliwiają efektywną pracę nad aplikacjami webowymi. Debugger pozwala na wykrywanie i naprawianie błędów w czasie rzeczywistym, edytor kodu umożliwia szybkie pisanie i modyfikowanie kodu, a integracja z systemem kontroli wersji (np. Git) pozwala śledzić zmiany i współpracować w zespołach programistycznych. Te narzędzia stanowią podstawę pracy każdego dewelopera webowego.

Pytanie 13

Jaką wartość dziesiętną reprezentuje liczba binarna 1010?

A. 8
B. 12
C. 14
D. 10
Liczba binarna 1010 to wartość dziesiętna, która wynosi 10. Aby dokonać konwersji liczby binarnej na system dziesiętny, należy zrozumieć, że każda cyfra w systemie binarnym reprezentuje potęgę liczby 2, zaczynając od prawej strony, gdzie najniższa pozycja ma wartość 2^0. W przypadku 1010, mamy następujące pozycje: 1 * 2^3 (co daje 8), 0 * 2^2 (co daje 0), 1 * 2^1 (co daje 2) oraz 0 * 2^0 (co daje 0). Sumując te wartości: 8 + 0 + 2 + 0, otrzymujemy 10. W praktyce konwersja z systemu binarnego na dziesiętny jest niezwykle przydatna w programowaniu i elektronice, gdzie liczby binarne są powszechnie stosowane. Przykładowo, w obliczeniach komputerowych oraz w projektowaniu układów cyfrowych, znajomość tych konwersji jest kluczowa. Odnosi się to również do standardów, takich jak IEEE 754, które definiują reprezentację liczb zmiennoprzecinkowych w formatach binarnych.

Pytanie 14

Aby wykorzystać framework Django, należy pisać w języku

A. JavaScript
B. Python
C. C#
D. Java
Czasami można się pomylić, bo widząc te wszystkie języki jak Java, C# czy JavaScript, łatwo założyć, że każdy framework webowy działa podobnie i może bazować na różnych technologiach. Jednak Django to nie jest uniwersalny framework na każdą platformę czy język. C# i Java są oczywiście bardzo popularne w środowiskach enterprise, służą do tworzenia rozbudowanych aplikacji biznesowych, ale mają swoje własne frameworki, jak ASP.NET dla C# czy Spring dla Javy. Próba wykorzystania Django z C# lub Javą to jak próba włożenia okrągłego klocka do kwadratowego otworu – po prostu nie pasuje, bo Django ma zupełnie inne API i korzysta z mechanizmów charakterystycznych dla Pythona. JavaScript natomiast, choć jest niezbędny we front-endzie i pozwala budować dynamiczne interfejsy użytkownika (szczególnie przy użyciu Reacta, Angulara czy Vue), nie jest wykorzystywany do pisania logiki serwera w Django. Owszem, istnieje Node.js, który pozwala na backend w JavaScript, ale to zupełnie inna bajka. Typowym błędem myślowym jest też zakładanie, że frameworki webowe są zamienne i można je „przełączyć” między językami – praktyka pokazuje, że każdy framework jest głęboko zintegrowany z konkretnym językiem, jego bibliotekami i narzędziami. Django powstał dla Pythona i tylko w tym języku można w pełni wykorzystać jego możliwości. Uważam, że warto zagłębić się w dokumentację i zobaczyć, jak wygląda kod przykładowych aplikacji – szybko widać, że całość bazuje na Pythonie, łącznie z konfiguracją, obsługą modeli i migracjami bazy danych. W profesjonalnych projektach przestrzega się tej zasady i nie próbuje się na siłę mieszać środowisk, tylko korzysta z narzędzi zgodnych z wybranym językiem.

Pytanie 15

Które z poniższych narzędzi służy do analizy wydajności stron internetowych?

A. Lighthouse
B. Docker
C. Webpack
D. Postman
Postman to narzędzie, które służy przede wszystkim do testowania API. Jego główna funkcjonalność polega na umożliwieniu użytkownikom wysyłania zapytań do serwerów oraz analizy odpowiedzi, co jest niezbędne w procesie rozwijania aplikacji webowych. Jednakże, Postman nie ma za zadanie oceny wydajności stron internetowych, ponieważ koncentruje się na interakcjach z API, a nie na aspekcie wydajności samej strony. Docker jest platformą do konteneryzacji, która pozwala deweloperom na łatwe zarządzanie aplikacjami w różnych środowiskach. Chociaż Docker może mieć wpływ na wydajność aplikacji poprzez ułatwienie zarządzania zasobami, nie jest narzędziem dedykowanym do analizy wydajności stron internetowych. Webpack to narzędzie służące do bundlingu zasobów JavaScript, które skupia się na optymalizacji i kompresji plików. Jego zadaniem jest usprawnienie dostarczania skryptów do przeglądarek, jednak nie jest to narzędzie, które ocenia wydajność strony jako całości. Błędem jest zatem mylenie funkcji, jakie pełnią te narzędzia. Zamiast skupić się na testowaniu wydajności, można skupić się na testowaniu API czy optymalizacji zasobów, co nie odnosi się bezpośrednio do analizy całkowitej wydajności strony internetowej. Dlatego ważne jest zrozumienie, jakie narzędzia służą do jakich celów, aby skutecznie poprawiać jakość aplikacji internetowych.

Pytanie 16

Jaką cechą odznacza się framework w porównaniu do biblioteki?

A. Framework określa strukturę aplikacji i zapewnia jej fundament
B. Framework stanowi zbiór funkcji, które programista ma możliwość wykorzystania
C. Framework zapewnia API do szerszego zestawu funkcji
D. Framework oferuje funkcje użyteczne w konkretnej dziedzinie problemu
Framework dostarcza gotowy szkielet aplikacji i narzuca architekturę, zgodnie z którą programista musi budować swoją aplikację. Oferuje zestaw narzędzi i komponentów, które upraszczają rozwój oprogramowania, przy jednoczesnym ograniczeniu swobody działania. Dzięki frameworkowi, programista nie musi tworzyć aplikacji od podstaw – dostaje narzędzia, które integrują się ze sobą, co przyspiesza proces developmentu i zapewnia spójność aplikacji.

Pytanie 17

Jakie jest podstawowe zadanie funkcji zaprzyjaźnionej w danej klasie?

A. Dodawanie nowych instancji do klasy
B. Umożliwienie funkcji dostępu do prywatnych atrybutów klasy
C. Generowanie kopii pól obiektu w innej klasie
D. Ograniczenie widoczności atrybutów klasy
Funkcja zaprzyjaźniona umożliwia dostęp do prywatnych i chronionych składowych klasy, z którą jest zaprzyjaźniona. To mechanizm, który pozwala na utrzymanie hermetyzacji, jednocześnie umożliwiając wybranym funkcjom lub klasom bezpośredni dostęp do wewnętrznych danych innej klasy. Funkcje zaprzyjaźnione często są stosowane do operacji, które wymagają dostępu do wewnętrznych danych klasy, ale nie powinny być jej metodami, np. operacje arytmetyczne lub porównawcze na obiektach tej klasy.

Pytanie 18

Które z poniższych jest podstawowym rodzajem testów używanych w testowaniu jednostkowym?

A. Testy integracyjne
B. Testy akceptacyjne
C. Testy systemowe
D. Testy jednostkowe
Testy jednostkowe są kluczowym elementem procesu testowania oprogramowania, szczególnie w kontekście metodologii programowania zwinnego. Polegają one na testowaniu pojedynczych najmniejszych części programu, takich jak funkcje czy metody, w izolacji od reszty systemu. Dzięki temu możemy szybko wykryć błędy i upewnić się, że dany fragment kodu działa zgodnie z oczekiwaniami. W praktyce, testy jednostkowe są często automatyzowane i stanowią podstawę dla procesu ciągłej integracji (CI). Przykładem zastosowania testów jednostkowych może być sprawdzenie, czy funkcja dodająca dwie liczby zwraca poprawny wynik dla różnych zestawów danych wejściowych. Dzięki testom jednostkowym programiści mogą z większą pewnością modyfikować i rozwijać kod, mając pewność, że nie wprowadzają nowych błędów. To właśnie testy jednostkowe pozwalają na szybkie wykrywanie regresji i są fundamentem dla bardziej zaawansowanych form testowania, takich jak testy integracyjne czy systemowe. Dbanie o dobrze zdefiniowany zestaw testów jednostkowych jest uznawane za dobrą praktykę w branży IT i podnosi jakość oprogramowania.

Pytanie 19

Który z operatorów w Pythonie umożliwia sprawdzenie, czy dany element należy do listy?

A. is
B. ==
C. and
D. in
Operator `in` w języku Python służy do sprawdzania, czy element należy do listy, zbioru, krotki lub innego obiektu iterowalnego. Przykład: `if 5 in lista` sprawdza, czy liczba 5 znajduje się w liście. Operator `in` jest niezwykle przydatny w przeszukiwaniu danych, a jego zastosowanie skraca kod i zwiększa jego czytelność. W Pythonie jest on szeroko stosowany do iteracji i filtrowania danych, co czyni go jednym z najbardziej intuicyjnych operatorów języka.

Pytanie 20

Jakie narzędzie jest najbardziej odpowiednie do identyfikacji błędów w trakcie działania programu?

A. Kompilator
B. Interpreter
C. Linker
D. Debugger
Debugger to narzędzie przeznaczone do wyszukiwania błędów w czasie wykonywania programu. Pozwala na zatrzymywanie aplikacji w wybranych miejscach, analizowanie wartości zmiennych i śledzenie przepływu sterowania, co umożliwia szybkie wykrywanie błędów logicznych i błędów czasu wykonania. Debugger jest niezbędny w procesie rozwoju oprogramowania, ponieważ pomaga programistom w zrozumieniu, jak ich kod działa w rzeczywistości i jak różne warunki wpływają na jego funkcjonowanie.

Pytanie 21

Która z funkcji powinna zostać zrealizowana w warstwie back-end aplikacji webowej?

A. zarządzanie zdarzeniami elementów
B. wyświetlanie danych z formularza w przeglądarce
C. sprawdzanie formularzy w czasie rzeczywistym
D. zarządzanie bazą danych
Wypisywanie danych w przeglądarce jest funkcją warstwy front-end, która obsługuje wyświetlanie treści HTML, CSS i JavaScript. Obsługa zdarzeń kontrolek (np. kliknięcia przycisku) odbywa się głównie po stronie front-endu i jest realizowana za pomocą języków takich jak JavaScript. Walidacja formularzy w czasie rzeczywistym jest częścią front-endu – jej celem jest zapobieganie błędom już na poziomie interfejsu użytkownika, zanim dane trafią na serwer. Jednakże, pełna walidacja na back-endzie jest niezbędna dla bezpieczeństwa i poprawności danych, gdyż front-endowa walidacja może być łatwo omijana przez użytkowników zaawansowanych technicznie.

Pytanie 22

W zestawieniu przedstawiono doświadczenie zawodowe członków zespołu IT. Osobą odpowiedzialną za stworzenie aplikacji front-end powinna być:

PracownikZnajomość technologii/programów
AnnaInscape, Corel Draw
KrzysztofAngular
PatrykHTML, CSS
EwaDjango, .NET
A. Ewa
B. Patryk
C. Anna
D. Krzysztof
Wybór Krzysztofa jako osoby odpowiedzialnej za stworzenie aplikacji front-end jest zdecydowanie trafiony. Angular to obecnie jedno z najpopularniejszych frameworków do budowy zaawansowanych aplikacji webowych, które wykorzystują wiele komponentów, obsługują dynamiczne interfejsy użytkownika i muszą być skalowalne. Angular pozwala efektywnie zarządzać logiką front-endu, stanami aplikacji oraz integracją z backendem. Z mojego doświadczenia wynika, że osoby znające Angulara są w stanie nie tylko napisać klasyczny interfejs w HTML i CSS, ale również wdrożyć bardziej rozbudowane rozwiązania zgodne ze współczesnymi standardami, takimi jak SPA (single-page application). Praktyka pokazuje, że projekty front-endowe na dużą skalę, bez frameworków takich jak Angular, React czy Vue, bardzo szybko stają się nieczytelne i trudne w utrzymaniu. Krzysztof, mając doświadczenie z Angularem, będzie też znał TypeScript, który jest już właściwie standardem w dużych projektach front-endowych. To daje też lepszą kontrolę nad błędami i czytelność kodu, a to się liczy w zespole. Co ciekawe, w ofertach pracy na front-end developera, znajomość Angulara jest jednym z najczęściej wymienianych wymagań, właśnie przez wzgląd na szeroki zakres zastosowań i wsparcie społeczności. Tak naprawdę, jeżeli zależy nam na wydajnym, nowoczesnym i dobrze zaprojektowanym interfejsie użytkownika, Krzysztof jest tutaj najlepszym wyborem. Często początkujący myślą, że wystarczy sam HTML i CSS, ale prawdziwa praca front-endowca to już zupełnie wyższa liga. Szczerze mówiąc, mając taką osobę w zespole, można spać spokojnie, że front-end będzie wykonany zgodnie z branżowymi standardami.

Pytanie 23

Jakie działanie powinno się wykonać w pierwszym kroku, oceniając stan osoby poszkodowanej?

A. Sprawdzić, czy występuje krwawienie
B. Rozpocząć resuscytację krążeniowo-oddechową
C. Zadbać o własne bezpieczeństwo
D. Wezwać ambulans
Właśnie o to chodzi — zadbanie o własne bezpieczeństwo jako pierwszy krok to fundament całej pierwszej pomocy i temat, który się często przecenia, a moim zdaniem jest kluczowy. Chodzi o to, że nawet najlepsze chęci nie mają sensu, jeśli ratujący sam staje się kolejną ofiarą. W praktyce oznacza to, że zanim podejdziesz do poszkodowanego, musisz się zastanowić, czy miejsce wypadku jest bezpieczne. Przykładowo na drodze – trzeba rozejrzeć się, czy nie nadjeżdżają inne samochody, zabezpieczyć teren (trójkąt ostrzegawczy, kamizelka odblaskowa). W przypadku porażenia prądem – odłączyć źródło napięcia. To wcale nie są banały; tego uczą na wszystkich kursach BLS (Basic Life Support) i w zasadzie każda książka ratownicza stawia to na pierwszym miejscu. Często się o tym zapomina, bo emocje biorą górę. Prawda jest taka, że każda akcja ratunkowa zaczyna się od sekundy refleksji: czy ja tu jestem bezpieczny? Dopiero później można oceniać stan poszkodowanego i dalej działać. W sumie jak się o tym pomyśli, to takie myślenie ratuje zdrowie nie tylko nam, ale i tym, którym chcemy pomóc — bo nie zwiększamy liczby poszkodowanych. Niektórym wydaje się, że od razu trzeba robić masaż serca czy wołać karetkę, ale bez oceny zagrożenia można narobić sobie i innym więcej problemów. Takie są realia pracy w terenie, nie tylko w teorii.

Pytanie 24

Użycie modyfikatora abstract w definicji metody w klasie wskazuje, że

A. dziedziczenie po tej klasie jest niedozwolone
B. trzeba zaimplementować tę metodę w tej klasie
C. klasy pochodne nie mogą implementować tej metody
D. klasa ta stanowi podstawę dla innych klas
Niektóre z odpowiedzi mogą wydawać się na pierwszy rzut oka logiczne, ale wynikają raczej z nieprecyzyjnego rozumienia mechanizmów programowania obiektowego. Zacznijmy od tego, że użycie modyfikatora abstract w samej metodzie nigdy nie oznacza konieczności natychmiastowej implementacji tej metody w tej samej klasie – wręcz przeciwnie, to sygnał, że metoda nie ma jeszcze swojego kodu i zostanie dopiero zaimplementowana w klasie pochodnej. To właśnie klasy dziedziczące mają obowiązek dostarczyć konkretną wersję tej funkcji. Kolejna kwestia to dziedziczenie – modyfikator abstract w żadnym wypadku nie zabrania dziedziczenia po tej klasie, raczej wręcz przeciwnie, bo cała idea polega na tym, żeby posłużyć się taką klasą jako bazą do tworzenia wyspecjalizowanych klas pochodnych. Częstym błędem jest też zakładanie, że klasy pochodne nie mogą implementować tych metod – to zupełnie odwrotnie, bo właśnie po to te metody są abstrakcyjne, żeby wymusić ich nadpisanie. Zdarza się, że początkujący mylą pojęcia abstract i sealed/final (klasa zamknięta na dziedziczenie), co prowadzi do błędnych wniosków. Generalnie warto pamiętać, że modyfikator abstract jest narzędziem do budowania elastycznych, rozszerzalnych struktur kodu, gdzie część funkcjonalności jest celowo zostawiona do uzupełnienia przez potomków. To nie jest mechanizm ograniczający, tylko wręcz przeciwnie – otwierający drogę do projektowania uniwersalnych, przyszłościowych rozwiązań. Takie podejście jest szeroko stosowane w branży, np. w frameworkach czy bibliotekach, gdzie wielu developerów rozbudowuje istniejącą logikę o własną specyfikę działania.

Pytanie 25

Jakie metody umożliwiają przesyłanie danych z serwera do aplikacji front-end?

A. biblioteki jQuery
B. formatu JSON
C. metody POST
D. protokołem SSH
JSON, czyli JavaScript Object Notation, to dość lekki format wymiany danych. Jest prosty do zrozumienia zarówno dla ludzi, jak i komputerów. To dlatego jest tak popularny w aplikacjach webowych, gdzie przesyła się dane między serwerem a klientem. Dzięki strukturze klucz-wartość łatwo jest mapować obiekty w JavaScript, co przyspiesza cały proces z danymi. Pomysł na zastosowanie? Na przykład, gdy przesyłasz dane użytkownika z serwera do swojej aplikacji, to często zamieniasz obiekt JavaScript na format JSON i wysyłasz go przez AJAX. A co ważne, JSON jest zgodny z różnymi standardami, więc możesz go używać praktycznie wszędzie. Co ciekawe, w nowoczesnych aplikacjach JSON jest zdecydowanie bardziej popularny niż XML, bo jest prostszy i mniej obciążający dla sieci. To wszystko sprawia, że strony ładują się szybciej, a użytkownicy mają lepsze doświadczenia.

Pytanie 26

Przedstawiony na filmie kod napisany w języku C++ nie kompiluje się. Co należy zmienić w tym kodzie, aby proces kompilacji wykonał się bez błędów?

A. dodać deklarację funkcji sprawdz przed funkcją main
B. zadeklarować zmienną sprawdz przed jej wykorzystaniem w linii 11
C. poprawnie zapisać warunek w instrukcji if w linii 11, np. sprawdz(x)==true
D. naprawić błąd w funkcji sprawdz, który polega na braku nawiasów {} w pętli for
Odpowiedź jest trafna, bo w języku C++ kompilator musi wiedzieć o istnieniu funkcji zanim zostanie ona użyta w kodzie, np. w funkcji main. Bez wcześniejszej deklaracji, kompilator nie zna sygnatury funkcji i nie potrafi zweryfikować wywołania, co skutkuje błędem typu 'implicit declaration of function'. Deklaracja funkcji to taki sygnał informujący kompilator „hej, taka funkcja będzie i będzie przyjmować takie argumenty, a zwracać taki typ”. Praktycznie rzecz biorąc, przed funkcją main wystarczy wpisać np. 'bool sprawdz(int x);', żeby wszystko grało. To szczególnie ważne przy większych projektach czy pracy w zespołach, gdzie pliki nagłówkowe z deklaracjami funkcji są standardem. Pozwala to na lepszą czytelność i porządek w kodzie – kompilator wie, czego się spodziewać, a Ty unikasz dziwnych, trudnych do znalezienia błędów. Moim zdaniem taka organizacja kodu to podstawa, szczególnie jeśli kiedyś będziesz korzystać z bibliotek lub cudzych funkcji – deklaracje są wtedy wręcz obowiązkowe. To zasada, której trzyma się większość zespołów programistycznych i, szczerze mówiąc, sam kilka razy w młodości zapomniałem o deklaracji, przez co debugowanie trwało wieki. Warto od razu wyrobić sobie taki nawyk, bo to oszczędza sporo nerwów i czasu, a kod staje się solidniejszy i bardziej profesjonalny.

Pytanie 27

Jak przedstawia się liczba dziesiętna 255 w systemie szesnastkowym?

A. EF
B. FF
C. 100
D. FE
Liczba dziesiętna 255 jest reprezentowana w systemie szesnastkowym jako FF. Aby zrozumieć, dlaczego tak jest, należy przyjrzeć się procesowi konwersji z systemu dziesiętnego na szesnastkowy. System dziesiętny oparty jest na podstawie 10, co oznacza, że używa dziesięciu cyfr od 0 do 9. W systemie szesnastkowym, który ma podstawę 16, używane są cyfry od 0 do 9 oraz litery od A do F, gdzie A odpowiada 10, B - 11, C - 12, D - 13, E - 14, a F - 15. Aby przeliczyć 255 na system szesnastkowy, dzielimy tę liczbę przez 16. Pierwsza operacja daje nam 15 jako wynik całkowity oraz 15 jako resztę, co w systemie szesnastkowym jest reprezentowane literą F. Dalsze dzielenie 15 przez 16 daje wynik 0 oraz resztę 15, co również jest reprezentowane jako F. Zatem, zapisując reszty w odwrotnej kolejności, otrzymujemy FF. Taki zapis jest używany w różnych standardach, takich jak HTML i CSS, gdzie kolory są przedstawiane w formacie szesnastkowym. Przykładem może być kolor czerwony, którego zapis to #FF0000, co oznacza maksymalną wartość czerwonego składnika i zera dla niebieskiego oraz zielonego. Warto znać te konwersje, zwłaszcza w programowaniu i projektowaniu stron internetowych, gdzie często pracuje się z wartościami szesnastkowymi.

Pytanie 28

W zamieszczonym fragmencie kodu Java wskaż nazwę zmiennej, która może przechować wartość 'T'.

int zm1;
float zm2;
char zm3;
boolean zm4;
A. zm3
B. zm2
C. zm4
D. zm1
Poprawnie wskazana została zmienna 'zm3', której typ to 'char'. To właśnie zmienne typu 'char' w Javie służą do przechowywania pojedynczych znaków, takich jak na przykład litera 'T'. Zmienna 'char' przechowuje znak jako wartość liczbową zgodnie z kodowaniem Unicode, co pozwala na obsługę szerokiego zakresu znaków z różnych alfabetów. W praktyce często spotyka się sytuacje, gdzie potrzebujemy przechować czy odczytać pojedynczy znak – np. literę przy przetwarzaniu tekstu, analizowaniu plików, czy nawet w prostych grach tekstowych, gdzie np. sterowanie postacią opiera się o pojedyncze litery wciskane na klawiaturze. Moim zdaniem dobre zrozumienie typu 'char' to podstawa, bo łatwo pomylić go z typem 'String', który przechowuje jednak całe ciągi znaków, a nie pojedyncze znaki. Z punktu widzenia dobrych praktyk, zawsze warto dobierać możliwie najwęższy typ danych do zadania – jeżeli chcemy przechować jedną literę, typ 'char' jest po prostu najefektywniejszy. Nawiasem mówiąc, w Javie znak umieszczamy w pojedynczych apostrofach (np. 'T'), co jednoznacznie odróżnia je od tekstów (podwójne cudzysłowy). Osobiście zdarzało mi się kiedyś pomylić te typy i potem szukać błędów, więc warto zapamiętać tę różnicę. Warto też wiedzieć, że typ 'char' przydaje się np. do operacji na znakach w tablicach, przy konwersjach kodów ASCII czy nawet szyfrowaniu prostych tekstów. Zdecydowanie jest to typ, którego nie można pominąć w nauce Javy.

Pytanie 29

Co to jest destructuring assignment w JavaScript?

A. Proces konwersji typów danych w JavaScript
B. Składnia pozwalająca na rozpakowanie wartości z tablic lub obiektów do oddzielnych zmiennych
C. Technika optymalizacji kodu przez kompilator
D. Metoda usuwania nieużywanych zmiennych z kodu
Odpowiedzi, które wybierasz, mogą prowadzić do mylnych interpretacji dotyczących możliwości i funkcji JavaScript. Na przykład, sugestia, że destructuring assignment to metoda usuwania nieużywanych zmiennych, jest nieprawdziwa. Technika destructuring nie zajmuje się usuwaniem zmiennych, lecz ich rozpakowywaniem. Usuwanie zmiennych, które nie są używane, jest związane z zarządzaniem pamięcią i optymalizacją kodu, co jest zupełnie inną koncepcją. Ponadto, konwersja typów danych w JavaScript to proces, który dotyczy zmiany jednego typu danych na inny, a nie ma bezpośredniego związku z destrukturyzacją. Zrozumienie różnic pomiędzy tymi pojęciami jest kluczowe, aby nie wprowadzać w błąd podczas nauki JavaScript. Destructuring assignment jest także odzwierciedleniem nowoczesnych praktyk programowania, które skupiają się na zwięzłości i czytelności kodu. Uznawanie go za technikę optymalizacji kodu przez kompilator również jest mylne, ponieważ optymalizacja kodu to proces, który nie ma bezpośredniego związku z destrukturyzacją. Takie nieprecyzyjne zrozumienie może prowadzić do późniejszych problemów z implementacją kodu oraz jego utrzymywaniem.

Pytanie 30

Który z poniższych przykładów ilustruje deklarację złożonego typu w języku C++?

A. float ocena = 4.5;
B. int wynik = 100;
C. bool status;
D. class Student {};
Deklaracja `class Student {};` w języku C++ przedstawia przykład tworzenia typu złożonego w postaci klasy. Klasa to podstawowy element programowania obiektowego, który pozwala na łączenie danych (pól) i funkcji (metod) w jednej strukturze. Klasy umożliwiają modelowanie rzeczywistych obiektów i ich zachowań, co prowadzi do bardziej zorganizowanego i skalowalnego kodu. Klasy mogą być rozszerzane przez dziedziczenie, co jest kluczową zaletą programowania obiektowego.

Pytanie 31

Co to jest wzorzec projektowy Singleton?

A. Wzorzec zapewniający istnienie tylko jednej instancji klasy w całej aplikacji
B. Metoda zabezpieczania aplikacji przed atakami typu SQL Injection
C. Technika optymalizacji kodu poprzez minimalizację liczby obiektów
D. Wzorzec do zarządzania komunikacją między komponentami aplikacji
Wzorzec projektowy, który zapewnia istnienie tylko jednej instancji, jest często mylony z innymi technikami programistycznymi. Niektóre osoby mogą uważać, że wzorzec do zarządzania komunikacją między komponentami aplikacji, jak mediator, ma podobne właściwości, jednak jego głównym celem jest zupełnie inny. Mediator nie tworzy instancji, lecz koordynuje interakcje między już istniejącymi obiektami. Z kolei optymalizacja kodu przez minimalizację liczby obiektów, o której mowa w jednej z odpowiedzi, nie jest celem wzorca Singleton. Wzorzec ten może prowadzić do niepożądanych skutków, gdyż wprowadza globalny stan, co z kolei czyni testowanie jednostkowe trudniejszym. Utrzymywanie tylko jednej instancji nie jest tożsame z zarządzaniem zasobami, a raczej może powodować problemy z dostępnością tych zasobów, jeśli nie zostanie poprawnie zaprojektowane. Przykładowo, użytkownik może pomylić Singleton z metodą zabezpieczającą aplikację przed atakami typu SQL Injection, co jest zupełnie odmiennym zagadnieniem związanym z bezpieczeństwem danych. Zrozumienie różnicy między tymi wzorcami i technikami jest kluczowe dla skutecznego projektowania oprogramowania.

Pytanie 32

Który z poniższych przykładów stanowi aplikację mobilną wykorzystującą bazę danych?

A. Aplikacja do robienia zdjęć
B. Aplikacja wyświetlająca lokalny czas
C. Aplikacja kalkulator
D. Aplikacja gromadząca listę kontaktów użytkownika
Aplikacja przechowująca listę kontaktów użytkownika korzysta z bazy danych do przechowywania, odczytywania i zarządzania danymi. Tego typu aplikacje mobilne muszą efektywnie zarządzać dużą ilością danych i zapewniać ich szybki dostęp. Bazy danych, takie jak SQLite czy Firebase, są szeroko stosowane w aplikacjach mobilnych, umożliwiając przechowywanie kontaktów, wiadomości, notatek i innych informacji użytkownika. Dzięki bazom danych możliwe jest także synchronizowanie danych pomiędzy urządzeniami i przechowywanie ich w chmurze.

Pytanie 33

Który z wymienionych wzorców projektowych jest najbardziej odpowiedni do uproszczenia interfejsu złożonego systemu?

A. Singleton (Singleton)
B. Metoda szablonowa (Template method)
C. Fasada (Facade)
D. Kompozyt (Composite)
Wzorzec projektowy Fasada (Facade) upraszcza interfejs do złożonego systemu poprzez dostarczenie jednolitego punktu dostępu do wielu podsystemów. Dzięki temu klienci mogą korzystać z funkcji systemu za pomocą prostego interfejsu, co zwiększa czytelność kodu i ułatwia jego utrzymanie. Fasada jest szczególnie przydatna w dużych aplikacjach, gdzie wiele modułów wymaga skomplikowanej konfiguracji lub współdziałania. Wprowadzenie fasady ukrywa złożoność wewnętrzną systemu, jednocześnie zapewniając dostęp do niezbędnych funkcjonalności. To rozwiązanie jest często stosowane w systemach z wieloma interfejsami API, w architekturze mikroserwisów oraz przy integracji zewnętrznych bibliotek.

Pytanie 34

Jakie działanie wykonuje polecenie "git pull"?

A. Zachowuje zmiany w lokalnym repozytorium
B. Eliminuje plik z repozytorium
C. Tworzy nową gałąź w repozytorium
D. Pobiera zmiany z zdalnego repozytorium i scala je z lokalnym
Polecenie 'git pull' pobiera najnowsze zmiany ze zdalnego repozytorium i scala je z lokalnym repozytorium. Jest to jedno z podstawowych poleceń w Git, pozwalające na synchronizację lokalnej kopii projektu z wersją przechowywaną w chmurze lub na serwerze. Dzięki 'git pull' programiści mogą na bieżąco aktualizować swoje repozytoria i unikać konfliktów, które mogłyby wyniknąć z pracy na nieaktualnej wersji kodu. Proces ten automatycznie łączy pobrane zmiany, co eliminuje konieczność ręcznego kopiowania plików lub komend.

Pytanie 35

Które z poniższych twierdzeń najlepiej charakteryzuje metodę wirtualną?

A. Metoda, która działa wyłącznie dla statycznych pól danej klasy
B. Metoda, która jest zawsze stosowana w konstruktorach danej klasy
C. Metoda, która może być wywoływana tylko przez klasę nadrzędną
D. Metoda, która może być przesłonięta w klasie dziedziczącej
Metoda, która może być wywoływana tylko przez klasę bazową to raczej metoda prywatna lub chroniona, a nie wirtualna. Metody statyczne są związane z klasą, a nie z konkretnymi obiektami, więc nie można ich tak po prostu nadpisać w klasie pochodnej. A tak w ogóle, metody w konstruktorach zazwyczaj nie są wirtualne, bo wywołanie metod wirtualnych w konstruktorze może prowadzić do dziwnych rzeczy – w konstruktorze klasy bazowej składowe klasy pochodnej jeszcze nie są gotowe.

Pytanie 36

Który z poniższych składników NIE jest konieczny do stworzenia klasy w C++?

A. Deklaracja atrybutów klasy
B. Definicja funkcji członkowskich klasy
C. Zastosowanie słowa kluczowego class
D. Definicja destruktora
Do utworzenia klasy w C++ nie jest wymagana definicja destruktora. Destruktor to specjalna metoda klasy, która jest wywoływana automatycznie w momencie zniszczenia obiektu, ale jego obecność jest opcjonalna. Klasy, które nie operują bezpośrednio na zasobach zewnętrznych, takich jak dynamiczna pamięć lub pliki, często nie potrzebują destruktora, ponieważ domyślny destruktor generowany przez kompilator jest wystarczający. Aby utworzyć klasę, wystarczy deklaracja pól i metod oraz użycie słowa kluczowego 'class'. To sprawia, że C++ pozwala na szybkie definiowanie prostych klas, które można później rozwijać w miarę potrzeby.

Pytanie 37

Jakie ma znaczenie "operacja wejścia" w kontekście programowania?

A. Przekazywanie danych do programu z zewnętrznych źródeł
B. Wprowadzanie nowych funkcji do aplikacji
C. Zmiana wartości zmiennych globalnych
D. Naprawianie błędów w kodzie aplikacji
Operacja wejścia w programowaniu polega na przekazywaniu danych do programu z zewnętrznego źródła, takiego jak klawiatura, plik lub strumień danych. W języku C++ typowym przykładem operacji wejścia jest `cin >> zmienna;`, która pobiera dane od użytkownika i przypisuje je do zmiennej. Operacje wejścia są niezbędne w interaktywnych aplikacjach, które wymagają danych od użytkownika w czasie rzeczywistym, umożliwiając dynamiczne przetwarzanie informacji.

Pytanie 38

Co oznacza termin 'polimorfizm' w programowaniu obiektowym?

A. Ustanowienie tylko jednego typu dla klasy
B. Ograniczenie do jednej formy dla obiektu
C. Zdolność do przyjmowania wielu form przez obiekt
D. Dziedziczenie metod z klasy bazowej
Dziedziczenie metod z klasy bazowej to ważna koncepcja, jednak różni się od polimorfizmu. Dziedziczenie polega na tym, że klasa pochodna może korzystać z metod i atrybutów klasy bazowej, co pozwala na ponowne wykorzystanie kodu. Jednak sam fakt dziedziczenia nie implikuje polimorfizmu. Polimorfizm wymaga, aby metody mogły być nadpisywane, dostarczając różne implementacje w klasach pochodnych. Ograniczenie do jednej formy dla obiektu jest sprzeczne z ideą polimorfizmu, ponieważ sama definicja polimorfizmu zakłada zdolność obiektu do przyjmowania wielu form, w zależności od kontekstu, w jakim jest używany. Jest to kluczowy aspekt, który odróżnia polimorfizm od zwykłego dziedziczenia. Ustanowienie tylko jednego typu dla klasy również nie jest powiązane z polimorfizmem. W rzeczywistości, polimorfizm pozwala na traktowanie wielu różnych typów jako jednego wspólnego typu bazowego, co zwiększa elastyczność kodu. Polimorfizm umożliwia nam korzystanie z interfejsów i klas abstrakcyjnych, co pozwala na tworzenie systemów, gdzie różne obiekty mogą być traktowane w jednolity sposób, mimo że rzeczywiście reprezentują różne typy.

Pytanie 39

Jedną z zasad standardu WCAG 2.0 jest

A. unikanie przedstawiania informacji w formie uproszczonej
B. ograniczanie treści na stronie przez rezygnację z używania alternatywnych tekstów dla obrazów i filmów
C. używanie jednego, odpowiednio dużego rozmiaru czcionki
D. stosowanie różnych palet kolorystycznych, w tym o wysokim kontraście
Standard WCAG 2.0 opiera się na czterech głównych zasadach: postrzegalność, funkcjonalność, zrozumiałość i solidność. Wiele osób źle interpretuje te zalecenia, myśląc, że wystarczy uprościć treść albo ograniczyć jej ilość, by strona była dostępna. To nie jest prawda – dostępność to nie minimalizm, tylko umożliwienie korzystania z treści każdemu, bez względu na ograniczenia. Na przykład rezygnacja z alternatywnych tekstów dla obrazów i filmów to bardzo poważny błąd – alt teksty są wręcz podstawą dostępności, pozwalają osobom niewidomym korzystać z czytników ekranu. Często też spotykam się z przekonaniem, że wystarczy używać jednego, dużego rozmiaru czcionki, żeby wszystko było czytelne – ale przecież każdy użytkownik ma inne potrzeby, a strony powinny pozwalać na skalowanie tekstu. Trzymanie się jednego rozmiaru wręcz utrudnia życie osobom, które chcą powiększyć sobie tekst według uznania. Również unikanie przedstawiania informacji w sposób uproszczony nie ma nic wspólnego z WCAG – wręcz przeciwnie, prosty, przejrzysty język jest zalecany, żeby jak najwięcej osób rozumiało przekaz. W praktyce najczęściej powtarzany błąd myślowy to przekonanie, że dostępność to coś dodatkowego, co psuje wygląd strony, a tymczasem dobre praktyki pokazują, że można mieć i funkcjonalność, i estetykę, i pełną dostępność. Z mojego punktu widzenia warto patrzeć na WCAG jako na przewodnik ku lepszemu projektowaniu, a nie zbiór ograniczeń. Właśnie dzięki stosowaniu różnych palet kolorystycznych z wysokim kontrastem podnosimy komfort i użyteczność strony dla wszystkich, a nie tylko niektórych użytkowników.

Pytanie 40

Jakie jest poprawne określenie interfejsu (szablonu klasy) w języku Java?

interface IMyInterface {
    private: int a;
    IMyInterface() { a = 0; }
    void mth1();
}
Definicja 1
interface IMyInterface {
    private: int a;
    void mth1();
    int mth2() { return a; }
}
Definicja 2
interface IMyInterface {
    void mth1();
    int mth2() { return 0; }
}
Definicja 3
interface IMyInterface {
    void mth1();
    int mth2();
}
Definicja 4
A. Definicja 2
B. Definicja 4
C. Definicja 3
D. Definicja 1
W języku Java interfejs określa zbiór abstrakcyjnych metod, które klasa implementująca musi zaimplementować. Poprawna definicja interfejsu nie zawiera zmiennych instancji ani konstruktorów, co jest błędem w pierwszej definicji. Interfejsy służą do deklarowania metod, które są automatycznie publiczne i abstrakcyjne. W czwartej definicji, interfejs IMyInterface zawiera dwie metody mth1 i mth2 bez implementacji, co jest zgodne z zasadami Javy. Metody w interfejsie nie mają ciał, co wskazuje, że są przeznaczone do implementacji w klasie, która zadeklaruje się jako implementująca ten interfejs. Interfejsy są kluczowe dla polimorfizmu w Javie, pozwalając na tworzenie kodu, który może pracować z obiektami różnych klas w jednolity sposób, o ile klasy te implementują wspólny interfejs. Zastosowanie interfejsów zwiększa spójność i elastyczność kodu, umożliwiając łatwe dodawanie nowych funkcjonalności bez ingerencji w istniejącą strukturę kodu. Interfejsy są także wykorzystywane do tworzenia klasycznych wzorców projektowych jak Adapter, Strategia czy Obserwator, co jest dobrą praktyką w programowaniu obiektowym.