Pytania pomocnicze - INF.04
Projektowanie, programowanie i testowanie aplikacji
Pytania pomocnicze rozwijające tematy z pytań egzaminacyjnych. Każde pytanie ma krótką odpowiedź, która pomaga utrwalić wiedzę i przygotować się do egzaminu. Łącznie: 1799.
Strona 18 z 20.
Czym różni się front-end od back-endu w aplikacji webowej?
Front-end działa po stronie użytkownika i odpowiada za wygląd oraz interakcję w przeglądarce. Back-end działa po stronie serwera i obsługuje logikę aplikacji, dane oraz komunikację z bazą danych.
Dlaczego zarządzanie bazą danych należy do warstwy back-end?
Baza danych powinna być chroniona przed bezpośrednim dostępem użytkownika. Back-end kontroluje zapytania, uprawnienia i poprawność danych przed wykonaniem operacji na bazie.
Które zadania są typowe dla front-endu?
Do front-endu należą m.in. wyświetlanie danych w przeglądarce, obsługa kliknięć, dynamiczne zmiany interfejsu i walidacja formularza w czasie rzeczywistym.
Czy walidacja formularza może występować zarówno we front-endzie, jak i back-endzie?
Tak. Front-end może sprawdzać dane od razu w przeglądarce, ale back-end również musi je zweryfikować przed zapisem do bazy, ponieważ walidację po stronie klienta można obejść.
Co oznacza komunikacja front-endu z back-endem?
Front-end wysyła żądanie, np. przez HTTP, do serwera. Back-end przetwarza je, może pobrać dane z bazy i zwraca odpowiedź do przeglądarki.
Jakie przykładowe technologie mogą być używane w back-endzie?
Do technologii back-endowych należą m.in. Node.js, ASP.NET Core, Django, Symfony, Java Spring czy PHP. Służą do tworzenia logiki serwerowej aplikacji.
Dlaczego odwołanie doc.autor powoduje błąd?
Pole autor ma modyfikator protected, więc nie jest dostępne z kodu znajdującego się poza klasą Dokument ani poza klasami pochodnymi. Funkcja main próbuje odczytać je bezpośrednio przez obiekt, dlatego kompilator zgłosi błąd dostępu.
Czym różni się pole public od protected w C#?
Pole public jest dostępne z dowolnego miejsca programu. Pole protected jest dostępne tylko wewnątrz tej samej klasy oraz w klasach dziedziczących.
Czy brak jawnego konstruktora w klasie Dokument jest błędem?
Nie. Jeśli programista nie zdefiniuje konstruktora, C# automatycznie udostępnia konstruktor domyślny bez parametrów.
Czy zapis Dokument doc = new Dokument(); jest poprawny?
Tak. Jest to poprawna inicjalizacja obiektu klasy Dokument za pomocą konstruktora domyślnego.
Jak można poprawnie udostępnić wartość pola autor poza klasą?
Można użyć publicznej właściwości lub metody zwracającej wartość pola. Lepszą praktyką jest zachowanie pola jako private lub protected i kontrolowany dostęp przez właściwość.
Kiedy modyfikator protected jest przydatny?
protected stosuje się wtedy, gdy element klasy ma być ukryty przed kodem zewnętrznym, ale dostępny dla klas pochodnych. Jest często używany przy dziedziczeniu.
Jaki modyfikator dostępu należy zastosować, aby doc.autor było dostępne w main?
Należałoby zmienić protected na public. Nie zawsze jest to jednak dobra praktyka, ponieważ publiczne pola osłabiają hermetyzację.
Dlaczego w sortowaniu bąbelkowym stosuje się dwie pętle?
Pętla zewnętrzna wykonuje kolejne przebiegi sortowania, a pętla wewnętrzna porównuje sąsiednie elementy i zamienia je miejscami. Dzięki temu największe elementy stopniowo przesuwają się na koniec tablicy.
Co oznacza, że pętle działają na najwyżej n elementach?
Oznacza to, że zakres indeksów nie może przekraczać rozmiaru tablicy. Dla tablicy n-elementowej nie wolno odwoływać się do elementu poza zakresem, np. do indeksu n przy indeksowaniu od zera.
Jaka jest podstawowa zasada sortowania bąbelkowego?
Algorytm porównuje sąsiednie elementy tablicy i zamienia je miejscami, jeśli są w złej kolejności. Proces powtarza się, aż tablica zostanie uporządkowana.
Jaka jest złożoność czasowa sortowania bąbelkowego?
W typowej wersji sortowanie bąbelkowe ma złożoność O(n²), ponieważ wykorzystuje dwie zagnieżdżone pętle. Dla dużych danych jest więc mało wydajne.
Dlaczego odpowiedź z n+1 elementami jest błędna?
Tablica n-elementowa ma dokładnie n elementów, więc algorytm nie powinien operować na n+1 elementach. Takie odwołanie mogłoby prowadzić do wyjścia poza zakres tablicy.
Czy sortowanie bąbelkowe zawsze musi wykonać wszystkie przebiegi?
Nie. W wersji zoptymalizowanej można przerwać działanie algorytmu, jeśli w danym przebiegu nie wykonano żadnej zamiany, bo oznacza to, że tablica jest już posortowana.
Dlaczego w pętli wewnętrznej często używa się warunku j < n - 1 - i?
Po każdym pełnym przebiegu największy z nieposortowanych elementów trafia na swoje miejsce na końcu tablicy. Dlatego w kolejnych przebiegach nie trzeba go już porównywać.
Co oznacza zapis Click="fun1" w definicji przycisku WPF?
Oznacza przypisanie metody `fun1` jako procedury obsługi zdarzenia kliknięcia przycisku. Metoda zostanie wykonana po naciśnięciu przycisku przez użytkownika.
Dlaczego metoda obsługi zdarzenia Click ma parametry sender i RoutedEventArgs?
`sender` wskazuje obiekt, który wywołał zdarzenie, np. konkretny przycisk. `RoutedEventArgs` zawiera informacje o zdarzeniu w systemie zdarzeń WPF.
Czy obecność kontrolek RadioButton oznacza, że metoda fun1 obsługuje zmianę zaznaczenia opcji?
Nie. W podanym kodzie metoda `fun1` jest przypisana do zdarzenia `Click` przycisku `Button`, a nie do zdarzenia kontrolek `RadioButton`.
Czym różni się zdarzenie Click od zdarzenia utraty fokusu?
`Click` występuje po kliknięciu elementu, najczęściej przycisku. Utrata fokusu występuje wtedy, gdy kontrolka przestaje być aktywna, np. po przejściu do innego pola.
Do czego służy właściwość Content w kontrolkach XAML?
Właściwość `Content` określa zawartość wyświetlaną w kontrolce, np. tekst przycisku `OK` albo etykietę opcji `opcja1`.
Jak rozpoznać w XAML, że zdarzenie jest obsługiwane w kodzie C#?
W XAML pojawia się nazwa zdarzenia jako atrybut, np. `Click`, a jego wartością jest nazwa metody, np. `Click="fun1"`. Taka metoda musi istnieć w kodzie logiki aplikacji.
Dlaczego od małej litery odejmuje się wartość 32?
W kodzie ASCII małe i wielkie litery alfabetu angielskiego są oddalone od siebie o 32. Na przykład `a` ma kod 97, a `A` ma kod 65.
Co oznacza warunek `ciag[i] > 96 && ciag[i] < 123`?
Sprawdza, czy znak ma kod ASCII z zakresu od 97 do 122. Jest to zakres małych liter od `a` do `z`.
Jaką rolę pełni operator `&&` w tym kodzie?
Operator `&&` oznacza logiczne „i”. Oba warunki muszą być prawdziwe, aby znak został uznany za małą literę.
Po co w pętli wykonywane jest `i++`?
Instrukcja `i++` zwiększa indeks o 1, dzięki czemu pętla przechodzi do kolejnego znaku w ciągu.
Kiedy kończy się działanie pętli `while (ciag[i] != 0)`?
Pętla kończy się, gdy napotka znak o kodzie 0, czyli znak końca ciągu znaków w stylu C.
Dlaczego odpowiedź A jest niepoprawna?
Kod nie odejmuje 32 od każdego znaku, lecz tylko od znaków spełniających warunek bycia małą literą ASCII.
Czy ten kod zamieni polskie małe litery na wielkie?
Nie. Warunek obejmuje tylko litery ASCII `a-z`, więc nie obsługuje znaków takich jak `ą`, `ć`, `ę`.
Co oznacza, że jedna klasa dziedziczy po drugiej?
Oznacza to, że klasa potomna przejmuje pola i metody klasy bazowej. Dzięki temu można ponownie wykorzystać kod i rozszerzać działanie istniejących klas.
Która klasa jest klasą bazową w zapisie `class Klasa2 extends Klasa1`?
Klasą bazową jest `Klasa1`. Klasa `Klasa2` jest klasą pochodną, czyli dziedziczy po `Klasa1`.
Jak rozpoznać klasę potomną w deklaracji dziedziczenia?
Klasa potomna to ta, która jest deklarowana jako nowa klasa. W zapisie `class Klasa2 : Klasa1` klasą potomną jest `Klasa2`.
Jak różni się zapis dziedziczenia w Javie, C# i Pythonie?
W Javie używa się słowa `extends`, np. `class Klasa2 extends Klasa1`. W C# stosuje się dwukropek, np. `class Klasa2 : Klasa1`, a w Pythonie nazwę klasy bazowej podaje się w nawiasach, np. `class Klasa2(Klasa1):`.
Czym jest klasa bazowa?
Klasa bazowa to klasa, po której dziedziczą inne klasy. Zawiera wspólne cechy lub metody, które mogą być używane przez klasy potomne.
Czym jest klasa pochodna?
Klasa pochodna to klasa, która dziedziczy po innej klasie. Może korzystać z jej elementów oraz dodawać własne pola i metody.
Czy klasa potomna może zmienić działanie metody odziedziczonej po klasie bazowej?
Tak. Klasa potomna może nadpisać metodę, czyli zdefiniować własną wersję metody o tej samej nazwie.
Po co stosuje się dziedziczenie w programowaniu obiektowym?
Dziedziczenie pozwala ograniczyć powtarzanie kodu i budować hierarchie klas. Ułatwia też rozszerzanie programu bez przepisywania wspólnych elementów.
Czym testy integracyjne różnią się od testów jednostkowych?
Testy jednostkowe sprawdzają pojedynczy fragment kodu, np. funkcję lub klasę. Testy integracyjne sprawdzają współpracę kilku modułów lub systemów.
Co oznacza interfejs między modułami w kontekście testowania?
Interfejs między modułami to sposób komunikacji między częściami systemu, np. przekazywane dane, wywołania metod, API lub format odpowiedzi.
Jakie błędy najczęściej wykrywają testy integracyjne?
Wykrywają problemy w komunikacji między komponentami, np. niezgodny format danych, błędne mapowanie pól, problemy z bazą danych lub API.
Kiedy wykonuje się testy integracyjne?
Zwykle po testach jednostkowych, gdy poszczególne moduły działają osobno i trzeba sprawdzić ich współpracę.
Dlaczego testy wydajnościowe nie są poprawną odpowiedzią w tym pytaniu?
Testy wydajnościowe badają szybkość, obciążenie i czas reakcji systemu, a nie błędy w komunikacji między modułami.
Dlaczego testy bezpieczeństwa nie pasują do opisu z pytania?
Testy bezpieczeństwa służą do wykrywania podatności, np. luk w autoryzacji lub możliwości ataku. Nie koncentrują się głównie na interfejsach między modułami.
Podaj prosty przykład testu integracyjnego w aplikacji internetowej.
Przykładem jest sprawdzenie, czy po wysłaniu formularza rejestracji dane użytkownika trafiają do bazy danych i można się nimi później zalogować.
Na czym polega podejście Agile w wytwarzaniu oprogramowania?
Agile polega na tworzeniu oprogramowania przyrostowo i iteracyjnie. Projekt dzieli się na mniejsze części, które są projektowane, implementowane, testowane i oceniane w krótkich cyklach.
Dlaczego w Agile dzieli się projekt na mniejsze elementy?
Podział projektu ułatwia szybsze dostarczanie działających fragmentów aplikacji. Pozwala też szybciej reagować na zmiany wymagań i błędy.
Czym jest iteracja w metodykach zwinnych?
Iteracja to krótki cykl pracy, w którym zespół realizuje określony zakres funkcjonalności. Na końcu iteracji powinien powstać działający lub możliwy do oceny fragment produktu.
Czym Agile różni się od modelu kaskadowego?
W modelu kaskadowym etapy projektu następują po sobie liniowo, np. analiza, projektowanie, implementacja i testowanie. W Agile te czynności powtarzają się w krótkich cyklach dla kolejnych fragmentów systemu.
Dlaczego odpowiedź z planowaniem całej aplikacji na początku nie pasuje do Agile?
Agile nie zakłada szczegółowego zaplanowania całego produktu na starcie. Wymagania mogą być doprecyzowywane i zmieniane w trakcie kolejnych iteracji.
Jaką rolę pełni testowanie w Agile?
Testowanie odbywa się regularnie, często w każdej iteracji. Dzięki temu błędy są wykrywane wcześnie, a jakość produktu jest kontrolowana na bieżąco.
Co oznacza przyrostowe tworzenie aplikacji?
Przyrostowe tworzenie oznacza budowanie aplikacji fragment po fragmencie. Każdy kolejny przyrost dodaje nowe funkcje lub ulepsza istniejące.
Na czym polega polimorfizm w programowaniu obiektowym?
Polimorfizm pozwala traktować obiekty różnych klas pochodnych przez wspólny typ bazowy. Dzięki temu ta sama metoda może działać inaczej zależnie od rzeczywistego typu obiektu.
Jaką rolę pełni słowo kluczowe virtual w C++?
`virtual` oznacza metodę jako wirtualną, czyli taką, której właściwa wersja może zostać wybrana dynamicznie podczas działania programu.
Czym różni się przeciążanie metod od polimorfizmu dynamicznego?
Przeciążanie polega na tworzeniu metod o tej samej nazwie, ale innych parametrach. Polimorfizm dynamiczny polega na wywołaniu nadpisanej metody klasy pochodnej przez wskaźnik lub referencję do klasy bazowej.
Dlaczego dziedziczenie jest ważne dla funkcji wirtualnych?
Funkcje wirtualne mają sens głównie wtedy, gdy klasa pochodna nadpisuje metodę klasy bazowej. Bez dziedziczenia nie byłoby wspólnego typu bazowego, przez który można wywołać metodę.
Co oznacza dynamiczne wiązanie metod?
Dynamiczne wiązanie oznacza, że wybór konkretnej metody następuje w czasie działania programu. Jest to przeciwieństwo wyboru metody już na etapie kompilacji.
Do czego służy słowo kluczowe override w C++?
`override` informuje, że metoda ma nadpisywać metodę wirtualną z klasy bazowej. Pomaga wykryć błędy, np. literówkę w nazwie metody lub niezgodną listę parametrów.
Czy hermetyzacja jest tym samym co polimorfizm?
Nie. Hermetyzacja polega na ukrywaniu szczegółów działania klasy i kontrolowaniu dostępu do jej pól oraz metod. Polimorfizm dotyczy różnych zachowań metod zależnie od typu obiektu.
Na czym polega główna idea wzorca MVVM?
MVVM polega na rozdzieleniu interfejsu użytkownika od logiki aplikacji i danych. Dzięki temu kod jest czytelniejszy, łatwiejszy do testowania i modyfikacji.
Jaką rolę pełni Model we wzorcu MVVM?
Model reprezentuje dane i logikę biznesową aplikacji. Nie powinien odpowiadać za wygląd interfejsu użytkownika.
Jaką rolę pełni View we wzorcu MVVM?
View, czyli widok, odpowiada za prezentację interfejsu użytkownika. Zawiera kontrolki, układ ekranu i elementy wizualne.
Jaką rolę pełni ViewModel we wzorcu MVVM?
ViewModel pośredniczy między widokiem a modelem. Udostępnia dane i operacje, które widok może wykorzystać, np. przez data binding.
Dlaczego w MVVM nie powinno się mieszać widoku z logiką aplikacji?
Mieszanie widoku z logiką utrudnia rozwój, testowanie i poprawianie aplikacji. MVVM porządkuje kod przez przypisanie każdej warstwie osobnej odpowiedzialności.
Czym jest data binding w kontekście MVVM?
Data binding to mechanizm wiązania danych między widokiem a ViewModelem. Pozwala automatycznie aktualizować interfejs po zmianie danych lub odwrotnie.
W jakich technologiach często stosuje się MVVM?
MVVM często stosuje się w aplikacjach desktopowych i mobilnych, np. WPF, Xamarin, .NET MAUI czy frameworkach korzystających z XAML.