1. Proszę wymienić i opisać fazy typowego procesu rozwijania oprogramowania.
1. Budowa modelu przypadków użycia jest rezultatem identyfikacji i dokumentowania wymagań. W tym celu tworzy się diagram przypadków użycia, który jest odzwierciedleniem wymagań funkcjonalnych i zawiera aktorów systemu i skojarzone z nimi przypadki użycia. Ponadto zawiera on tekstowe opisy przypadków użycia i ich scenariusze.
2. Budowa modelu analitycznego opisującego elementy składowe systemu i ich współdziałanie. Model analityczny powinien pokazywać realizacje wszystkich przypadków użycia w postaci diagramów klas obejmujących klasy potrzebne do zrealizowania modelowanego działania.
3. Budowa modelu projektowego będącego podstawą do wygenerowania szkieletu kodu aplikacji. Model projektowy jest kompletnym modelem klas powstałym z rozszerzenia diagramu z modelu analitycznego o wszystkie atrybutami metody klas.
4. Implementacja rozpoczynająca się od wygenerowania szkieletu aplikacji. Kolejnym krokiem jest uzupełnienie plików z kodem źródłowym odpowiednimi treściami.
5. Uruchomienie wykonywane po zakończeniu etapu kodowania. Ma ono na celu doprowadzenie do podstawowej, poprawnej pracy. Wykonuje się je drogą debugowania.
6. Testowanie mające na celu ujawnienie wszelkich niesprawności działania aplikacji i niezgodności z wymaganiami.
2. Opisać znaczenie modelowania systemów informatycznych. Co to jest model niezależny od
platformy.
Program obiektowo zorganizowany może się składać prawie wyłącznie z deklaracji zmiennych obiektowych (instancji); w trakcie tych deklaracji wykonywane są wszystkie operacje inicjalizacji obiektów (definiowania ich stanu początkowego), tak by mogły one zacząć funkcjonować w otoczeniu innych obiektów. Dalsze funkcjonowanie każdego obiektu polega na odbiorze komunikatów wysyłanych przez inne obiekty i odpowiednim ich przetwarzaniu, w ramach którego możliwe jest również wysyłanie własnych komunikatów, czyli oddziaływanie na otoczenie. Taki model daje większe możliwości, co jest związane głównie z decentralizacją funkcjonalności (każda klasa odpowiada za swoją część operacji złożonego systemu) i nie jest potrzebny żaden nadrzędny mechanizm, który musiałby być odpowiednio bardziej złożony.
PIM = Platform Independent Model wg. OMG:
Reprezentacja funkcjonalności biznesowej i zachowania aplikacji niezakłócona szczegółami technologicznymi.
3. Proszę scharakteryzować język UML jako narzędzie do projektowania oprogramowania, wymienić podstawowe kategorie diagramów i krótko omówić wybrane diagramy i ich zastosowanie.
UML (Unified Modeling Language) jest językiem umożliwiającym graficzne projektowanie systemów, który pierwotnie był ukierunkowany na systemy informatyczne, ale nadaje się do użycia w innych dziedzinach i jest stosowany do modelowania biznesowego, finansowego, organizacyjnego, itd. Projekt systemu informatycznego w języku UML składa się z szeregu powiązanych ze sobą logicznie diagramów, czyli schematów zawierających symbole języka UML. UML definiuje kilkanaście rodzajów diagramów, które mają różne znaczenie i zastosowanie. Są to:
• Diagramy struktury - klas, obiektów, pakietów, struktur połączonych, wdrożeniowe (komponentów, rozlokowania);
• Diagramy dynamiki - przypadków użycia, interakcji (sekwencji, komunikacji, sterowania interakcją, harmonogramowania), czynności, maszyny stanowej;
• Inne diagramy - wymagań, interfejsu użytkownika.
4. Narysować diagram sekwencji, odpowiedni dla systemu ... (tu następuje opis systemu)
5. Narysować diagram klas, odpowiedni dla systemu ... (tu następuje opis systemu)
6. Narysować diagram maszyny stanowej, odpowiedni dla systemu ... (tu następuje opis
systemu)
7. Proszę omówić założenia obiektowego podejścia do programowania i ich implementację w
języku Java.
Abstrakcja
Każdy obiekt w systemie służy jako model abstrakcyjnego "wykonawcy", który może wykonywać pracę, opisywać i zmieniać swój stan oraz komunikować się z innymi obiektami w systemie, bez ujawniania, w jaki sposób zaimplementowano dane cechy. Procesy, funkcje lub metody mogą być również abstrahowane, a kiedy tak się dzieje, konieczne są rozmaite techniki rozszerzania abstrakcji.
Hermetyzacja
Czyli ukrywanie implementacji, enkapsulacja. Zapewnia, że obiekt nie może zmieniać stanu wewnętrznego innych obiektów w nieoczekiwany sposób. Tylko wewnętrzne metody obiektu są uprawnione do zmiany jego stanu. Każdy typ obiektu prezentuje innym obiektom swój interfejs, który określa dopuszczalne metody współpracy. Pewne języki osłabiają to założenie, dopuszczając pewien poziom bezpośredniego (kontrolowanego) dostępu do "wnętrzności" obiektu. Ograniczają w ten sposób poziom abstrakcji. Przykładowo, w niektórych kompilatorach języka C++ istnieje możliwość tymczasowego wyłączenia mechanizmu enkapsulacji; otwiera to dostęp do wszystkich pól i metod prywatnych, ułatwiając programistom pracę nad pośrednimi etapami tworzenia kodu i znajdowaniem błędów.
Polimorfizm
Referencje i kolekcje obiektów mogą dotyczyć obiektów różnego typu, a wywołanie metody dla referencji spowoduje zachowanie odpowiednie dla pełnego typu obiektu wywoływanego. Jeśli dzieje się to w czasie działania programu, to nazywa się to późnym wiązaniem lub wiązaniem dynamicznym. Niektóre języki udostępniają bardziej statyczne (w trakcie kompilacji) rozwiązania polimorfizmu
Dziedziczenie
Porządkuje i wspomaga polimorfizm i enkapsulację dzięki umożliwieniu definiowania i tworzenia specjalizowanych obiektów na podstawie bardziej ogólnych. Dla obiektów specjalizowanych nie trzeba redefiniować całej funkcjonalności, lecz tylko tę, której nie ma obiekt ogólniejszy. W typowym przypadku powstają grupy obiektów zwane klasami, oraz grupy klas zwane drzewami. Odzwierciedlają one wspólne cechy obiektów. źródło wikipedia
8. Omówić wzorzec Iterator, podając przeznaczenie, schemat w języku UML i ewentualnie
przykład kodu klas stanowiących implementację.
Jest on używany do zapewnienia sekwencyjnego dostępu do elementów kolekcji bez potrzeby ujawniania jej wewnętrznej struktury, która może być skomplikowana, a jej implementacja niedostępna.
Iterator zapewnia oddzielenie zadań dostępu do elementów od zadania
przechowywania danych elementów składających się na samą kolekcję. Wymagane jest
to, aby:
• nie obciążać kolekcji operacjami dostępu
• zapewnić możliwość dodawania nowych iteratorów, działających według specyficznych zasad.
Składniki wzorca:
• Aggregate - klasa abstrakcyjna, która definiuje interfejs dostępu do kolekcji i tworzenia jej iteratorów.
• Sequence - konkretna podklasa klasy Aggregate, która implementuje zdefiniowane tam interfejsy
• Iterator - klasa abstrakcyjna, która definiuje interfejs dostępu do elementów i przechodzenia ich
• ForwardIterator i ReverseIterator - konkretne klasy, które implementują interfejs
nadklasy Iterator i pamiętają bieżącą pozycje osiągniętą przy przechodzeniu.
Schemat wzorca:
Wzorzec Iterator - implementacja klas abstrakcyjnych
public abstract class Aggregate {
public abstract int Size();
/* e - dodawany obiekt */
public abstract void Add(Object e);
/* e - usuwany obiekt */
public abstract void Remove(Object e);
/* i - numer pobieranego obiektu */
public abstract Object get(int i);
}
public abstract class Iterator {
/* numer bieżącego elementu */
protected int current;
/* ustawienie na pierwszy element */
public abstract void First();
/* przejście do następnego elementu */
public abstract void Next();
/* test końca */
public abstract boolean IsDone();
/* zwrócenie bieżącego elementu */
public abstract Object CurrentItem();
}
9. Omówić wzorzec Obserwator, podając przeznaczenie, schemat w języku UML i
ewentualnie przykład kodu klas stanowiących implementację.
Jest on stosowany w przypadku występowania zależności jeden-do-wielu między obiektami. Jeśli monitorowany obiekt zmienia swój stan, wszystkie obiekty zależne od niego (klienci) są powiadamiane o zmianie. Inne nazwy wzorca: Dependents (zależni), Publisher-Subscriber.
Składniki wzorca:
• Subject - klasa abstrakcyjna monitorowanego obiektu, zna listę swoich
obserwatorów i zapewnia interfejs do manipulowania nimi
• ConcreteSubject - klasa konkretna monitorowanego obiektu, zna i udostępnia
swój stan, wysyła powiadomienia o zmianie do zarejestrowanych klientów
• Observer - klasa abstrakcyjna obserwatora (klienta), definiuje interfejs
powiadamiania o zmianie dla obserwatorów
• ConcreteObserver - klasa konkretna obserwatora (klienta), implementuje
interfejs powiadamiania o zmianie stanu monitorowanego obiektu, przechowuje
odwołanie do monitorowanego obiektu i jego stan.
Schemat wzorca:
Wzorzec Obserwator - implementacja klas abstrakcyjnych
import java.util.Vector;
public abstract class Subject {
private Vector observers = new Vector();
/* Dołączanie obserwatora */
public void Attach(Observer o){
observers.add(o);
}
/* Usuwanie obserwatora */
public Observer Detach(Observer o){
observers.remove(o);
return o;
}
/* Powiadamianie obserwatorów */
public int Notify(){
int cnt = 0;
for(int i = 0; i < observers.size(); i++) {
Observer o = (Observer)observers.get(i);
if(o != null)
o.Update(this);
cnt++;
}
return cnt;
}
}
10. Omówić metodykę Scrum.
metodyka Scrum stara się najlepiej zorganizować uczestników przedsięwzięcia programistycznego wokół nadrzędnego celu - dostarczenia systemu o jak największej wartości w możliwie krótkim czasie. Osiąga się to przez regularne udostępnianie nowej i działającej wersji systemu, ze zmianami wnoszącymi istotne przyrosty funkcjonalności, realizowanymi przez zespół w czasie przebiegu (sprint), będącego odpowiednikiem iteracji.
Metodyka Scrum definuje następujące cztery role:
• Właściciel Produktu (Product Owner) reprezentuje klientów i użytkowników systemu. Odpowiada on za określenie cech systemu w zakresie: funkcjonalności - określenie wszystkich wymagań dla systemu, wraz z potrzebnymi szczegółami i testami akceptacji, priorytetów - określenie kolejności implementacji wymagań, zgodnie z ich istotnością dla użytkowników końcowych (jest to materiał wejściowy do planowania kolejnych sprintów), celów - określenie warunków udostępniania kolejnych wersji systemu.Metodyka Scrum
• Mistrz Młyna (Scrum Master) kieruje zespołem programistów, wykonując zadania związane z codziennym przeglądem, planowaniem sprintów i ich przeglądem, przewidywaniem i eliminacją zagrożeń, a także czuwając nad ogólnym kierunkiem prac;
• Zespół Młyna (Scrum team) jest złożony z osób zaangażowanych do realizacji projektu w sposób kolektywny, bez wyróżnionych funkcji. Zespół musi być zdolny do zrealizowania wszystkich rodzajów czynności projektowych, od analizy i modelowania, przez implementację i testowanie, czyli musi być interdyscyplinarny;
• Partner (stakeholder) jest w pewien sposób zainteresowany produktem, choć nie jest członkiem zespołu realizującego, natomiast bierze udział w spotkaniach i przeglądach, tym samym może mieć wpływ na prace.
11. Omówić cel i metody testowania oprogramowania, rodzaje testów.
Testowanie oprogramowania jest wykonywaniem jego kodu dla pewnych kombinacji danych wejściowych i stanów w celu wykrycia błędów. Jest to istotny etap każdej z metodyk rozwijania oprogramowania, ponieważ żadna nie zapewnia całkowitej wolności od błędów. Wg Binder R. testowanie oznacza działanie implementacji na danych wejściowych specjalnie dobranych, by ujawnić wszystkie błędy, i późniejszej ocenie odpowiedzi systemu.
Rodzaje metod testowania:
testowanie defektów - polegające na znajdowaniu różnic między funkcjonowaniem programu w trakcie jego uruchomienia i jego specyfikacją. Różnice te wynikają z błędów i defektów programu, które z założenia zawsze występują. Dla ich ujawnienia projektuje się odpowiednie zestawy testów. W związku z tym uważa się, że pomyślny wynik tego rodzaju testowania jest osiągnięty, gdy defekty zostaną ujawnione;
• testowanie zgodności (conformance-directed) - polega na wykazaniu dostosowania oprogramowania do specyfikacji. Jest ono bardziej charakterystyczne dla testów końcowych, wykonywanych dla całego systemu, a także dla testowania u odbiorcy;
• testowanie statystyczne - polegające na wykonywaniu programu i rejestrowaniu w trakcie działania danych charakteryzujących jego wydajność i stabilność, w różnych warunkach (normalne, duże i nadmierne obciążenie, normalny i niski stan zasobów - np. pamięć, połączenia sieciowe o małej przepustowości, wydajność serwera, itp.). Dane testowe powinny odzwierciedlać rzeczywiste lub spodziewane rozkłady danych wejściowych i ich częstotliwość.