Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
Rozpoczęcie: 7 czerwca 2026 23:39
Zakończenie: 7 czerwca 2026 23:52
Egzamin zdany!
Wynik: 34/40 punktów (85,0%)
Wymagane minimum: 20 punktów (50%)
Twój wynik na tle innych
Twój wynik jest lepszy niż 67% podejść do kwalifikacji INF.04.
Porównanie z 22429 zakończonymi podejściami do tej kwalifikacji (dane zbiorcze, bez wyników indywidualnych).
Zachowaj ten wynik na koncie
Załóż darmowe konto albo zaloguj się - ten egzamin przypiszemy do Twojego konta, więc wrócisz do swoich błędów, będziesz śledzić postęp i dostaniesz powtórki dobrane do Twoich odpowiedzi.
Jaki będzie wynik działania poniższego kodu w języku C#?
intx=5;inty=10;Console.WriteLine($"Suma {x} i {y} wynosi {x + y}");
A. Suma x i y wynosi 15
B. Error: niewłaściwa składnia
C. Suma 5 i 10 wynosi 15
D. Suma 5 i 10 wynosi x + y
Kod w języku C# wykonuje operację dodawania dwóch zmiennych, x i y, oraz wyświetla wynik w sformatowanym ciągu tekstowym. Poprawna odpowiedź to 'Suma 5 i 10 wynosi 15', ponieważ zmienna x ma wartość 5, a zmienna y ma wartość 10. Kiedy dodajemy te dwie liczby, otrzymujemy 15. Warto zwrócić uwagę na wykorzystanie interpolacji ciągów, co jest istotnym elementem w nowoczesnym C#. Umożliwia to w prosty sposób łączyć tekst z wartościami zmiennych, co zwiększa czytelność kodu. Interpolacja jest szczególnie przydatna w kontekście generowania komunikatów użytkownika i raportów. Przykład zastosowania może obejmować aplikacje, które prezentują wyniki obliczeń lub statystyki, gdzie ważne jest, aby w przyjazny sposób przedstawiać dane. Dobre praktyki programistyczne sugerują, aby unikać twardego kodowania wartości zamiast tego używać zmiennych, co ułatwia późniejsze modyfikacje i utrzymanie kodu.
Pytanie 2
W standardzie dokumentacji testów oprogramowania IEEE 829-1998 opisany jest dokument, który zawiera dane o tym, jakie przypadki testowe były wykorzystane, przez kogo i czy zakończyły się sukcesem. Co to jest?
A. Dziennik Testów
B. Raport Podsumowujący Testy
C. Plan Testów
D. Specyfikacja Procedury Testowej
Dokładnie – Dziennik Testów to ten dokument z IEEE 829-1998, który ma za zadanie rejestrować, które przypadki testowe zostały wykonane, przez kogo, kiedy oraz jaki był ich rezultat. Z mojego doświadczenia to jest taka codzienna „księga kucharska” testera – wpisujesz co zrobiłeś, o której i czy poszło zgodnie z planem. W prawdziwych projektach dziennik testów bywa nieoceniony: pozwala w każdej chwili wrócić do szczegółów, zweryfikować kto co testował i dlaczego test przerwano, a nawet rozliczać się z czasu pracy. To podstawa rozliczalności (ang. traceability) procesu testowania, co jest szczególnie ważne przy audytach czy testach dla klientów z branż regulowanych, np. medycyna czy bankowość. Sam standard IEEE 829-1998 bardzo konkretnie określa, jakie dane mają się tam znaleźć – to nie tylko „odhaczenie”, ale pełna informacja o przebiegu i wyniku każdego testu, ewentualnych problemach czy wyjątkowych sytuacjach. W praktyce, czy to prowadzisz Excela, dokumentację papierową czy system typu JIRA/Xray, dobrze prowadzony dziennik testów pozwala potem zidentyfikować luki w pokryciu przypadków, powtórzyć testy po naprawach czy po prostu udowodnić, że procedura była zgodna z wymaganiami. Warto to sobie wyrobić jako nawyk. Sam nieraz wracałem do starych dzienników, żeby sprawdzić „co poszło nie tak” parę miesięcy wcześniej – bez tego byłaby loteria!
Pytanie 3
Jaką cechą charakteryzuje się sieć asynchroniczna?
A. Jest bardziej niezawodna od sieci synchronicznej
B. Dane są przesyłane jedynie w określonych przedziałach czasowych
C. Dane są przesyłane w sposób nieciągły, bez synchronizacji zegarów
D. Wymaga synchronizacji zegarów
Sieci asynchroniczne to rodzaj systemów komunikacyjnych, w których dane są przesyłane w sposób nieciągły, co oznacza, że nie wymagają one synchronizacji zegarów pomiędzy urządzeniami. W takich sieciach, każda jednostka przesyła dane w dowolnym momencie, co zwiększa elastyczność i efektywność komunikacji. Przykładem zastosowania sieci asynchronicznych są systemy oparte na protokołach, takich jak UART (Universal Asynchronous Receiver-Transmitter), które są powszechnie używane w mikrokomputerach oraz różnych urządzeniach elektronicznych. W kontekście standardów, sieci asynchroniczne są często stosowane w komunikacji szeregowej, gdzie dane są przesyłane bez ustalonych ram czasowych, co pozwala na redukcję opóźnień i zwiększenie przepustowości. W praktyce, taki model komunikacji jest idealny w sytuacjach, gdzie ciągłość przesyłu danych nie jest kluczowa, jak w przypadku transmisji danych z czujników czy urządzeń IoT, gdzie urządzenia mogą nadawać dane, gdy są gotowe, a nie w ustalonych interwałach czasowych.
Pytanie 4
Jaki typ złośliwego oprogramowania funkcjonuje w tle, zbierając dane o wprowadzanych hasłach?
A. Adware
B. Trojan
C. Spyware
D. Keylogger
Keylogger to takie złośliwe oprogramowanie, które działa w tle i rejestruje wszystkie naciśnięcia klawiszy. To naprawdę niebezpieczne, bo może przechwytywać hasła i inne ważne dane osobowe. Keyloggery mogą się dostawać na komputer na różne sposoby, na przykład przez zainfekowane pliki, złośliwe reklamy albo w ramach innych niebezpiecznych programów. Przykładami takich keyloggerów są Spyrix czy Perfect Keylogger, które mogą monitorować, co robisz na komputerze. Z punktu widzenia bezpieczeństwa, standardy takie jak ISO/IEC 27001 mówią, jak ważna jest ochrona informacji. Dlatego tak istotne jest, żeby użytkownicy mieli świadomość zagrożeń, jakie niosą keyloggery i używali dobrego oprogramowania antywirusowego, żeby chronić swoje urządzenia i dane.
Pytanie 5
Co to jest ORM w kontekście programowania?
A. Operational Reliability Management - zarządzanie niezawodnością operacyjną systemów
B. Organized Resource Model - model organizacji zasobów w aplikacjach webowych
C. Output Rendering Module - moduł renderujący dane wyjściowe w aplikacjach
D. Object-Relational Mapping - technika konwersji danych między systemami typów w relacyjnych bazach danych
W kontekście programowania istnieje wiele terminów i technik, które mogą wprowadzać w błąd, jeśli zostaną źle zrozumiane. Na przykład, 'Operational Reliability Management' odnosi się do zarządzania niezawodnością operacyjną systemów, co jest ważne, ale nie ma bezpośredniego związku z koncepcją ORM, ponieważ skupia się na zapewnieniu ciągłości działania systemów i minimalizacji przestojów. Kolejna koncepcja, 'Organized Resource Model', sugeruje modelowanie zasobów w aplikacjach webowych, co również nie odnosi się do techniki ORM. ORM skupia się na konwersji danych między obiektami a relacyjnymi bazami danych, a nie na organizacji zasobów. Wreszcie, 'Output Rendering Module' to termin związany z wyświetlaniem danych, co również nie jest związane z ORM, który nie zajmuje się renderowaniem, a jedynie mapowaniem danych. Kluczowym błędem myślowym jest mylenie celów różnych technik i narzędzi w programowaniu. Zrozumienie, że ORM jest konkretną techniką konwersji danych, a nie zarządzania operacyjnego lub modelowania zasobów, to fundament, który pozwala właściwie zinterpretować jego zastosowanie w praktyce programistycznej. Właściwa znajomość tych terminów oraz umiejętność rozróżnienia ich funkcji jest kluczowa w profesjonalnym programowaniu, by unikać nieporozumień i wdrażać odpowiednie rozwiązania w projektach informatycznych.
Pytanie 6
Jaką rolę odgrywa program Jira?
A. Produkcja grafik 3D
B. Zarządzanie edycjami systemu operacyjnego
C. Planowanie, śledzenie oraz raportowanie zadań projektowych
D. Modyfikowanie arkuszy kalkulacyjnych
Jira to jedno z najpopularniejszych narzędzi do zarządzania projektami, wykorzystywane głównie w metodykach Agile i Scrum. Umożliwia planowanie, monitorowanie i raportowanie zadań projektowych na różnych etapach ich realizacji. Dzięki elastycznym tablicom kanban i sprintom, Jira pozwala zespołom programistycznym śledzić postępy, zarządzać backlogiem oraz efektywnie przydzielać zasoby. Funkcjonalności takie jak automatyzacja procesów, śledzenie błędów (bug tracking) i integracja z innymi narzędziami (np. GitHub, Bitbucket) sprawiają, że Jira jest wszechstronnym rozwiązaniem do zarządzania nawet najbardziej złożonymi projektami. Dzięki generowanym raportom i wykresom burndown, menedżerowie mogą dokładnie analizować tempo pracy i podejmować decyzje w oparciu o dane.
Pytanie 7
Jaką kategorię własności intelektualnej reprezentują znaki towarowe?
A. Własność przemysłowa
B. Prawa pokrewne
C. Autorskie prawa majątkowe
D. Dobra niematerialne
Znaki towarowe należą do kategorii własności przemysłowej. Ochrona znaków towarowych pozwala firmom na zabezpieczenie ich brandingu, logotypów oraz nazw produktów przed nieuprawnionym wykorzystaniem przez konkurencję. Rejestracja znaku towarowego daje właścicielowi prawo do wyłącznego używania go w celach komercyjnych i przeciwdziałania naruszeniom. Własność przemysłowa obejmuje także patenty, wzory przemysłowe i oznaczenia geograficzne, stanowiąc kluczowy element strategii ochrony marki oraz wartości firmy na rynku międzynarodowym.
Pytanie 8
Jakie słowa kluczowe są stosowane w języku C++ do zarządzania wyjątkami?
A. except i finally
B. throw i handle
C. try i catch
D. try i raise
Słowa kluczowe 'try' i 'catch' są podstawą obsługi wyjątków w języku C++. Umożliwiają one przechwytywanie i obsługę błędów, które mogą wystąpić podczas wykonywania programu. Blok 'try' zawiera kod, który jest monitorowany pod kątem błędów, a blok 'catch' przechwytuje i przetwarza zgłoszony wyjątek, zapobiegając nieoczekiwanemu zakończeniu programu. Mechanizm ten jest kluczowy dla tworzenia niezawodnego i odpornego na błędy oprogramowania. Dzięki 'try' i 'catch' programista może implementować logikę naprawczą lub logować błędy, co zwiększa stabilność i bezpieczeństwo aplikacji.
Pytanie 9
Jaką funkcję pełni operator "|" w języku C++?
A. Operację przesunięcia bitów w prawo
B. Bitowe "xor"
C. Logiczne "lub"
D. Bitowe "lub"
Operator `||` to operator logiczny `OR`, który działa na wartościach logicznych i zwraca `true`, jeśli przynajmniej jeden z operandów jest prawdziwy, ale nie operuje na poziomie bitów. Operator `^` to operator `XOR` (exclusive or), który zwraca `1` tylko wtedy, gdy jeden z operandów ma wartość `1`, a drugi `0`. Operator `>>` to operator przesunięcia bitowego w prawo, który przesuwa bity liczby w prawo o określoną liczbę miejsc, co skutkuje podzieleniem liczby przez potęgę dwójki. Każdy z tych operatorów działa inaczej niż `|`, który jest operatorem bitowego `OR`.
Pytanie 10
Jakie znaczenie ma krajowa normalizacja dla produktów i usług?
A. Restrukcjonuje innowacje technologiczne
B. Usuwa konieczność przeprowadzania kontroli jakości
C. Ogranicza liczbę dostępnych towarów
D. Gwarantuje lepszą zgodność oraz jakość
Normalizacja krajowa to świetny sposób na to, żeby produkty i usługi były bardziej spójne i lepszej jakości. Kiedy mamy standardy, to producenci mogą robić rzeczy, które są zgodne z wymaganiami technicznymi. To z kolei sprawia, że konsumenci mogą bardziej ufać produktom, a ryzyko, że coś będzie wadliwe, spada. Dzięki normalizacji zwiększa się bezpieczeństwo, poprawia interoperacyjność, a to wszystko wspiera rozwój technologiczny. No i jest jeszcze to, że łatwiej jest wymieniać produkty między różnymi rynkami, co ma pozytywny wpływ na całą gospodarkę.
Pytanie 11
Na podstawie zamieszczonego fragmentu kodu można stwierdzić, że element o nazwie rysunek jest
MojaKlasaobj1= newMojaKlasa();obj1.rysunek();
A. konstruktorem
B. obiektem
C. metodą w klasie
D. polem w klasie
W tym fragmencie kodu wywołujesz funkcję rysunek na obiekcie obj1, który jest instancją klasy MojaKlasa. To znaczy, że rysunek jest metodą tej klasy. Tak naprawdę, w programowaniu obiektowym korzystanie z metod to chleb powszedni – to one definiują zachowanie obiektu. W praktyce, metody są tym, co pozwala obiektom „robić” coś konkretnego, czyli realizować logikę biznesową albo odpowiadać na zdarzenia. Moim zdaniem warto pamiętać, że w standardach takich jak Java czy C#, notacja obj1.rysunek() jednoznacznie wskazuje na wywołanie metody (nawiasy są tu sygnałem, że chodzi o funkcję, a nie o dostęp do pola). To zresztą jest bardzo czytelna konwencja, spotykana praktycznie w każdym języku zorientowanym obiektowo. Dla przykładu, jeśli chciałbyś uzyskać dostęp do pola w obiekcie, nie używałbyś nawiasów, tylko napisałbyś obj1.nazwapola. W pracy nad większymi projektami warto też pamiętać o tzw. enkapsulacji – metody pozwalają „schować” szczegóły implementacji i udostępnić tylko to, co faktycznie powinno być dostępne z zewnątrz. W sumie, wywołanie obj1.rysunek(); dokładnie pokazuje, jak od strony praktycznej wyglądają interakcje z metodą klasy.
Pytanie 12
Jaką rolę odgrywa interpreter w kontekście programowania?
A. Łączy kod źródłowy z zewnętrznymi bibliotekami
B. Przekłada kod źródłowy na język maszynowy w trakcie działania programu
C. Generuje plik wykonywalny dla systemu operacyjnego
D. Zoptymalizowuje wydajność aplikacji w środowisku produkcyjnym
Interpreter tłumaczy kod źródłowy na język maszynowy instrukcja po instrukcji, co oznacza, że każda linia kodu jest analizowana i wykonywana na bieżąco. Dzięki temu programy interpretowane, takie jak te w Pythonie, Ruby czy JavaScript, mogą być szybko testowane i uruchamiane bez konieczności wcześniejszej kompilacji. Interpretacja pozwala na elastyczność w procesie rozwoju, ponieważ zmiany w kodzie są widoczne natychmiast po zapisaniu pliku. To czyni interpreter idealnym narzędziem do prototypowania i budowania aplikacji w dynamicznych środowiskach.
Pytanie 13
Wskaż fragment kodu, który wykreuje przedstawioną kontrolkę?
A. Kod2
B. Kod4
C. Kod3
D. Kod1
Odpowiednim kodem do wygenerowania przedstawionej kontrolki jest Kod3 który korzysta z klasy RatingBar w Androidzie. RatingBar to bardzo przydatny element interfejsu użytkownika pozwalający użytkownikom na ocenę w skali gwiazdek. W tym przypadku RatingBar posiada atrybut android:rating ustawiony na 2.5 co oznacza że kontrolka wyświetli dwie pełne gwiazdki i jedną połowę co odpowiada przedstawionej grafice. Dodatkowo atrybut android:progressTint ustawiony na #4682B4 zmienia kolor gwiazdek na niebieski. Użycie RatingBar jest standardową praktyką w aplikacjach mobilnych dla zbierania opinii użytkowników. Ważne jest aby pamiętać że RatingBar może być konfigurowany do obsługi różnych wartości minimalnych i maksymalnych oraz do dostosowywania wyglądu za pomocą stylów i tematów. Dobrym zwyczajem jest dbanie o czytelność i intuicyjność interfejsu co osiąga się m.in. przez odpowiednie oznaczanie i rozmieszczanie kontrolek takich jak RatingBar.
Pytanie 14
Która z poniższych technologii jest używana do tworzenia animacji na stronach internetowych?
A. HTTP Headers
B. MySQL
C. XML
D. CSS Animations
CSS Animations to technologia, która pozwala na tworzenie dynamicznych efektów wizualnych na stronach internetowych. Umożliwia ona animowanie różnych właściwości CSS, takich jak kolor, położenie, rozmiar czy przezroczystość, w prosty sposób. Dzięki CSS Animations, deweloperzy mogą tworzyć płynne przejścia i efekty bez potrzeby używania JavaScriptu, co zwiększa wydajność i responsywność witryn. Przykładem zastosowania CSS Animations może być animowanie przycisków na stronie, które zmieniają kolor po najechaniu na nie kursorem. Z punktu widzenia dobrych praktyk, warto pamiętać o optymalizacji efektów animacyjnych, aby nie obciążały one zbytnio zasobów przeglądarki. CSS Animations są częścią standardu CSS3, co oznacza, że są szeroko wspierane przez różne przeglądarki i można je łatwo implementować w projektach webowych.
Pytanie 15
Jakie z wymienionych narzędzi służy do emulacji mobilnych urządzeń podczas developowania aplikacji?
A. TensorFlow
B. Postman
C. Genymotion
D. Numpy
Genymotion to jedno z najbardziej zaawansowanych narzędzi do emulacji urządzeń mobilnych podczas tworzenia aplikacji na system Android. Umożliwia symulowanie działania aplikacji na różnych urządzeniach i wersjach systemu Android, co pozwala programistom na testowanie kompatybilności i wydajności aplikacji w różnych warunkach. Genymotion oferuje szybkie emulowanie, obsługę GPS, kamery oraz czujników, co czyni go niezwykle przydatnym narzędziem w procesie rozwoju aplikacji mobilnych. Dzięki wsparciu dla integracji z Android Studio, Genymotion jest popularnym wyborem wśród deweloperów tworzących aplikacje na platformę Android.
Pytanie 16
Jakie z przedstawionych rozwiązań może pomóc w unikaniu porażeń prądem w biurze?
A. Wykorzystanie foteli o ergonomicznym kształcie
B. Systematyczne sprawdzanie instalacji elektrycznych
C. Stosowanie monitorów LCD
D. Kontrolowanie jakości powietrza
Regularne testowanie instalacji elektrycznych to podstawowy sposób zapobiegania porażeniom prądem w pracy biurowej. Testy te pozwalają wykryć uszkodzenia, przeciążenia i inne usterki, które mogą stanowić zagrożenie dla pracowników. Prawidłowo przeprowadzane przeglądy techniczne obejmują sprawdzanie stanu przewodów, gniazdek oraz urządzeń elektrycznych. Regularne kontrole zgodne z normami BHP oraz przepisami dotyczącymi instalacji elektrycznych są obowiązkowe i mają kluczowe znaczenie dla bezpieczeństwa pracy. Pamiętaj, że zaniedbanie testów elektrycznych może prowadzić do poważnych wypadków, takich jak pożary lub porażenia prądem.
Pytanie 17
W jakim języku został stworzony framework Angular?
A. Postscript
B. C#
C. Typescript
D. PHP
Angular został stworzony w języku TypeScript, który to w sumie można uznać za rozszerzenie JavaScriptu – dodaje on typowanie statyczne i sporo udogodnień znanych z języków obiektowych. Moim zdaniem to był strzał w dziesiątkę, bo dzięki temu kod aplikacji Angular jest czytelniejszy, łatwiejszy w utrzymaniu i mniej podatny na takie typowe błędy, które się pojawiały w czystym JS. W praktyce, kiedy piszesz komponenty czy serwisy w Angularze, natychmiast korzystasz z silnych typów, interfejsów czy mechanizmów takich jak dekoratory. To nie tylko poprawia bezpieczeństwo kodu, ale też pomaga zespołom programistycznym lepiej się dogadywać i szybciej wdrażać nowe funkcjonalności. Przemysł poszedł tą drogą, bo TypeScript daje lepsze wsparcie narzędziowe, np. podpowiedzi w edytorach, refaktoryzację czy automatyczne wykrywanie błędów. Wbrew pozorom, nie jest trudno się przestawić z JS na TS – nawet dla osób, które programowały wcześniej tylko w czystym JavaScript. Poza tym, Angular to nie tylko framework do weba – aplikacje tworzone w TypeScript można kompilować na różne platformy, co jest już praktyką w dużych firmach. Takie podejście wpisuje się w obecne trendy w branży, gdzie typowanie i czytelność kodu to podstawa.
Pytanie 18
W jaki sposób procesor nawiązuje komunikację z pamięcią podręczną (cache)?
A. Za pomocą systemu przerwań
B. Poprzez linie danych w magistrali systemowej
C. Bezpośrednio, omijając mostki systemowe
D. Używając wyłącznie pamięci RAM
Procesor komunikuje się z pamięcią podręczną (cache) za pomocą linii danych w magistrali systemowej, co jest kluczowym elementem architektury komputerowej. Magistrala systemowa to zestaw ścieżek, które umożliwiają przesyłanie danych pomiędzy różnymi komponentami systemu, w tym procesorem, pamięcią RAM oraz pamięcią podręczną. Pamięć podręczna działa jako bufor, który przechowuje najczęściej używane dane, co pozwala na znaczne zwiększenie szybkości operacji, ponieważ dostęp do pamięci cache jest znacznie szybszy niż dostęp do pamięci RAM. W standardach takich jak Intel's QuickPath Interconnect (QPI) czy AMD's HyperTransport, linie danych odgrywają kluczową rolę w efektywnej komunikacji, co przekłada się na ogólną wydajność systemu. Przykładowo, w nowoczesnych procesorach wielordzeniowych, każda rdzeń może mieć własną pamięć podręczną, a komunikacja za pomocą magistrali pozwala na synchronizację danych pomiędzy tymi rdzeniami oraz współdzielenie zasobów. Efektywne zarządzanie pamięcią podręczną i magistralą jest kluczowe dla osiągnięcia wysokiej wydajności w obliczeniach oraz przetwarzaniu danych.
Pytanie 19
Programista pragnie wybrać algorytm, który najszybciej przetwarza dane w jego aplikacji. Na podstawie złożoności obliczeniowej przedstawionej w tabeli, należy wskazać algorytm numer
Algorytm 1
O(n²)
Algorytm 2
O(n!)
Algorytm 3
O(n³)
Algorytm 4
O(n)
Algorytm 5
O(n²)
A. 4
B. 2 lub 3
C. 1 lub 5
D. 3
Wybierając algorytm do zastosowania w praktycznej aplikacji, kluczowe jest zwracanie uwagi na złożoność obliczeniową, bo to ona decyduje, jak algorytm radzi sobie ze wzrostem ilości danych. Często spotykam się z błędnym przekonaniem, że algorytm o złożoności na przykład O(n²) jest w porządku, o ile nie mamy naprawdę gigantycznych zbiorów danych. Problem polega na tym, że już przy kilkuset czy kilku tysiącach elementów taki algorytm potrafi znacząco spowolnić działanie aplikacji. Jeszcze gorzej jest z O(n³), bo tutaj czas wykonania rośnie bardzo szybko, praktycznie wykładniczo – co praktycznie wyklucza użycie tego algorytmu w prawdziwie produkcyjnych rozwiązaniach, chyba że mamy do czynienia z ekstremalnie małymi zbiorami danych. Odpowiedzi wskazujące na algorytmy z O(n²) lub O(n³) pomijają najlepszą opcję, która znajduje się w tabeli – czyli Algorytm 4 z O(n). Tylko O(n) gwarantuje, że czas działania rośnie w sposób liniowy, co daje praktycznie jedyną szansę na obsługę dużych wolumenów danych bez zatorów i „zadyszki” aplikacji. Odpowiedź wskazująca Algorytm 2 (O(n!)) to już w ogóle bardzo typowy błąd – tego typu złożoność spotyka się głównie w algorytmach, gdzie trzeba sprawdzić wszystkie możliwe permutacje, jak np. problem komiwojażera, i na pewno nie jest to wybór optymalny. Podsumowując, cała ta sytuacja pokazuje, jak ważna jest umiejętność czytania notacji O(...) i świadomego wybierania algorytmów – to podstawa w programowaniu, szczególnie jeśli zależy nam na wydajności i skalowalności naszych rozwiązań.
Pytanie 20
Jakie narzędzie najlepiej sprawdza się w przekształcaniu liczby szesnastkowej na binarną?
A. Aplikacja internetowa
B. Program do edycji tekstu
C. Program do arkuszy kalkulacyjnych
D. Kalkulator programisty
Kalkulator programisty jest najbardziej odpowiednim narzędziem do konwersji liczby szesnastkowej na binarną ze względu na swoje wyspecjalizowane funkcje matematyczne i programistyczne. Narzędzia te umożliwiają użytkownikom łatwe przekształcanie różnych systemów liczbowych, w tym konwersji z systemu szesnastkowego (hex) na system binarny. Kalkulatory programistyczne często zawierają dedykowane opcje dla konwersji liczbowej, co pozwala na szybkie i dokładne uzyskanie wyników bez potrzeby stosowania skomplikowanych algorytmów lub wzorów. Na przykład, aby przekształcić liczbę szesnastkową '1A' na binarną, użytkownik wprowadza '1A' do kalkulatora, a wynik '00011010' zostaje automatycznie wygenerowany. Dodatkowo, wiele kalkulatorów programistycznych jest zgodnych z międzynarodowymi standardami, co zapewnia ich wiarygodność w obliczeniach. Warto również zauważyć, że kalkulatory programistyczne mogą obsługiwać konwersje z różnych systemów liczbowych, co czyni je wszechstronnym narzędziem w pracy z danymi cyfrowymi i kodowaniem. Dzięki temu, kalkulator programisty stanowi idealne rozwiązanie dla programistów i inżynierów, którzy regularnie pracują z różnymi formatami danych.
Pytanie 21
Która biblioteka JavaScript jest najczęściej używana do tworzenia testowalnych funkcji asynchronicznych?
A. Moment.js
B. Axios
C. D3.js
D. Underscore.js
Axios jest jedną z najpopularniejszych bibliotek JavaScript używanych do obsługi żądań HTTP, zwłaszcza w kontekście asynchronicznych operacji. Umożliwia łatwe tworzenie funkcji asynchronicznych, które mogą komunikować się z serwerami. Dzięki wsparciu dla obietnic (Promises), Axios pozwala na prostsze zarządzanie wynikami operacji asynchronicznych. Przykładowo, można użyć go do wykonywania zapytań do API w aplikacjach webowych. Przy pomocy Axios, developerzy mogą łatwo wysyłać żądania GET, POST i inne, a także obsługiwać odpowiedzi i błędy. Z perspektywy dobrych praktyk, Axios wspiera interceptory, które pozwalają na globalne zarządzanie zapytaniami i odpowiedziami, co jest szczególnie przydatne w dużych aplikacjach. Co więcej, Axios obsługuje również anulowanie żądań, co może być istotne w kontekście użytkowników, którzy mogą na przykład zmienić zdanie przed zakończeniem operacji. Takie cechy czynią Axios narzędziem niezwykle przydatnym w nowoczesnym programowaniu JavaScript.
Pytanie 22
Jakie są różnice między konstruktorem a zwykłą metodą w klasie?
A. Konstruktor można wywołać bez konieczności tworzenia obiektu
B. Konstruktor jest uruchamiany jedynie przez destruktor
C. Konstruktor powinien zwracać jakąś wartość
D. Konstruktor zawsze nosi tę samą nazwę co klasa i nie zwraca wartości
Konstruktor nie zwraca wartości, w przeciwieństwie do zwykłych metod klasy, które mogą zwracać typy danych (`int`, `float`, `string`). Konstruktor nie może być wywoływany bez tworzenia obiektu – jest to mechanizm związany wyłącznie z procesem inicjalizacji obiektu. Destruktor, a nie konstruktor, jest wywoływany po zakończeniu życia obiektu w celu zwolnienia zasobów. Konstruktor jest pierwszą metodą, która działa podczas tworzenia obiektu, co odróżnia go od destruktora, który działa na końcu życia obiektu.
Pytanie 23
Modyfikator dostępu, który znajduje się przed definicją metody Dodaj() w klasie Kalkulator, powoduje, że
protectedvoidDodaj() {}
A. jest ona dostępna w programie głównym i może być wywoływana na rzecz instancji klasy Kalkulator
B. nie jest ona dostępna w klasach, które dziedziczą po klasie Kalkulator
C. jest ona dostępna zarówno wewnątrz klasy, jak i w klasach dziedziczących po klasie Kalkulator
D. nie jest ona dostępna z poziomu klas zaprzyjaźnionych z klasą Kalkulator
Modyfikator dostępu protected jest kluczowym elementem programowania obiektowego, umożliwiającym kontrolę nad widocznością i dostępem do składników klasy. Gdy metoda jest oznaczona jako protected, jak w przypadku metody Dodaj() w klasie Kalkulator, oznacza to, że jest ona dostępna nie tylko w ramach tej klasy, ale również w dowolnych klasach, które dziedziczą po klasie Kalkulator. To podejście wspiera koncepcję dziedziczenia, umożliwiając klasom potomnym korzystanie z funkcjonalności klasy bazowej bez konieczności ponownego definiowania metod. Na przykład, jeśli stworzymy klasę DziecięcyKalkulator dziedziczącą po Kalkulator, metoda Dodaj() będzie dostępna w tej klasie potomnej. Takie rozwiązanie jest często stosowane w projektach, gdzie istnieje potrzeba rozszerzania funkcjonalności bazowych klas bez naruszania ich enkapsulacji. Dobre praktyki programistyczne sugerują stosowanie protected tam, gdzie chcemy umożliwić dziedziczenie oraz uniknąć nadmiernego udostępniania elementów klasy zewnętrznym użytkownikom. Dzięki temu kod staje się bardziej modularny i elastyczny, co jest istotne w dużych projektach programistycznych. Zrozumienie roli modyfikatorów dostępu, takich jak protected, jest kluczowe dla efektywnego projektowania i implementacji systemów obiektowych.
Pytanie 24
Przedstawione w filmie działania wykorzystują narzędzie
A. kompilatora dla interfejsu graficznego
B. debuggera analizującego wykonujący kod
C. generatora kodu java
D. generatora GUI przekształcającego kod do języka XAML
Wybrana odpowiedź jest trafna, bo faktycznie narzędzie pokazane w filmie to generator GUI, który potrafi przekształcać kod do języka XAML. XAML (czyli Extensible Application Markup Language) jest powszechnie używany do deklaratywnego opisywania interfejsów użytkownika, na przykład w aplikacjach WPF czy UWP na platformie .NET. Jak dla mnie, korzystanie z takich generatorów to ogromna wygoda, bo pozwala błyskawicznie przenosić projekt graficzny do formatu czytelnego dla platformy Microsoftu. Z mojego doświadczenia, wiele zespołów programistycznych stosuje takie rozwiązania, żeby oszczędzić czas na ręcznym pisaniu XAML-a (co potrafi być naprawdę żmudne przy dużych projektach). Co ciekawe, takie narzędzia bardzo dobrze współpracują z designerskimi edytorami UI i potrafią zautomatyzować konwersję nawet z innych formatów graficznych, np. Sketch czy Adobe XD do XAML-a. Branżowe standardy zalecają, by wykorzystywać generatorów GUI właśnie do tego celu, bo minimalizuje to liczbę błędów, przyspiesza wdrożenie zmian i ułatwia współpracę między programistami a projektantami. Warto pamiętać, że XAML jest bardzo elastyczny i umożliwia potem ręczną edycję wygenerowanego kodu – czasem powstają drobne poprawki, ale ogólnie to naprawdę przydatne narzędzie. Ogólnie – jeśli tylko projektujesz UI pod .NET, to automatyczna konwersja do XAML-a to jest coś, co warto znać i wykorzystywać w praktyce.
Pytanie 25
Zaproponowany fragment kodu w języku Java wypełnia tablicę elementami:
Ten fragment kodu w języku Java rzeczywiście tworzy tablicę o 10 elementach i wypełnia ją kolejnymi liczbami parzystymi, zaczynając od 2. Wynika to bezpośrednio z działania pętli for oraz zmiennej j, która startuje z wartością 2 i w każdym przebiegu pętli jest zwiększana o 2. Dzięki temu do każdej komórki tablicy trafia kolejna liczba parzysta: 2, 4, 6, 8 itd., aż do 20. Takie rozwiązanie jest bardzo często spotykane przy algorytmach, które generują lub przetwarzają sekwencje liczb wg określonego wzorca czy postępu arytmetycznego. Co ciekawe, ten schemat można łatwo modyfikować, np. zmieniając wartość początkową lub krok, żeby tablica wypełniała się liczbami nieparzystymi albo dowolnym innym ciągiem. W profesjonalnych projektach, gdy mamy do czynienia z większymi zbiorami danych, lepiej korzystać z metod typu Arrays.fill() lub streamów, jednak zrozumienie takiej manualnej pętli jest fundamentem nauki programowania. Z mojego doświadczenia, taki kod najlepiej obrazuje, jak działa indeksowanie tablic i inkrementacja wartości. Warto przećwiczyć podobne zadania, żeby utrwalić sobie podstawowe operacje na strukturach danych, bo potem przy bardziej złożonych algorytmach wszystko staje się prostsze. Takie rzeczy są wręcz codziennością w pracy programisty – czy to podczas inicjalizowania danych testowych, czy podczas przygotowywania danych wejściowych do algorytmów.
Pytanie 26
Jaka jest podstawowa funkcja narzędzia do zarządzania projektami?
A. Poprawa wydajności kodu programu
B. Produkcja animacji komputerowych
C. Zarządzanie zadaniami i czasem w projekcie
D. Opracowanie bazy danych dla projektu
Zarządzanie zadaniami i czasem to naprawdę kluczowa sprawa w projektach. Dzięki narzędziom takim jak Microsoft Project, Jira, Trello, czy Monday, zespoły mogą lepiej planować, przydzielać role i śledzić, co się dzieje. Możliwości tych narzędzi pozwalają ustalać deadline’y, priorytety, a nawet automatycznie przypominają o zbliżających się terminach. To super pomaga w unikaniu opóźnień i pozwala lepiej zorganizować pracę. Wizualizacja projektu w formie osi czasu czy tablicy kanban też jest mega przydatna, bo wszystko staje się bardziej czytelne.
Pytanie 27
Jakie ma znaczenie operator "==" w języku C++?
A. Przypisanie wartości do zmiennej
B. Negacja logiczna
C. Zwiększenie wartości zmiennej o 1
D. Porównanie dwóch wartości
Operator `==` w języku C++ oraz w wielu innych językach programowania, takich jak Java, Python czy JavaScript, jest używany do porównywania dwóch wartości. Jeśli wartości są równe, zwracana jest wartość logiczna `true`, w przeciwnym razie `false`. Operator ten jest niezbędny w instrukcjach warunkowych i pętlach, umożliwiając programowi podejmowanie decyzji na podstawie porównań. Przykładem użycia jest `if (a == b)`, co oznacza: jeśli zmienna `a` jest równa zmiennej `b`, wykonaj określony blok kodu.
Pytanie 28
Które z poniższych nie jest wzorcem architektonicznym aplikacji mobilnych?
A. Clean Architecture
B. MVC (Model-View-Controller)
C. MVVM (Model-View-ViewModel)
D. Linear Sequential Flow
Linear Sequential Flow, znany również jako model kaskadowy, nie jest uznawany za wzorzec architektoniczny aplikacji mobilnych z kilku powodów. Przede wszystkim jest to podejście linearnie sekwencyjne, które zakłada, że wszystkie fazy rozwoju oprogramowania (analiza wymagań, projektowanie, implementacja, testowanie i wdrożenie) są realizowane jedna po drugiej. W praktyce oznacza to, że nie ma możliwości powrotu do wcześniejszych etapów bez znacznych kosztów i czasu. W kontekście aplikacji mobilnych, gdzie wymagania często zmieniają się w trakcie procesu rozwoju, podejście to może prowadzić do poważnych problemów. Zamiast tego, stosuje się bardziej elastyczne wzorce, takie jak MVC (Model-View-Controller), MVVM (Model-View-ViewModel) czy Clean Architecture, które pozwalają na łatwiejsze dostosowywanie się do zmieniających się potrzeb rynku. Przykładem zastosowania MVC może być aplikacja z interfejsem użytkownika, gdzie model odpowiada za dane, widok za interakcję z użytkownikiem, a kontroler łączy te dwa elementy. Oprócz tego, wzorce architektoniczne takie jak MVVM są szczególnie popularne w aplikacjach opartych na JavaScript, co wprowadza jeszcze większą modularność i możliwość testowania poszczególnych komponentów.
Pytanie 29
Po uruchomieniu poniższego kodu w języku C++ na konsoli zobaczymy następujący tekst:
Wiele osób daje się złapać na nieco podchwytliwe formatowanie tekstu i nie do końca rozumie mechanizm działania funkcji printf w języku C++. Kluczowe jest, że printf nie wypisuje dosłownie wszystkiego, co znajduje się w cudzysłowie, tylko podmienia tzw. specyfikatory formatu na konkretne wartości przekazane po przecinku. Próby dosłownego przepisania wywołania funkcji printf jako wyjścia na ekran są mylące – program nie drukuje ""%s dodawania: %d + %.2f = %f"", tylko zamienia to na odpowiednie liczby i teksty. Równie powszechnym błędem jest niedopasowanie precyzji – np. wypisanie 5.12345 zamiast 5.12 przy %.2f, bo printf automatycznie zaokrągla wynik do dwóch miejsc po przecinku w tym miejscu. Część osób pomija też fakt, że argumenty w printf muszą być przekazane w tej samej kolejności, co specyfikatory – co jest bardzo istotne przy większej liczbie zmiennych. Należy zwrócić szczególną uwagę na to, jak typy danych są prezentowane i obsługiwane przez printf: %d to zawsze liczba całkowita, %.2f – liczba zmiennoprzecinkowa dokładnie z dwoma cyframi po przecinku, %f – domyślnie sześć miejsc po przecinku. W praktyce niepoprawne jest zapisywanie wywołania funkcji jako tekst do wyświetlenia albo przestawianie kolejności czy branie wartości z pamięci bez sprawdzenia ich formatu. Z mojego doświadczenia takie potknięcia wynikają raczej z braku praktyki z printf i nieuważnego czytania dokumentacji. Warto zawsze sprawdzać, jak formatowanie będzie wyglądać na wyjściu i testować fragmenty kodu – bo komputer nie domyśli się, co autor miał na myśli, tylko wykona dokładnie to, co zadeklarowano w kodzie.
Pytanie 30
Jak określa się proces, w trakcie którego klasa przejmuje właściwości innej klasy w programowaniu obiektowym?
A. Polimorfizm
B. Dziedziczenie
C. Abstrakcja
D. Hermetyzacja
Dziedziczenie to kluczowa cecha programowania obiektowego (OOP), która pozwala jednej klasie (klasie pochodnej) przejmować cechy i zachowania innej klasy (klasy bazowej). Dzięki dziedziczeniu można wielokrotnie wykorzystywać kod, co prowadzi do większej modularności i zmniejszenia redundancji. Dziedziczenie umożliwia rozszerzanie funkcjonalności klas bazowych poprzez dodawanie nowych metod lub modyfikowanie istniejących, bez konieczności ingerencji w oryginalny kod. Przykład w C++: `class Pojazd { ... }; class Samochod : public Pojazd { ... };` – `Samochod` dziedziczy wszystkie publiczne i chronione (protected) elementy klasy `Pojazd`.
Pytanie 31
Które z wymienionych stwierdzeń najcelniej opisuje proces uruchamiania aplikacji?
A. Tłumaczenie kodu źródłowego na język pośredni
B. Przetwarzanie kodu źródłowego przez kompilator
C. Generowanie pliku źródłowego
D. Wykonywanie programu na podstawie przetłumaczonego kodu maszynowego
Uruchomienie programu to naprawdę ważny moment, bo w tym czasie procesor zaczyna działać na kodzie maszynowym. Ten kod powstaje podczas kompilacji, która zamienia kod źródłowy na coś, co komputer rozumie. W tym etapie program trafia do pamięci, a także przygotowywane są różne dane do działania. Tak więc, to jest kluczowy krok w całej historii programu, bo decyduje, jak dobrze będzie działać.
Pytanie 32
Która z poniższych metod tablicowych w JavaScript nie modyfikuje oryginalnej tablicy?
A. sort()
B. map()
C. splice()
D. push()
Metoda map() w JavaScript jest funkcją tablicową, która tworzy nową tablicę na podstawie wyników wywołania funkcji podanej jako argument dla każdego elementu oryginalnej tablicy. Kluczowym aspektem tej metody jest to, że nie modyfikuje oryginalnej tablicy, co czyni ją bezpiecznym narzędziem do transformacji danych. Zastosowanie map() jest szczególnie przydatne w sytuacjach, gdy chcemy przekształcić dane, ale zachować oryginał, na przykład w przypadku przetwarzania wyników z API lub operacji na danych wejściowych od użytkownika. Standardowe praktyki zalecają używanie map() w programowaniu funkcyjnym, co pozwala na bardziej deklaratywne podejście do manipulacji danymi. Przykład zastosowania: mając tablicę liczb, możemy użyć map() do stworzenia nowej tablicy, która zawiera tylko ich kwadraty: const numbers = [1, 2, 3]; const squares = numbers.map(num => num * num); W ten sposób oryginalna tablica numbers pozostaje nietknięta, co jest kluczowe w wielu aplikacjach, w których zachowanie stanu jest istotne.
Pytanie 33
Jakie kroki należy podjąć po wykryciu błędu w kodzie podczas testowania?
A. Zgłosić błąd użytkownikowi końcowemu
B. Naprawić błąd i przeprowadzić ponowne testy aplikacji
C. Pominąć błąd, jeżeli aplikacja funkcjonuje poprawnie
D. Usunąć moduł, który zawiera błąd
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 34
Programista może wykorzystać framework Angular do realizacji aplikacji
A. typu front-end
B. mobilnej
C. desktopowej
D. typu back-end
Angular to naprawdę fajny framework, stworzony przez Google, który głównie skupia się na tworzeniu aplikacji webowych po stronie klienta, czyli na front-endzie. Umożliwia programistom tworzenie dynamicznych i interaktywnych interfejsów użytkownika. Dzięki tej modularnej budowie, można łatwo zarządzać różnymi częściami aplikacji, co jest super przydatne. Z własnego doświadczenia mogę powiedzieć, że Angular świetnie nadaje się do aplikacji jednoekranowych (SPA), bo pozwala na ładowanie danych asynchronicznie. Przykładem może być aplikacja do zarządzania projektami, gdzie użytkownik może dodawać, edytować i usuwać zadania bez przeładowywania strony. Angular integruje się też z RxJS, co sprawia, że zarządzanie zdarzeniami i strumieniami danych staje się efektywniejsze. Warto również dodać, że Angular CLI pozwala szybko generować komponenty i inne elementy aplikacji, co przyspiesza cały proces tworzenia i pomaga utrzymać spójność projektu.
Pytanie 35
Która metoda wyszukiwania potrzebuje posortowanej listy do prawidłowego działania?
A. Wyszukiwanie binarne
B. Wyszukiwanie sekwencyjne
C. Wyszukiwanie z hashem
D. Wyszukiwanie liniowe
Wyszukiwanie liniowe (sekwencyjne) działa niezależnie od tego, czy tablica jest posortowana, ale ma złożoność O(n), co czyni je mniej efektywnym dla dużych zbiorów danych. Wyszukiwanie z hashem (hashing) nie wymaga posortowania tablicy, ponieważ działa na zasadzie mapowania kluczy do wartości i ma złożoność O(1) w najlepszym przypadku. Przeszukiwanie sekwencyjne (Linear Search) działa liniowo i nie wykorzystuje sortowania, co sprawia, że jest mniej wydajne dla dużych tablic.
Pytanie 36
Jakie narzędzie najlepiej wykorzystać do testowania API REST?
A. Selenium
B. Postman
C. Git
D. Jasmine
Postman to jedno z najpopularniejszych narzędzi do testowania API REST, które oferuje wiele funkcji ułatwiających pracę z interfejsami programistycznymi. Jego intuicyjny interfejs użytkownika pozwala na łatwe wysyłanie zapytań HTTP, takich jak GET, POST, PUT, DELETE, co jest kluczowe w testowaniu API. Dzięki wsparciu dla kolekcji zapytań, użytkownicy mogą organizować i grupować swoje testy, co ułatwia zarządzanie projektem i iteracyjne testowanie. Ponadto, Postman umożliwia automatyzację testów poprzez skrypty testowe, które można uruchomić po wykonaniu zapytania, co pozwala na szybką weryfikację odpowiedzi API i ich zgodności z oczekiwaniami. Narzędzie wspiera także integracje z CI/CD, co czyni je idealnym dla zespołów pracujących w metodykach Agile. Postman jest zgodny z najlepszymi praktykami branżowymi, takimi jak RESTful API design, co czyni go niezbędnym w każdym projekcie wykorzystującym API.
Pytanie 37
Które z wymienionych stwierdzeń najtrafniej charakteryzuje klasę bazową?
A. Klasa, która zawsze zawiera metody wirtualne
B. Klasa, która nie może być dziedziczona
C. Klasa, która zapewnia wspólne atrybuty i metody dla klas pochodnych
D. Klasa, która dziedziczy z klasy pochodnej
Klasa bazowa to klasa, która dostarcza wspólne pola i metody dla klas pochodnych. Definiuje ogólną funkcjonalność, która może być rozszerzana lub modyfikowana przez klasy dziedziczące. Dzięki temu programowanie obiektowe umożliwia wielokrotne wykorzystanie kodu, co prowadzi do jego większej modularności i czytelności. Klasa bazowa często zawiera metody wirtualne, które mogą być nadpisywane przez klasy pochodne, co pozwala na dostosowanie funkcjonalności do konkretnych potrzeb. Przykładem jest klasa 'Pojazd', która posiada metody takie jak 'Jedz()' czy 'Zatrzymaj()', a klasy pochodne, np. 'Samochód' lub 'Rower', rozszerzają tę funkcjonalność.
Pytanie 38
Który z podanych algorytmów operujących na jednowymiarowej tablicy posiada złożoność obliczeniową O(n²)?
A. Wypisanie elementów
B. Sortowanie szybkie
C. Wyszukiwanie binarne
D. Sortowanie bąbelkowe
Sortowanie bąbelkowe, znane również jako bubble sort, to prosty algorytm sortowania, który działa na zasadzie wielokrotnego przechodzenia przez tablicę i porównywania sąsiadujących ze sobą elementów. Algorytm ten ma złożoność obliczeniową O(n^2), co oznacza, że w najgorszym przypadku liczba operacji porównania wzrasta kwadratowo wraz ze wzrostem liczby elementów w tablicy. Przykładowo, dla tablicy o 5 elementach algorytm może wykonać do 10 porównań. W praktyce sortowanie bąbelkowe jest rzadko stosowane w dużych zbiorach danych ze względu na swoją niską efektywność, jednak jest to dobry przykład do nauki podstaw algorytmów sortujących. Standardy algorytmów sortujących, takie jak te zawarte w podręcznikach algorytmiki, często używają sortowania bąbelkowego jako przykładu do omówienia prostych koncepcji związanych z sortowaniem. Warto zauważyć, że chociaż algorytm ten jest prosty do zrozumienia, jego złożoność czasowa sprawia, że nie jest on praktyczny do stosowania w produkcyjnych rozwiązaniach, gdyż bardziej optymalne algorytmy, jak sortowanie szybkie czy sortowanie przez scalanie, osiągają złożoność O(n log n).
Pytanie 39
Dziedziczenie jest używane, gdy zachodzi potrzeba
A. określenia zasięgu dostępności metod i pól danej klasy
B. sformułowania klasy bardziej szczegółowej niż już stworzona
C. asynchronicznej realizacji długotrwałych zadań
D. wykorzystania stałych wartości, niezmieniających się w trakcie działania aplikacji
Dziedziczenie to naprawdę jeden z kluczowych fundamentów programowania obiektowego. Chodzi tu o możliwość stworzenia nowej klasy (tzw. klasy pochodnej), która rozszerza lub precyzuje działanie już istniejącej klasy bazowej. Dzięki temu nie trzeba pisać wszystkiego od nowa – można po prostu przejąć cechy i zachowania ogólnej klasy, a potem dołożyć własne, bardziej szczegółowe funkcjonalności. Przykład? Klasa "Pojazd" może być ogólna, a potem robisz z niej "Samochód", "Rower" czy "Motocykl". Każda z tych klas dziedziczy podstawowe właściwości pojazdu (jak np. liczba kół), ale może mieć swoje dodatkowe pole czy metodę. W praktyce to pozwala na bardzo elastyczne i czytelne projektowanie kodu, no i łatwiejsze zarządzanie nim na dłuższą metę. Według większości standardów branżowych, np. w językach Java, C# czy C++, dziedziczenie jest zalecane właśnie wtedy, gdy chcesz odwzorować relację „jest rodzajem” (is-a). Z mojego doświadczenia, używanie dziedziczenia według tej zasady pozwala uniknąć wielu problemów z powielaniem kodu i z czasem naprawdę oszczędza mnóstwo roboty. Warto pamiętać, że nie wszystko należy dziedziczyć na siłę – czasem lepiej postawić na kompozycję, ale jeśli faktycznie potrzebujesz klasy bardziej szczegółowej, to dziedziczenie to chyba najlepszy wybór.
Pytanie 40
Jakie znaczenie ma przystosowanie interfejsu użytkownika do różnych platform?
A. Usuwa konieczność testowania na różnych platformach
B. Pozwala na unifikację kodu niezależnie od używanej platformy
C. Gwarantuje optymalne korzystanie z aplikacji na każdym urządzeniu
D. Umożliwia skoncentrowanie się wyłącznie na funkcjonalności aplikacji
Dostosowanie interfejsu do różnych urządzeń to naprawdę ważna sprawa, żeby wszystko działało jak należy. Aplikacje, które dobrze się przystosowują do różnych ekranów czy systemów, dają lepsze doświadczenie użytkownikom. Użycie takich technik jak responsywny design czy elastyczne układy, jak flexbox czy grid, to super pomysł. Dzięki temu elementy interfejsu same się skalują, a aplikacja wygląda spójnie na telefonach, tabletach i komputerach. Nie ma nic gorszego niż chaotyczny interfejs na różnych urządzeniach, więc to naprawdę kluczowa kwestia.