Inżynieria
oprogramowania
Wykład 1 – zagadnienia
wstępne
Prezentacja częściowo oparta na prezentacji przygotowanej przez Prof. J.E. Sienkiewicza
(opartej z kolei na podręczniku Iana Sommerville’a Inżynieria oprogramowania, WNT 2003)
Literatura
• Ian Sommerville, Inżynieria oprogramowania, WNT
2003
• J. Górski (red.), Inżynieria oprogramowania w
projekcie informatycznym, Mikom 2000
• H. Dick, M. Joe, Podstawy techniczne inżynierii
oprogramowania, WNT, 2003
• L. Dean, W. Don, Zarządzanie wymaganiami, WNT
2003
• M. Śmiałek, Zrozumieć UML 2.0. Metody modelowania
obiektowego, Helion 2005
• R. Patton, Testowanie oprogramowania, Mikom, 2002
• R.V. Binder, Testowanie systemów obiektowych, WNT,
2003
Inżynieria – ogólnie
• działalność ludzka polegająca na
projektowaniu, konstrukcji,
modyfikowaniu i konserwacji
sztucznych systemów
• oparta o wiedzę naukową i techniczną
• inżynier wykorzystuje swoją wiedzę,
wyobraźnię, doświadczenie,
umiejętność oceny i rozumowanie
Inżynieria oprogramowania
• zajmuje się teorią, metodami i narzędziami
związanymi z wytwarzaniem oprogramowania
(oprogramowanie – programy komputerowe, cała związana z
nimi dokumentacja i dane konfiguracyjne)
• obejmuje wszelkie aspekty produkcji
oprogramowania: analizę i określenie
wymagań, projektowanie, wdrożenie,
ewolucję gotowego produktu
• praktyczna strona informatyki
• narodziny: lata 60-te XX wieku
• młoda dyscyplina, ciągle się rozwijająca
Znaczenie inżynierii
oprogramowania
• gospodarki wszystkich rozwiniętych krajów
zależą od oprogramowania
• coraz więcej i więcej systemów wymaga
niezawodnego oprogramowania
• obecnie wytwarzanie oprogramowania jest
poważną gałęzią gospodarki narodowej
każdego rozwiniętego kraju
• systematyzuje i porządkuje proces
wytwarzania oprogramowania, ułatwiając
tworzenie oprogramowania wysokiej jakości
Bieżące trendy
w inżynierii oprogramowania
• próby sprostania wymagań stawianych
oprogramowaniu poprzez wielokrotne użycie kodu
• zunifikowany opis zachowania się obiektów w
różnych, często nietypowych sytuacjach
• „okiełznanie” programowania ekstremalnego i
błyskawicznego (problem sprostania wymogowi
dostarczania gotowego oprogramowania w
skróconym czasie bez utraty jakości)
• konserwacja systemów spadkowych
• budowa systemów heterogenicznych
• pielęgnacja i modyfikacja działających dużych
systemów, pełniących poważne funkcje gospodarcze
Inżynieria oprogramowania
–
FAQ
• Jaka jest różnica pomiędzy inżynierią
oprogramowania a informatyką?
Informatyka obejmuje teorie i podstawowe zasady działania
komputerów, a inżynieria oprogramowania obejmuje
praktyczne problemy związane z tworzeniem oprogramowania
Inżynier oprogramowania powinien znać teorie informatyczne, z
drugiej strony nie zawsze przystają one do rzeczywistości
• Co to jest CASE
(Computer-Aided Software Engineering)?
CASE obejmuje rożne programy wykorzystywane do
wspomagania czynności procesu tworzenia oprogramowania
(np. edytory notacji, generatory kodów)
Inżynieria oprogramowania – FAQ
(c.d.)
• Na czym polegają metody inżynierii
oprogramowania?
• Polegają na uporządkowanym podejściu do tworzenia
oprogramowania, poprzez:
- opisy modeli systemu (np. modele obiektów, modele przepływu)
- reguły (ograniczenia, którym podlegają modele systemu)
- zalecenia (heurystyki określające dobre zwyczaje projektantów)
- poradnictwo (opisy czynności, które należy wykonać)
• Co to jest UML (Unified Modeling Language)?
• Jest to formalny język, służący do opisu świata obiektów w analizie
obiektowej oraz programowaniu obiektowym; wykorzystuje
reprezentację graficzną – symbole wiązane ze sobą na diagramach
Inżynieria oprogramowania – FAQ
(c.d.)
• Jakie właściwości ma dobre
oprogramowanie?
• Konkretny zbiór właściwości zależy od zastosowania,
niemniej można podąć ogólny zbiór pożądanych właściwości:
- zdolność do pielęgnacji: zdolność do ewolucji, zgodnie z
potrzebami klientów
- niezawodność: nie powinno powodować fizycznych lub
ekonomicznych katastrof w przypadku awarii
- efektywność: nie powinno marnotrawić zasobów systemu
takich jak pamięć czy czas procesora
- użyteczność: powinno być użyteczne, bez zbędnego wysiłku
ze strony użytkownika
Fazy procesu produkcji
oprogramowania
• idea
• specyfikacja
• projektowanie
• implementacja
• integracja
• testowanie
• wdrożenie
• ewolucja
semestr VI
(przedmiot: Inżynieria oprogramowania)
semestr VII
(przedmiot:
oprogramowanie aplikacyjne / projekt
grupowy)
Modelowanie procesu tworzenia
oprogramowania
• Modele ogólne (paradygmaty) tworzenia
oprogramowania (z natury uproszczone)
– model kaskadowy
– model spiralny
– model przyrostowy i tworzenie ewolucyjne
– model prototypowy
– składanie systemu z komponentów ponownego
użycia
• Modele szczegółowe
– model przepływu prac
– model przepływu danych (lub model czynności)
Inżynier oprogramowania
(software engineer)
• zajęcie wpisane na oficjalną listę zawodów
w roku 1990 (za granicą)
• w Polsce – brak oficjalnego rozróżnienia w
klasyfikacji zawodów (
Inżynierowie i pokrewni
gdzie indziej niesklasyfikowani
)
• według Money Magazine i Salary.com –
zawód uznany w 2006 roku za najlepszy w
Stanach Zjednoczonych, pod względem
możliwości rozwoju, wysokości pensji,
poziomu stresu, elastyczności godzin
pracy i środowiska pracy
Odpowiedzialność etyczna
i zawodowa
• Inżynierowie oprogramowania ponoszą
znacznie większą odpowiedzialność niż tylko
wynikająca z ich technicznych umiejętności
• Powinni postępować etycznie i moralnie,
jeśli chcą być uważani za profesjonalistów
• Powinni pamiętać, że zachowywać się
etycznie, to więcej, niż tylko przestrzegać
obowiązujące prawo
• Powinni przestrzegać Kodeksów etycznych i
zawodowych
Zasady zawodowej
odpowiedzialności
• Zachowywanie tajemnicy
– Inżynierowie powinni zawsze dochowywać tajemnic powierzonych
przez pracodawców i klientów, niezależnie od tego czy podpisano
formalną umowę o ochronie tajemnicy
• Kompetencje
– Inżynierowie nie powinni zawyżać poziomu swoich kompetencji. Nie
powinni świadomie przyjmować prac, które przekraczają ich
możliwości
• Prawo własności intelektualnej
– Inżynierowie powinni znać miejscowe prawo regulujące korzystanie z
własności intelektualnej. Powinni szczególnie dbać o poszanowanie
intelektualnej własności swoich pracodawców i klientów
• Niewłaściwe użycie komputera
– Inżynierowie oprogramowania nie powinni używać swoich
umiejętności do niewłaściwego używania cudzych komputerów
Dylematy etyczne
• Zasadnicza niezgodność z z poglądami
przełożonego
• Nieetyczne postępowanie pracodawcy,
np. przy fałszowaniu dzienników kontroli
przy testowaniu krytycznego systemu
• Nieetyczne lub kontrowersyjne
wymagania klienta na zamówione
oprogramowanie
• Uczestnictwo w tworzeniu systemów
wojskowych i nuklearnych
Inżynieria
oprogramowania
Wykład 2 – inżynieria wymagań:
wymagania stawiane
oprogramowaniu
Prezentacja częściowo oparta na prezentacji przygotowanej przez Prof. J.E. Sienkiewicza
(opartej z kolei na podręczniku Iana Sommerville’a Inżynieria oprogramowania, WNT 2003)
Inżynieria wymagań
• proces szukania, analizowania,
dokumentowania, sprawdzania i
zatwierdzania usług i ograniczeń
projektowanego systemu
• innymi słowy – proces ustalenia, co system
powinien robić, przy uwzględnieniu
istniejących ograniczeń
• opisy usług i ograniczeń są wymaganiami
stawianymi systemowi
Problemy związane
z produkcją oprogramowania
To, co klient zamówił
To, co opisywał projekt
To, co wykonali programiści
Po uruchomieniu i wdrożeniu
To, za co klient zapłacił
To, czego klient
naprawdę potrzebował
Rodzaje specyfikacji wymagań
• Wymagania użytkownika
– Wyrażone w języku naturalnym oczekiwane usługi
systemu, oraz ograniczenia, w których system ma
działać.
• Wymagania systemowe
– Szczegółowo ustalają usługi systemu i
ograniczenia. Dokumentacja wymagań
systemowych powinna być bardzo precyzyjna.
– Mogą być podstawą kontraktu na implementację
systemu, powinny być zatem pełną i niesprzeczną
specyfikacją całego systemu.
– Stanowią punkt wyjścia do projektowania systemu.
Przykłady specyfikacji
Wymaganie użytkownika
1. Oprogramowanie musi zapewniać mechanizmy reprezentowania i
dostępu do plików zewnętrznych tworzonych przez inne narzędzia.
Wymaganie systemowe
1.1 Użytkownik powinien mieć możliwość definiowania typów plików zewnętrznych.
1.2 Każdy typ pliku zewnętrznego może mieć przypisane narzędzie do obróbki takich plików.
1.3 Każdy typ pliku zewnętrznego może być przedstawiony w postaci charakterystycznej
ikony na ekranie użytkownika.
1.4 Należy zapewnić udogodnienia do definiowania przez użytkownika ikon odpowiadających
typom plików zewnętrznych.
1.5 Gdy użytkownik wybierze ikonę powiązaną z plikiem zewnętrznym, następuje
zastosowanie do tego pliku narzędzia skojarzonego z typem tego pliku.
Czytelnicy rodzajów specyfikacji
Wymagania
użytkownika
Wymagania
systemowe
Menedżerowie klienta
Użytkownicy systemu
Inżynierowie klienta
Menedżerowie zleceniobiorcy
Projektanci systemu
Użytkownicy systemu
Inżynierowie klienta
Projektanci systemu
Twórcy oprogramowania
Podział wymagań
stawianych oprogramowaniu
• Wymagania funkcjonalne
– Stwierdzają, jakie usługi ma oferować system, jak ma
reagować na określone dane wejściowe oraz jak ma się
zachowywać w określonych sytuacjach. W niektórych
wypadkach wymagania funkcjonalne określają, czego
system nie powinien robić.
• Wymagania niefunkcjonalne (pozafunkcjonalne)
– Określają ograniczenia usług i funkcji systemu. Obejmują
ograniczenia czasowe, ograniczenia dotyczące procesu
tworzenia, standardy itd.
• Wymagania dziedzinowe
– Pochodzą z dziedziny zastosowania systemu
odzwierciedlają jej charakterystykę. Mogą być zarówno
funkcjonalne jak i niefunkcjonalne.
Wymagania funkcjonalne
• Odpowiadają na pytanie: jakie funkcje system
ma udostępniać użytkownikom?
• Wymagania funkcjonalne opisują
funkcjonalność lub usługi, które system
powinien oferować.
• Zależą od rodzaju tworzonego oprogramowania,
spodziewanych jego użytkowników oraz rodzaju
wytwarzanego systemu.
• Gdy mają postać wymagań użytkownika, ich
opis jest zwykle bardziej ogólny, natomiast
wymagania funkcjonalne systemowe
szczegółowo definiują funkcje systemu, jego
wejścia, wyjścia, wyjątki itd.
Przykłady wymagań
funkcjonalnych
• Użytkownik powinien móc przeszukać
zbiór wszystkich baz danych lub wybrać
tylko ich podzbiór.
• System
powinien
udostępniać
użytkownikom odpowiednie narzędzia do
przeglądania dokumentów z magazynu.
• Każde zamówienie powinno być oznaczone
unikatowym identyfikatorem (ORDE_ID),
który będzie można łatwo skopiować.
Problemy wynikające z braku
ścisłości przy definiowaniu
wymagań
• Natura programisty każe mu interpretować
niejednoznaczne wymagania tak, aby uprościć
implementację. Zwykle nie jest to jednak to, czego
chciał klient. W takim przypadku należy opracować
nowe wymagania i dokonać zmian w systemie –
opóźnia to dostarczenie systemu i podnosi koszty.
• Rozważmy drugie na tej liście wymaganie stawiane
systemowi biblioteki, które mówi o „odpowiednich
narzędziach do oglądania”. Celem tego wymagania
jest zapewnienie narzędzia do oglądania wszystkich
tych formatów. Programista działający pod presją
czasu może udostępnić po prostu narzędzie do
oglądania plików tekstowych i ogłosić spełnienie
wymagania.
Kompletność i spójność
specyfikacji wymagań
funkcjonalnych
• Specyfikacja wymagań funkcjonalnych
stawianych systemowi powinna być kompletna i
spójna.
• Kompletność oznacza, że wszystkie potrzebne
użytkownikowi usługi powinny być zdefiniowane.
• Spójność oznacza, że wymagania nie powinny
mieć sprzecznych definicji.
• W praktyce w wypadku wielkich złożonych
systemów nie da się osiągnąć kompletności i
spójności. Przyczynami tego są swoista złożoność
tych systemów oraz fakt, że różne punkty
widzenia są związane ze sprzecznymi potrzebami.
Wymagania niefunkcjonalne
• Odpowiadają na pytanie: jak system ma działać?
• Mogą definiować ograniczenia systemu, takie jak
możliwości urządzeń wejścia-wyjścia lub dostępne
reprezentacje danych.
• Wymagania niefunkcjonalne wynikają z potrzeb
użytkownika, ograniczeń budżetowych, strategii
firmy, konieczności współpracy z innymi
systemami sprzętu lub oprogramowania,
czynników zewnętrznych.
• Wymagania stawiane procesowi tworzenia
oprogramowania – specyfikacja standardów
jakości, których należy użyć, stwierdzenie, że
projekt należy opracować za pomocą konkretnego
zbioru narzędzi CASE.
Klasyfikacja
wymagań niefunkcjonalnych
• Wymagania produktowe
– Określają zachowanie produktu. Przykładami są
wymagania efektywnościowe dotyczące szybkości
działania systemu i jego zapotrzebowania na pamięć,
wymagania niezawodności.
• Wymagania organizacyjne
– Wynikają ze strategii i procedur w firmie klienta i w
firmie wytwórcy.
• Wymagania zewnętrzne
– Ta szeroka kategoria mieści wszystkie wymagania
wynikające z czynników zewnętrznych. Obejmują m.in.
wymagania współpracy, które definiują interakcje
systemu z systemami innych firm i wymagania prawne.
Przykłady
wymagań niefunkcjonalnych
• Wymaganie produktowe
– 4.C.8 Wszelka niezbędna komunikacja między
projektowanym środowiskiem wspomagającym
programowanie w języku ADA a użytkownikiem,
powinna dać się wyrazić za pomocą standardowego
zestawu symboli języka ADA.
• Wymaganie organizacyjne
– 9.3.2 Proces tworzenia systemu i końcowe dokumenty
powinny być zgodne z procesem i produktami
zdefiniowanymi w standardzie XYZCo-SP-STAN-95.
• Wymaganie zewnętrzne
– 7.6.5 System nie powinien ujawniać operatorom żadnych
danych osobowych klientów oprócz nazwisk i numerów
identyfikacyjnych
Podział szczegółowy
wymagań niefunkcjonalnych
Wymagania
przenośności
Wymagania
niezawodności
Wymagania
sprawnościowe
Wymagania
etyczne
Wymagania
zewnętrzne
Wymagania
współpracy
Wymagania
produktowe
Wymagania
organizacyjne
Wymagania
efektywnościowe
Wymagania
użyteczności
Wymagania
dostawy
Wymagania
implementacyjne
Wymagania
standardów
Wymagania
prawne
Wymagania
pamięciowe
Wymagania
ochrony
prywatności
Wymagania
zabezpieczeń
Problemy związane
z wymaganiami niefunkcjonalnymi
• Trudności z weryfikacją niektórych
wymagań.
• Mogą one być zapisywane w sposób
odzwierciedlający ogólne dążenia klienta,
takie jak łatwość użycia, zdolność do
naprawy awarii i szybka reakcja na
działania użytkownika. To jednak zostawia
bardzo duży margines do interpretacji i
stwarza potencjalną możliwość konfliktów
z klientem już po dostarczeniu systemu.
Rozwiązywanie problemów
związanych
z wymaganiami niefunkcjonalnymi
• Wymaganie nieweryfikowalne
– System powinien być łatwy w użyciu dla
doświadczonych kontrolerów, a sposób jego
organizacji powinien minimalizować liczbę
błędów użytkownika.
• Poprawione, weryfikowalne wymaganie
– Doświadczeni kontrolerzy powinni móc używać
wszystkich funkcji systemu po szkoleniu
trwającym dwie godziny. Po szkoleniu, średnia
liczba błędów robionych przez użytkowników
nie powinna przekroczyć dwóch dziennie.
Miary do specyfikowania
wymagań niefunkcjonalnych
Właściwość
Miara
Szybkość
Rozmi
ar
Łatwość użycia
Niezawodność
Solidność
Przenośn
ość
Liczba przetworzonych transakcji na sekundę
Czas reakcji na zdarzenie wywołane przez użytkownika
Czas odświeżenia ekranu
Kilobajty
Liczba układów pamięci
RAM
Czas szkolenia
Liczba okien
pomocy
Średni czas bez awarii
Częstość błędów
Czas uruchomienia systemu po awarii
Procent zdarzeń powodujących awarie
Prawdopodobieństwo zniszczenia danych
podczas awarii
Procent kodu zależnego od platformy
Liczba docelowych systemów
Trudności związane
z pozyskiwaniem wymagań
funkcjonalnych i niefunkcjonalnych
• Klienci mogą nie wiedzieć, czego naprawdę
potrzebują.
• Z drugiej strony, jeżeli podane wymagania zawierają
zbyt wiele informacji, ograniczają wybór
innowacyjnych rozwiązań oraz utrudniają
zrozumienie wymagań.
• Klienci mogą nie być w stanie przetłumaczyć swoich
celów na wymagania ilościowe.
• Wymagania niefunkcjonalne są często sprzeczne lub
powiązane z innymi wymaganiami funkcjonalnymi.
• W zasadzie należy odróżnić wymagania funkcjonalne
i niefunkcjonalne w dokumentacji wymagań. W
praktyce jest to jednak czasami dość trudne.
Wymagania dziedzinowe
• Wynikają bardziej z dziedziny zastosowania
systemu niż z konkretnych potrzeb
użytkowników.
• Mogą być nowymi wymaganiami
funkcjonalnymi, ograniczać istniejące
wymagania funkcjonalne albo np. ustalać
sposób wykonywania konkretnych obliczeń.
• Wymagania dziedzinowe są istotne, ponieważ
odzwierciedlają podstawy dziedziny
zastosowania. Jeśli nie są spełnione, to
system może nie działać w sposób
zadowalający lub np. nie uzyskać
wymaganych atestów.
Przykład: czytelnia norm
1.
Wszystkie
bazy
danych
powinny
być
dostępne
przez
jednolity
interfejs
użytkownika, którego podstawą jest standard
Z39.50.
2.
Ze względu na ochronę praw autorskich
system powinien udostępniać normy jedynie
w formie przeznaczonej do odczytu na
ekranie monitora, bez możliwości pobrania
pliku ani jego wydruku. Jedynie po uzyskaniu
potwierdzenia dokonania wpłaty, system
powinien umożliwić wydruk dokumentu lub
jego pobranie.
Przykład: system sterowania
ruchem pociągów
• Tempo zmniejszania prędkości pociągu
jest wyznaczane następująco:
D
pociągu
= D
sterowania
+ D
nachylenia
gdzie D
nachylenia
wynosi
9,81m/s
2
* wyrównane nachylenie / alfa,
gdzie z kolei 9,81m/s
2
/alfa są znane dla
różnych typów pociągów.
Problemy
z wymaganiami dziedzinowymi
• Są one zwykle wyrażone za pomocą języka
specyficznego dla dziedziny zastosowania,
co sprawia, że inżynierowie
oprogramowania często ich nie rozumieją.
• Eksperci z danych dziedzin często mogli
pominąć jakąś informację, ponieważ po
prostu jest dla nich oczywista. Może nie
być jednak oczywista dla twórców systemu,
którzy mogą to wymaganie
zaimplementować w sposób nieprawidłowy.
Zapis wymagań
• Wymagania użytkownika:
zapis powinien być
zrozumiały dla udziałowców systemu, którzy nie
mają szczegółowej wiedzy technicznej. Można je
zapisywać w języku naturalnym, posiłkując się
prostymi i intuicyjnymi diagramami (np. UML: use
cases – przypadki użycia).
• Wymagania systemowe:
strukturalny język
naturalny (formularze i szablony), notacja
graficzna (diagramy UML), języki opisu projektu
(Program Description Language - PDL),
specyfikacje matematyczne.
Problemy z językiem naturalnym
• Brak jasności
– Czasem trudno jest wyrażać się w języku
naturalnym precyzyjnie i jednoznacznie, bez
czynienia dokumentów przegadanymi i
nieczytelnymi.
• Sprzeczność wymagań
– Trudno jest jasno rozgraniczać wymagania
funkcjonalne, wymagania niefunkcjonalne,
cele systemu i elementy projektu.
• Łączenie wymagań
– Kilka różnych wymagań może być zapisanych
razem jako jedno wymaganie.
Rady do zapisywania wymagań
• Opracuj standardowy format i spraw, aby wszystkie
definicje wymagań były z nim zgodne.
• Konsekwentnie używaj pojęć językowych. W
szczególności rozróżnij wymagania obowiązkowe od
wskazanych.
• Stosuj wyróżnienia (wytłuszczenia, kursywy) do
zaznaczania głównych części wymagania.
• Unikaj, jeżeli tylko się da, żargonu komputerowego.
• Zapisuj uzasadnienia związane z wymaganiami.
Pomagają one wytwórcom i konserwatorom
systemu w zrozumieniu, dlaczego takie wymaganie
się pojawiło, i w ocenie wpływu zmiany tego
wymagania.
Zapis tekstowy wymagań
użytkownika - przykład
3.5.1 Dodawanie węzłów do projektu
3.5.1.1 Edytor będzie udostępniał użytkownikom udogodnienia
do dodawania do swoich projektów węzłów określonego
typu
3.5.1.2 Sekwencja czynności, które prowadzą do dodania węzła,
powinna być następująca:
1. Użytkownik powinien wybrać typ węzła, jaki należy dodać
2. Użytkownik powinien przesunąć wskaźnik do przybliżonego
miejsca nowego węzła na diagramie i zlecić dodanie symbolu
węzła w tym punkcie
3. Użytkownik powinien następnie przeciągnąć węzeł do jego
ostatecznego położenia
Uzasadnienie: Użytkownik jest najwłaściwszą osobą do
decydowania o położeniu węzłów na diagramie. Takie podejście
daje użytkownikowi całkowite panowanie nad wyborem typu węzła
i jego umiejscowieniem.
Diagram przypadków użycia
(use cases) - przykład
Zapis wymagań systemowych –
formatka karty wymagania
Zapis wymagań systemowych –
wypełniona karta wymagania
Dokumentowanie wymagań
•
Dokumentacja wymagań stawianych
oprogramowaniu (nazywana też specyfikacją
wymagań stawianych oprogramowaniu lub
Software Requirements Specification, SRS) jest
oficjalną deklaracją tego, co jest wymagane od
wytwórców systemu.
•
Powinna zawierać zarówno wymagania
użytkownika stawiane systemowi, jak i
szczegółową specyfikacje wymagań systemowych.
•
Nie jest projektem – powinna opisywać co system
ma robić, a nie jak to robić. Powinna określać
zachowanie systemu jedynie z zewnątrz.
•
Powinno być łatwo ją zmieniać.
Użytkownicy
dokumentacji wymagań
Klienci systemu
Menedżerowie
Projektanci systemów
Testerzy systemów
Inżynierowie
konserwacji systemów
Określają wymagania i czytają je, aby sprawdzić,
czy odpowiadają ich potrzebom.
Określają także zmiany wymagań.
Używają dokumentacji wymagań
do planowania oferty budowy systemu
i do planowania procesu jego tworzenia
Używają wymagań, aby zrozumieć,
jaki system ma być zbudowany
Używają wymagań, aby opracować
i przeprowadzić testy zatwierdzające system
Używają wymagań jako pomocy
w zrozumieniu systemu
i związków między jego częściami
Inżynieria
oprogramowania
Wykład 3 – inżynieria wymagań:
proces inżynierii wymagań
Prezentacja częściowo oparta na prezentacji przygotowanej przez Prof. J.E. Sienkiewicza
(opartej z kolei na podręczniku Iana Sommerville’a Inżynieria oprogramowania, WNT 2003)
Proces inżynierii wymagań
• Służy do określania, analizowania i zatwierdzania
wymagań stawianych systemowi
• Obejmuje wszystkie czynności niezbędne do
opracowania i aktualizacji dokumentacji wymagań
systemowych.
• Ogólne czynności w procesie inżynierii wymagań:
– studium wykonalności
– określenie i analizowanie wymagań
– specyfikowanie i dokumentowanie wymagań
– zatwierdzanie wymagań
Proces inżynierii wymagań
Studium
wykonalności
Określanie
i analizowanie
wymagań
Specyfikowanie
wymagań
Zatwierdzanie
wymagań
Raport
o wykonalności
Dokumentacja
wymagań
Studium wykonalności
• Wynikiem tego studium powinien być raport
wykonalności, który zaleca albo nie zaleca
kontynuacji procesu inżynierii wymagań i tworzenia
systemu.
• Studium wykonalności to krótkie, skumulowane
opracowanie, w którym staramy się odpowiedzieć
na kilka pytań:
– Czy system przyczyni się do realizacji ogólnych
celów przedsiębiorstwa?
– Czy system może być zaimplementowany z
użyciem dostępnych technologii, w ramach
ustalonego budżetu i ograniczeń czasowych?
– Czy system może być zintegrowany z
istniejącymi systemami, które już zainstalowano?
Raport wykonalności
• Kilka szczegółowych pytań do tworzenia raportu:
– Jak firma poradziłaby sobie, jeśli system nie
byłby zaimplementowany?
– Jakie problemy występują w obecnie przyjętych
procesach i jak nowy system ma pomóc w ich
eliminacji?
– Jaki byłby bezpośredni wkład systemu w
osiąganie celów gospodarczych?
– Czy można przekazywać informacje do i z
innych systemów przedsiębiorstwa?
– Czy system wymaga technologii, których
wcześniej w firmie nie stosowano?
– Co system musi wspomagać, a czego nie musi?
Określanie i analizowanie
wymagań
• Po wstępnych studiach wykonalności następna fazą
inżynierii wymagań jest określanie i analizowanie
wymagań.
• W trakcie tej czynności techniczni budowniczowie
oprogramowania pracują z klientem i użytkownikami
systemu nad badaniem dziedziny zastosowania i
usług, które system ma oferować, pożądanej
efektywności, ograniczeniach sprzętowych itd.
• W określaniu i analizowaniu wymagań mogą wziąć
udział osoby z różnych stanowisk w firmie. Pojęcie
udziałowiec (uczestnik) odnosi się do każdego, kto
powinien mieć pewien pośredni lub bezpośredni
wpływ na wymagania systemowe.
Problemy przy analizie
wymagań
• Udziałowcy często nie wiedzą, czego tak
naprawdę oczekują od nowo tworzonego systemu
komputerowego.
• Udziałowcy systemu wyrażają wymagania za
pomocą własnych pojęć.
• Różni udziałowcy mogą stawiać różne
wymagania, często sprzeczne ze sobą.
• Czynniki polityczne mogą mieć wpływ na system.
• Środowisko ekonomiczne i gospodarcze, w którym
prowadzi się analizę, jest dynamiczne.
Nieuchronnie zmienia się w trakcie procesu
analizy.
Proces określania i
analizowania wymagań
Początek
procesu
Rozpoznanie
dziedziny
Zbieranie
wymagań
Klasyfikacja
Usuwanie
sprzeczności
Nadawanie
priorytetów
Sprawdzenie
wymagań
Specyfikacja
wymagań
Dokumentacja
wymagań
Określanie wymagań oparte na
punktach widzenia
• Zwykle systemy maja kilka różnych grup
użytkowników. Należy przyjrzeć się systemowi z ich
punktu widzenia.
Klasyfikacja punktów widzenia
• Ze względu na źródło lub przeznaczenie danych
– Punkt widzenia powiązany z użytkowaniem lub
produkcją danych. W tym wypadku analiza polega
na rozpoznawaniu wszystkich takich punktów
widzenia, danych, które są produkowane lub
użytkowane oraz ich przetwarzaniu.
• Ze względu na usługi zewnętrzne
– W tym wypadku punkty widzenia są zewnętrzne
wobec systemu; osoby mające ten punkt
widzenia korzystają z usług systemu.
Model zewnętrznych punktów
widzenia
• Reprezentanci tych punktów widzenia współpracują z
systemem przez otrzymywanie usług od systemu
oraz przekazywanie do systemu danych i sygnałów
sterujących.
• Punkty widzenia są zewnętrzne wobec systemu,
stanowią zatem naturalny sposób strukturalizacji
procesu określania wymagań.
• Dość łatwo jest stwierdzić, czy coś jest punktem
widzenia, czy nie. Reprezentanci punktów widzenia
muszą bowiem w pewien sposób oddziaływać na
system.
• Punkty widzenia i usługi stanowią dobry sposób
strukturalizacji wymagań niefunkcjonalnych. Każda
usługa może być powiązana z wymaganiami
niefunkcjonalnymi.
Przykład – system
bankomatowy
• Służy do wykonywania operacji
bankomatowych przy użyciu karty
bankomatowej z przypisanym kodem PIN
• W uproszczonej wersji służy klientom
macierzystego banku, oferując im bardziej
skomplikowane usługi, oraz klientom innym
banków w ograniczonym zakresie
• Usługi zaawansowane obejmują np.: wypłatę i
wpłatę środków, przekazywanie komunikatów
do banku, wyświetlanie informacji (np. o
saldzie konta lub wykonanych transakcjach).
Udziałowcy systemu
bankomatowego
• Klienci banku
• Klienci innych banków
• Dyrektorzy oddziałów banków
• Pracownicy obsługi klienta w oddziałach
• Administratorzy baz danych
• Osoby odpowiedzialne za bezpieczeństwo
w banku
• Dział marketingu banku
• Inżynierowie pielęgnacji sprzętu i
oprogramowania
Burza mózgów w trakcie
identyfikacji punktów widzenia
Pytanie
o saldo
Menedżer
Odczyt
transakcji
Zasoby
maszyny
Interfejs
użytkownika
Właściciel
konta
Zdalna
diagnostyka
Karta
skradziona
Niezawodność
Informacje
o koncie
Koszt systemu
Baza danych
klientów
Wypłata
gotówki
Aktualizacja
konta
Zamówienie
wyciągu
Obcy klient
Dziennik
komunikatów
Przelew
środków
Zdalna
aktualizacja
oprogramowania
Zamówienie
czeków
Zwrot karty
Dziennik
transakcji
Drukarka
Rozmiar
oprogramowania
Zatrzymanie
karty
Nieuprawniony
użytkownik
Kasa
banku
Weryfikacja
karty
Przekazywanie
komunikatów
Zabezpieczenia
Pielęgnacja
oprogramowania
Przypisanie usług
do punktów widzenia
WŁAŚCICIEL
KONTA
OBCY
KLIENT
KASA
BANKU
Lista usług
Lista usług
Lista usług
Wypłata gotówki
Pytania o saldo
Zamówienie
czeków
Wysyłanie
komunikatu
Lista transakcji
Zamówienie
wyciągu
Przelew środków
Wypłata gotówki
Pytania o saldo
Diagnostyka
Dodanie gotówki
Dodanie papieru
Wysłanie
komunikatu
Dane wejściowe i dane
sterujące związane z punktami
widzenia
WŁAŚCICIEL
KONTA
Dane sterujące Dane
wejściowe
Rozpocznij transakcję Informacje z karty
Anuluj transakcję PIN
Zakończ transakcję Żądana kwota
Wybór usługi Komunikat
Hierarchia punktów widzenia
Usługi
Usługi
Inżynier
Menedżer
Kasa
Klient
obcy
Właściciel
konta
Klient
Personel banku
Wszystkie PW
Pytanie o saldo
Wypłata
gotówki
Zamówienie czeków
Wysłanie komunikatu
Lista transakcji
Zamówienie wyciągu
Przelew środków
Opis punktu widzenia klienta
i opis usługi wypłaty gotówki
Odnośnik: Klient
Atrybuty: Numer konta
PIN
Zdarzenia: Zacznij transakcję
Wybór usługi
Anuluj transakcję
Zakończ transakcję
Usługi: Wypłata gotówki
Pytanie o saldo
Podrzędne PW: Właściciel konta
Odnośnik: Wypłata gotówki
Uzasadnienie: Celem jest poprawienie
obsługi
klienta, zmniejszenie
obciążenia
okienek kasowych itp.
Specyfikacja: Użytkownicy wybierają
usługę
przez naciśnięcie
przycisku
„wypłata gotówki”.
Następnie
wprowadzają żądaną
kwotę.
Potwierdza się ją i jeśli
na koncie
są odpowiednie środki
następuje
wypłata
PW: Klient
Wymagania
niefunkcjonalne: Wypłacić gotówkę
najpóźniej
po 1 minucie od
potwierdzenia
kwoty
Scenariusze
• Scenariusze są szczególnie użyteczne przy
uszczegóławianiu przeglądowego opisu
wymagań. Są opisami przykładowych sesji
interakcyjnych. Każdy scenariusz obejmuje
jedną lub najwyżej kilka możliwych interakcji.
• Ludzie zwykle wolą przykłady wzięte z życia
niż abstrakcyjne opisy
• Inżynierowie wymagań mogą skorzystać z
informacji zebranych w trakcie dyskusji do
formułowania rzeczywistych wymagań
systemowych.
Cechy scenariusza
•
Opis stanu systemu na początku scenariusza.
•
Opis normalnego następstwa zdarzeń scenariusza.
•
Opis tego, co może pójść źle, i jak to jest
obsługiwane.
•
Informacje o innych czynnościach, które można
wykonywać w tym samym czasie.
•
Opis stanu systemu po zakończeniu scenariusza.
•
Każde odrębne zdarzenie w interakcji, takie jak
wsunięcie karty do bankomatu albo wybranie
usługi, może być udokumentowane za pomocą
oddzielnego scenariusza zdarzenia.
•
Obejmują opis przepływu danych, akcji systemu i
wyjątków, które mogą się pojawić.
Przykład scenariusza
• Zdarzenie inicjujące: wsunięto kartę do szczeliny
• Stan początkowy: karta w bankomacie
• Opis: Monituj o podanie numeru PIN. Gdy
wpisany numer jest poprawny, zidentyfikuj
klienta i wyświetl listę dostępnych operacji
• Sytuacje wyjątkowe:
- przekroczony limit czasu: zwróć kartę
- karta nieważna lub skradziona: zatrzymaj kartę
- niepoprawny numer PIN: zapytaj ponownie
- niepoprawny numer PIN podany po raz drugi:
zatrzymaj kartę
• Stan końcowy: użytkownik zidentyfikowany,
wyświetlone menu z dostępnymi operacjami
Model przypadków użycia
(use cases)
•
Metoda oparta na scenariuszach, służąca do
określania wymagań i interakcji użytkownika z
systemem
•
Po raz pierwszy użyta w 1993 (Jacobson). Obecnie
stała się podstawowym elementem notacji UML
•
Podstawowe pojęcia: przypadek użycia, aktor, relacje
między przypadkami użycia
•
System widziany jest jako czarna skrzynka,
zapewniająca określoną funkcjonalność
•
Model wyraźnie rozdziela system i to, co powinien
realizować (przypadki użycia i relacje między nimi),
od tego, co jest poza nim (aktorzy)
•
Ilustracja graficzna przy pomocy diagramu
przypadków użycia, wspierana odpowiednimi
scenariuszami
Przypadek użycia i aktor
• Aktor: abstrakcyjny użytkownik systemu,
reprezentujący grupę użytkowników używających
podobnych funkcji systemu i sposobu z nim
komunikacji
• Przypadek użycia: ciąg interakcji pomiędzy aktorem a
systemem, dostarczający aktorowi pożądanych
wyników
• Klasyfikacja aktorów:
- aktor główny: używa podstawowych funkcji systemu
- aktor drugorzędny: używa funkcji administracyjnych i
pielęgnacyjnych
- aktor aktywny: inicjuje przypadek użycia
- aktor pasywny: uczestniczy w przypadku użycia, ale
go nie inicjuje
Relacje
między przypadkami użycia
• Relacja „używa” („uses”)
- wskazuje na wspólny fragment
wielu przypadków użycia,
wykorzystanie wspólnego
zachowania
• Relacja „rozszerza” („extends”)
- rozszerzenie przypadku użycia o
sytuację wyjątkową
Przykład - hotel
• Hotel przyjmuje gości. Recepcjonista melduje i
wymeldowuje gości oraz pobiera opłaty.
• W hotelu jest wiele pokoi, sprzątanych przez
sprzątaczki
• Pokój może być wynajęty bezpośrednio przy
przyjeździe gościa, jeżeli są wolne pokoje
• Gość płaci recepcjoniście przed wymeldowaniem
• Pokój może zostać posprzątany po jego zwolnieniu
przez gościa. Pokój musi zostać posprzątany przed
jego ponownym wynajęciem
• Aktorzy: gość, recepcjonista, sprzątaczka
• Przypadki użycia: zameldowanie, wymeldowanie,
sprzątanie pokoju
Przykład – hotel.
Scenariusz dla wymeldowania
•
Nazwa przypadku użycia: wymeldowanie
•
Aktorzy: gość, recepcjonista, sprzątaczka
•
Zdarzenie inicjujące: zgłoszenie wyjazdu przez gościa
•
Stan początkowy: zapłacono za pobyt
•
Opis: Gość zgłasza wyjazd i zwraca klucze od pokoju.
Recepcjonista sprawdza zapłacenie rachunku i
wydaje sprzątaczce polecenie sprzątnięcia pokoju
•
Sytuacje wyjątkowe:
- zgubione klucze: nalicz opłatę za dorobienie nowego
- brak zapłaty: wystaw rachunek kredytowy
•
Stan końcowy: pokój sprzątnięty, gotowy do
ponownego wynajęcia
Przykład – hotel.
Diagram przypadków użycia
Model przypadków użycia -
podsumowanie
• identyfikacja granic systemu i aktorów
• specyfikacja wymagań funkcjonalnych,
postrzeganych przez zewnętrznych aktorów
• wspomaganie walidacji wymagań
• punkt wyjścia dla testów systemu
• przydatność dla celów prezentacji
funkcjonalności systemu – zrozumiałość i
komunikatywność
• podstawa do tworzenia diagramów
sekwencji (interakcji)
Diagram sekwencji (interakcji)
:
Książka
Bibliotek
a
Katalogujący:
Personel biblioteki
Nowa
Usuń
Kataloguj
składnik
Usuń składnik
z katalogu
Zarządzanie wymaganiami
-zatwierdzanie wymagań
• Zatwierdzanie wymagań polega na wykazaniu,
że wymagania naprawdę definiują system,
którego chce użytkownik.
• Błędy w dokumentacji wymagań mogą
przyczynić się do poważnych kosztów
powtarzania prac po sukcesywnym wykrywaniu
tych błędów w trakcie tworzenia lub nawet po
rozpoczęciu korzystania z systemu.
• Wymagania stawiane dużym systemom
oprogramowania zawsze się zmieniają.
• W trakcie procesu tworzenia oprogramowania
stopień zrozumienia problemu stale się zmienia,
a zmiany te mają zwrotny wpływ na wymagania.
Sprawdzenie wymagań
•
Sprawdzenie ważności. Użytkownik może być przekonany,
że system powinien spełniać pewne funkcje.
•
Sprawdzenie zrozumiałości. Czy klienci i użytkownicy
systemu dobrze zrozumieli wymaganie?
•
Sprawdzenie pochodzenia. Czy zaznaczone jest źródło, z
którego pochodzi wymaganie?
•
Sprawdzenie niesprzeczności. Wymagania zapisane w
dokumentacji nie powinny być sprzeczne.
•
Sprawdzenie kompletności. Dokumentacja wymagań
powinna zawierać wymagania, w których zdefiniowano
wszystkie funkcje i ograniczenia zamierzone przez
użytkownika systemu.
•
Sprawdzenie realności. Czy wymagania można
zaimplementować przy użyciu dostępnych środków?
•
Możliwość weryfikacji. Aby uniknąć późniejszych sporów
między klientem a zleceniobiorcą, wymagania systemowe
zawsze powinny być napisane tak, aby można było je
weryfikować.
•
Sprawdzenie giętkości. Czy wymaganie może być
zmienione bez znaczącego wpływu na pozostałe wymagania?
Wymagania stałe i zmienne
• Wymagania stałe - względnie stabilne
wymagania, które wynikają z podstawowej
działalności firmy i bezpośrednio odnoszą się do
dziedziny systemu.
• Wymagania zmienne - wymagania, które z dość
dużym prawdopodobieństwem mogą ulec zmianie
w trakcie tworzenia systemu albo po przekazaniu
go do użytkowania.
- wymagania zmieniające się: zmieniają się na
skutek zmian środowiska, w którym działa firma.
- wymagania pojawiające się: pojawiają się w
trakcie procesu tworzenia w miarę coraz lepszego
rozumienia systemu przez klienta.
- wymagania wynikowe: wynikają z wdrożenia
systemu komputerowego.
- wymagania zgodności: zależą od umów lub
procesów gospodarczych wewnątrz firmy.
Planowanie zarządzania
wymaganiami
•
Oznakowanie wymagań
Każde wymaganie musi być unikatowo oznakowane
tak, aby można było robić do niego odnośniki z
innych wymagań i używać tego wymagania przy
ocenianiu pochodzenia.
•
Proces zarządzania zmianami
Zbiór czynności szacowania wpływu i kosztu zmian.
•
Strategia śledzenia pochodzenia
Te strategie definiują zależności między
wymaganiami i projektem systemu, które należy
odnotowywać.
•
Użycie narzędzi CASE
Zarządzanie wymaganiami polega na przetwarzaniu
ogromnej liczby informacji o wymaganiach. Narzędzia
CASE pomagają np. w weryfikacji wymagań.
Zarządzanie zmianami
wymagań
• Zarządzanie zmianami wymagań należy zastosować
do wszystkich postulowanych zmian wymagań.
• Trzy podstawowe kroki:
– Analiza problemu i specyfikacja zmiany.
Proces rozpoczyna się od rozpoznania problemu z
wymaganiem lub czasem od konkretnej
propozycji zmiany.
– Analiza zmiany i ocena kosztów. Korzystając z
informacji o uzależnieniu i ogólnej wiedzy o
wymaganiach systemowych, ocenia się wpływ
proponowanej zmiany.
– Implementacja zmiany. Modyfikuje się
dokumentacje wymagań oraz, jeśli zachodzi taka
potrzeba, również projekt i implementacje
systemu.
Inżynieria
oprogramowania
Wykład 4 –
proces tworzenia oprogramowania
Prezentacja częściowo oparta na prezentacji przygotowanej przez Prof. J.E. Sienkiewicza
(opartej z kolei na podręczniku Iana Sommerville’a Inżynieria oprogramowania, WNT 2003)
Proces tworzenia
oprogramowania
• Zbiór czynności i związanych z nimi
wyników, które prowadzą do powstania
produktu programowego.
• Może obejmować tworzenie
oprogramowania od zera.
• Coraz częściej nowe oprogramowanie
powstaje przez rozszerzanie i
modyfikowanie istniejących systemów.
• Automatyzacja procesu tworzenia
oprogramowania jest niewielka.
Zasadnicze czynności w
procesie tworzenia
oprogramowania
• Specyfikowanie oprogramowania. Funkcjonalność
oprogramowania i ograniczenia jego działania
muszą być dobrze zdefiniowane. Tematyka
omówiona na wykładach nr 2 i 3.
• Projektowanie i implementowanie
oprogramowania. , Stworzone musi być
oprogramowanie, które spełnia specyfikację.
• Zatwierdzanie oprogramowania. Wykazanie, że
wytworzone oprogramowanie spełnia oczekiwania
klienta.
• Ewolucja oprogramowania. Oprogramowanie musi
ewoluować, aby spełniać zmieniające się
potrzeby użytkowników.
Modele procesów tworzenia
oprogramowania
• Model kaskadowy
– W tym modelu podstawowe czynności specyfikowania,
tworzenia, zatwierdzania i ewolucji są odrębnymi fazami
procesu.
• Tworzenie ewolucyjne
– W tym procesie czynności specyfikowania, projektowania i
zatwierdzania przeplatają się.
• Tworzenie formalne systemu
– To podejście jest oparte na budowaniu formalnych
matematycznych specyfikacji systemu i przekształcaniu tych
specyfikacji w program za pomocą metod matematycznych.
• Tworzenie z użyciem wielokrotnym
– W tym podejściu zakłada się istnienie dużej liczby
komponentów zdatnych do ponownego użycia.
Model kaskadowy
Definiowanie wymagań
Projektowanie systemu
i oprogramowania
Implementacja i testowanie
jednostek
Integracja i
testowanie
systemu
Działanie i pielęgnacja
Problemy modelu kaskadowego
•
Następnej fazy nie powinno się rozpoczynać,
jeśli poprzednia się nie zakończy.
•
Koszty opracowania i akceptacji dokumentów
są wysokie i dlatego iteracje są również
kosztowne oraz wymagają powtarzania wielu
prac.
•
Wadą modelu kaskadowego jest zawarty w
nim nieelastyczny podział na rozłączne etapy.
•
Model kaskadowy powinien być używany
jedynie wówczas, gdy wymagania są jasne i
zrozumiałe.
Tworzenie
ewolucyjne
• Tworzenie ewolucyjne polega na opracowaniu wstępnej
implementacji, pokazaniu jej użytkownikowi z prośbą o
komentarze i udoskonalaniu jej w wielu wersjach aż do
powstania odpowiedniego systemu.
Wersja
początko
wa
Ogólny opis
Specyfikacja
Tworzenie
Zatwierdzanie
Wersje pośrednie
Wersja końcowa
czynności równoległe
Typy tworzenia ewolucyjnego
• Tworzenie badawcze
– Celem procesu jest praca z klientem, polegająca
na badaniu wymagań i dostarczeniu
ostatecznego systemu. Tworzenie rozpoczyna się
od tych części systemu, które są dobrze
rozpoznane. System ewoluuje przez dodawanie
nowych cech, które proponuje klient.
• Prototypowanie z porzuceniem
– Celem procesu jest zrozumienie wymagań klienta
i wypracowanie lepszej definicji wymagań
stawianych systemowi. Budowanie prototypu ma
głównie na celu eksperymentowanie z tymi
wymaganiami użytkownika, które są niejasne.
Tworzenie ewolucyjne –
zastosowania i problemy
• Stosowanie
– W wypadku systemów małych lub średnich oraz
tych z krótkim czasem życia, podejście
ewolucyjne jest najlepsze ze wszystkich modeli.
– W wypadku dużych systemów o długim czasie
życia wady tworzenia ewolucyjnego ujawniają
się jednak z całą ostrością.
• Problemy
– Proces nie jest widoczny
– System ma często złą strukturę
– dokumentacja czasami nie jest aktualna
– Konieczne mogą być specjalne narzędzia i
techniki
Tworzenie formalne
systemów
• Podejście, które ma wiele wspólnego z modelem kaskadowym.
Proces tworzenia jest tu jednak oparty na matematycznych
przekształceniach specyfikacji systemu w program wykonywalny.
• W procesie przekształcania formalna matematyczna
reprezentacja systemu jest metodycznie przekształcana w
bardziej szczegółowe, ale wciąż matematycznie poprawne
reprezentacje systemu.
• Podejście z przekształceniem złożone z ciągu małych kroków jest
łatwiejsze w użyciu. Wybór, które przekształcenie zastosować,
wymaga jednak dużych umiejętności.
• Najlepiej znanym przykładem takiego formalnego procesu
tworzenia jest Cleanroom, pierwotnie opracowany przez IBM
(Proces Cleanroom jest oparty na przyrostowym tworzeniu
oprogramowania, gdy formalnie wykonuje się każdy krok i
dowodzi jego poprawności.)
Definicja
wymagań
Specyfikacja
formalna
Przekształce
nie
formalne
Integracja i testowanie
systemu
Przekształcenia formalne
R2
R3
P2
P3
P4
T1
T2
T3
T4
R1
P1
Specyfikacja
formalna
Program
wykonywal
ny
Tworzenie formalne –
zastosowania i problemy
•
Oprócz specjalistycznych dziedzin procesy
oparte na przekształceniach formalnych są
używane rzadko.
•
Wymagają specjalistycznej wiedzy i w
praktyce okazuje się, że w wypadku
większości systemów nie powodują
zmniejszenia kosztów lub polepszenia
jakości w porównaniu z innymi
podejściami.
•
Interakcje systemów nie poddają się łatwo
specyfikowaniu formalnemu.
Tworzenie z użyciem
wielokrotnym
•
W większości przedsięwzięć programistycznych występuje
wielokrotne użycie oprogramowania.
•
Etapy procesu:
–
analiza komponentów,
–
modyfikacja wymagań,
–
projektowanie systemu z użyciem wielokrotnym,
–
tworzenie i integracja.
•
Zakłada się istnienie dużego zbioru dostępnych
komponentów programowych do użycia wielokrotnego
oraz integrującej je struktury.
Specyfikacja
wymagań
Zatwierdzen
ie
systemu
Tworzenie i
integracja
Projekt
systemu z
użyciem
wielokrotnym
Analiza
komponentów
Modyfikacja
wymagań
Iteracja procesu
• Potrzebne jest także wspomaganie procesu
tworzenia oprogramowania nazywane
iteracjami, które polega na powtarzaniu
fragmentu tego procesu w miarę ewolucji
wymagań stawianych systemowi (na przykład
prace projektowe i implementacyjne musza
być ponownie wykonane, aby spełnić
zmienione wymagania).
• Mamy tutaj dwa hybrydowe modele:
– tworzenie przyrostowe,
– tworzenie spiralne.
Tworzenie przyrostowe
•
Podejście przyrostowe do tworzenia zaproponowane
w 1980 r. jako sposób na ograniczenie
powtarzania prac w procesie tworzenia oraz danie
klientom pewnych możliwości odkładania decyzji o
szczegółowych wymaganiach do czasu, aż zdobędą
pewne doświadczenia w pracy z systemem.
•
W procesie przyrostowym klienci identyfikują w
zarysie usługi, które system ma oferować. Wskazują,
które z nich są dla nich najważniejsze, a które
najmniej ważne. Definiuje się następnie pewną liczbę
przyrostów, które maja być dostarczone.
•
Gdy przyrost jest już gotowy i dostarczony, klienci
mogą go uruchomić. Oznacza to, że szybko
otrzymują część funkcjonalności systemu
Tworzenie przyrostowe –
schemat
Zdefiniuj zarys
wymagań
Wytwórz
przyrost
systemu
Przypisz wymagania
do przyrostów
Zweryfikuj
przyrost
Zaprojektuj
architekturę systemu
Zintegruj system
Zweryfikuj system
System
końcowy
System nie ukończony
Zalety procesu tworzenia
przyrostowego
• Klienci nie muszą czekać na dostarczenie całego
systemu, zanim zaczną czerpać z niego korzyść.
• Klienci mogą używać wstępnych przyrostów jako
rodzaju prototypu i zdobywać doświadczenia,
które inspirują wymagania wobec późniejszych
przyrostów.
• Ryzyko całkowitej porażki przedsięwzięcia jest
mniejsze.
• Usługi o najwyższym priorytecie będą
dostarczane jako pierwsze.
Tworzenie spiralne
•
Zaproponowany w 1998 r.
•
Proces nie jest przedstawiany jako ciąg
czynności z pewnymi nawrotami między
nimi, ale ma postać spirali.
•
Każda pętla spirali reprezentuje jedną
fazę procesu.
•
Najbardziej wewnętrzna pętla może być
poświęcona wykonalności systemu,
następna definicji wymagań stawianych
systemowi, kolejna projektowaniu itd.
•
Jawne potraktowanie zagrożeń.
Model spiralny
Określ cele,
inne strategie
i ograniczenia
Oceń inne strategie,
rozpoznaj i zmniejsz
zagrożenia
RECENZJA
Plan wymagań
Plan cyklu życia
Plan tworzenia
Plan testowania
i integracji
Zaplanuj następną
fazę
Analiza zagrożeń
Analiza zagrożeń
Analiza zagrożeń
Analiz
a
zagroż
eń
Prototyp 1
Prototyp 2
Prototyp 3
Działający
prototyp
Sposób
postępowania
Symulacje, modele, miary odniesienia
Zatwierdzenie
wymagań
Wymagan
ia
Projekto-
wanie
produktu
Weryfikacja i
zatwierdzenie
Działanie
Testy
akceptacji
Testy
integracji
Testy
jednostek
Kodowanie
Szczegółowe
projektowanie
Utwórz, zweryfikuj
produkt następnego
poziomu
Każda pętla spirali jest
podzielona na cztery sektory:
• Ustalanie celów
– Definiuje się konkretne cele tej fazy
przedsięwzięcia. Identyfikuje się ograniczenia,
którym podlega proces i produkt.
• Rozpoznanie i redukcja zagrożeń
– Przeprowadza się szczegółową analizę każdego z
rozpoznanych zagrożeń przedsięwzięcia
.
• Tworzenie i zatwierdzanie
– Po ocenie zagrożeń wybiera się model tworzenia
systemu.
• Planowanie
– Recenzuje się przedsięwzięcie i podejmuje
decyzję, czy rozpoczynać następną pętlę spirali.
Projektowanie i
implementowanie
oprogramowania
• Projekt oprogramowania to opis struktury
oprogramowania, które ma być
zaimplementowane, danych, które są częścią
systemu, interfejsów między komponentami
systemu i użytych algorytmów.
• Proces projektowania może obejmować
opracowanie kilku modeli systemu na różnych
poziomach abstrakcji.
• Faza implementowania w tworzeniu
oprogramowania to proces przekształcania
specyfikacji systemu w działający system, na
postawie projektu.
Charakterystyczne czynności
procesu projektowania
• Projektowanie architektury
• Specyfikowanie abstrakcyjne
• Projektowanie interfejsów
• Projektowanie komponentów
• Projektowanie struktur danych
• Projektowanie algorytmów
Ogólny model procesu
projektowania
Projektowanie
architektury
Specyfikowanie
abstrakcyjne
Projektowanie
interfejsów
Projektowanie
komponentów
Architektura
systemu
Specyfikacja
oprogramowa
nia
Specyfikacja
interfejsów
Specyfikacja
komponentów
Projektowanie
struktury
danych
Specyfikacja
struktury
danych
Specyfikacja
algorytmów
Projektowanie
algorytmów
Specyfikacja
wymagań
Produkty projektowania
Czynności projektowe
Metody projektowania
• Ciągle często projektowanie jest działaniem ad
hoc, bez formalnej kontroli zmian ani
zarządzania projektowaniem.
• Lepsze podejście polega na użyciu metod
strukturalnych, które są zbiorami notacji i porad
dla projektantów oprogramowania. Ich użycie
polega zwykle na opracowaniu graficznych
modeli systemu i prowadzi do dużej ilości
dokumentacji projektowej.
• Metody strukturalne mogą obejmować:
– modele przepływu danych,
– modele encja-związek,
– modele strukturalne,
– modele obiektowe.
Zatwierdzanie
oprogramowania
• Weryfikacja i zatwierdzenie mają
wykazać, że system jest zgodny ze swoją
specyfikacją i spełnia oczekiwania klienta.
• Obejmuje proces sprawdzania, m.in.
kontrole i recenzje w każdym kroku
procesu tworzenia, od definicji wymagań
użytkownika aż do implementacji.
• Z wyjątkiem małych programów, nie
należy testować systemu jako
pojedynczej całości.
Programowanie
i wyszukiwanie błędów
• Programiści wykonują pewne testy kodu, który
napisali. Zwykle prowadzi to do wykrycia
błędów, które należy usunąć z programu.
• Testowanie programu i usuwanie błędów to
dwa różne procesy.
• Lokalizacja błędu może wymagać nowych
przypadków testowych.
Napra
w błąd
Napr
aw
błąd
Przetestuj program
ponownie
Zlokalizuj
błąd
Zaprojektuj
naprawę błędu
Napraw błąd
Fazy procesu testowania
•
Testowanie komponentów (jednostek)
–
Testuje się poszczególne komponenty, aby zapewnić,
że działają poprawnie.
•
Testowanie modułów
– Moduł jest kolekcją niezależnych komponentów takich
jak klasy obiektów, abstrakcyjne typy danych, albo
bardziej luźną kolekcją procedur i funkcji.
•
Testowanie podsystemów
–
Testowanie kolekcji modułów, które zintegrowano w
podsystemie.
•
Testowanie systemu
–
Proces ma wykryć błędy wynikające z
nieprzewidzianych interakcji między podsystemami
zintegrowanymi w pełen system oraz problemy z
interfejsami podsystemów.
Testowanie odbiorcze
–
Jest to końcowa faza procesu testowania przed
przyjęciem systemu do użytkowania.
Testowanie alfa i beta
• Testowanie alfa jest testowaniem odbiorczym,
stosowanym kiedy system jest tworzony dla
konkretnego klienta. Proces testowania trwa
do momentu osiągnięcia zgody pomiędzy
wytwórcą systemu i klientem co do tego, że
dostarczony system jest możliwą do przyjęcia
implementacją wymagań.
• Testowanie beta stosuje się, kiedy system
sprzedawany jako produkt programowy.
Testowanie polega na dostarczeniu systemu
pewnej liczbie potencjalnych klientów, którzy
zgodzili się z niego korzystać. Klienci
informują wytwórców o pojawiających się
problemach.
Ewolucja oprogramowania
•
Elastyczność systemów oprogramowania jest jedną z
głównych przyczyn, że coraz więcej i więcej oprogramowania
włącza się do wielkich, złożonych systemów.
•
W przypadku oprogramowania, w przeciwieństwie do sprzętu,
zmiany mogą być wprowadzone w każdej chwili tworzenia
systemu, lub nawet po jego zakończeniu.
•
Koszt tych zmian może być bardzo wysoki, ale wciąż będzie
niższy niż odpowiednie zmiany w sprzęcie systemu.
Zidentyfikuj
wymagania
stawiane systemowi
Zbadaj istniejące
systemy
Zaproponuj zmiany
systemów
Zmodyfikuj
system
Nowy system
Istniejące
systemy
Zautomatyzowane wspomaganie
procesu tworzenia
oprogramowania
•
Komputerowo wspomagana inżynieria oprogramowania
(CASE) korzysta z różnego oprogramowania do
wspomagania czynności procesu tworzenia
oprogramowania, takich jak inżynieria wymagań,
projektowanie, programowanie i testowanie.
•
Czynności, które można zautomatyzować za pomocą CASE:
– oprogramowanie graficznych modeli systemu jako części
specyfikacji wymagań i projektu oprogramowania,
– czytanie projektu za pomocą słownika danych, który
przechowuje informacje o encjach i związkach w
projekcie,
– generowanie interfejsu użytkownika na podstawie
graficznego opisu interfejsu, opracowanego
interaktywnie przez użytkownika,
– śledzenie błędów przez udostępnienie informacji o
wykonującym się programie,
– automatyczne tłumaczenie programów ze starych wersji
języków programowania.
Technologia CASE
• Technologia CASE jest obecnie dostępna dla
większości rutynowych czynności procesu
tworzenia oprogramowania.
• Inżynieria oprogramowania jest głównie
czynnością projektową opartą na kreatywnym
myśleniu. Istniejące systemy CASE automatyzują
pewne rutynowe czynności, ale próby
zastosowania sztucznej inteligencji do
wspomagania programowania nie powiodły się
dotychczas.
• W większości firm procesy związane z inżynierią
oprogramowania są czynnością zespołową.
Inżynierowie spędzają więc sporo czasu na
interakcji z innymi członkami zespołu. Technologia
CASE nie daje tu zbyt dużego wsparcia.
Klasyfikacja narzędzi CASE
•
Narzędzia do planowania
–
Narzędzia do szacowania kosztów, arkusze kalkulacyjne
•
Narzędzia do zarządzania zmianami
–
Narzędzia do zapisu i śledzenia wymagań, systemy
kontroli zmian, systemy zarządzania wersjami
•
Narzędzia do projektowania
–
Edytory i procesory tekstów, edytory diagramów
•
Narzędzia do zarządzania konfiguracjami
–
Narzędzia do budowania systemów, systemy
zarządzania wersjami
•
Narzędzia do prototypowania
–
Języki bardzo wysokiego poziomu, generatory interfejsu
użytkownika
•
Narzędzia wspomagające
–
Edytory projektów, słowniki danych
Klasyfikacja narzędzi CASE
(c.d.)
•
Narzędzia do przetwarzania kodu źródłowego
–
Kompilatory, interpretatory
•
Narzędzia do analizy programów
–
Generatory wzajemnych odwołań, analizatory
statyczne, analizatory dynamiczne
•
Narzędzia do testowania
–
Dane testowe, programy porównujące pliki
•
Narzędzia do usuwania błędów
–
Systemy interakcyjnego usuwania błędów
•
Narzędzia do dokumentowania
–
Programy do składu tekstu, edytory rysunków
•
Narzędzia do wyszukiwania
–
Systemy wyszukiwania wzajemnych odwołań,
programy do restrukturyzacji systemów
Inżynieria
oprogramowania
Wykład 5 –
projektowanie obiektowe: klasa, obiekt,
związek, budowa modelu obiektowego
Prezentacja częściowo oparta na prezentacji przygotowanej przez Prof. J.E. Sienkiewicza
(opartej z kolei na podręczniku Iana Sommerville’a Inżynieria oprogramowania, WNT 2003)
Projektowanie obiektowe
• Strategia projektowania, w ramach której
projektanci systemu myślą w kategoriach
„bytów”, a nie operacji albo funkcji.
• Działający system składa się z oddziałujących na
siebie obiektów, które przechowują swój lokalny
stan i oferują operacje testujące lub zmieniające
ten stan.
• Obiekty ukrywają informację o reprezentacji stanu
i w ten sposób ograniczają do niego dostęp.
• Proces projektowania obiektowego obejmuje
zaprojektowanie klas obiektów i związków (relacji)
między tymi klasami.
• W działającym programie, potrzebne obiekty są
tworzone na podstawie definicji klas.
Strategie obiektowe
• Analiza i projektowanie obiektowe polegają
na opracowaniu modelu obiektowego dla danej
dziedziny zastosowania przy uwzględnieniu
zidentyfikowanych wymagań. Rozpoznane obiekty
odzwierciedlają byty i operacje związane z
rozwiązywanym problemem.
• Programowanie obiektowe polega na realizacji
projektu
oprogramowania
za
pomocą
obiektowego
języka
programowania.
Języki
obiektowe,
takie
jak
Java,
umożliwiają
bezpośrednią
implementację
obiektów
i
dostarczają udogodnienia do definiowania klas
obiektów.
Obiekt
(ang. object)
• Obiekt jest bytem, który posiada swój stan i
zbiór zdefiniowanych operacji działających na tym
stanie.
- stan jest reprezentowany jako zbiór atrybutów
(ang. attributes)
obiektu.
- operacje
(ang. operations)
skojarzone z obiektem
służą do oferowania usług innym obiektom
(klientom), które mogą żądać tych usług, gdy
potrzebują wyników ich działania.
• Obiekty są tworzone zgodnie z definicja klasy
obiektów. Definicja klasy obiektów służy jako
szablon do tworzenia obiektów. Zawiera
deklaracje wszystkich atrybutów i operacji, które
należy skojarzyć z obiektem tej klasy.
Klasa obiektów
(ang. class)
• Grupa obiektów może mieć wspólną definicję
danych lub usług wykorzystywanych do definicji
interfejsu, stanowiąc wcielenie (instancje)
wspólnej definicji zwanej klasą obiektów.
• Innymi słowy: pojęcie klasy umożliwia
wyróżnienie podobnej grupy obiektów według
pewnego kryterium (pewnych cech, którymi są
atrybuty i operacje).
• Jeżeli mamy zdefiniowaną klasę, to mówimy, że
obiekt należący do niej jest instancją tej klasy
(ang. instance)
.
Klasa – reprezentacja graficzna
(w języku UML)
Przykład - klasa Pracownik
tatus: {current, left, retired}
taxCode: integer
. . .
join ()
leave ()
retire ()
changeDetails (
Pracownik
+ nazwisko : string
+ adres : string
+ dataUrodzenia : Date
+ licznikPracowników : integer
+ PESEL : string
+ dział : Dział
+ przełożony : Pracownik
+ wynagrodzenie : integer = 0
+ stan : {zatrudniony, zwolniony,
emerytowany}
+ NIP : integer
- numerPracownika : integer
+ zatrudnij()
+ zwolnij()
+ przejdźNaEmeryturę()
+ dajPodwyzke(kwota)
# sprawdzPoprawnoscNumeruPESEL()
Jan Kowalski :
Pracownik
Obiekt
(instancja) klasy
Pracownik:
Komunikacja pomiędzy
obiektami
• Obiekty porozumiewają się przez żądania usług od
innych obiektów (wywołania operacji), i jeśli trzeba,
wymianę informacji niezbędnych do realizacji usługi.
• Kopie informacji potrzebnych do wykonania usługi i
wyniki jej wykonania są przekazywane jako parametry.
• Obiekt odbiorca analizuje składniowo komunikat,
rozpoznaje usługę i przekazane dane a następnie
realizuje żądaną usługę.
• Przykłady komunikacji:
//
Wywołaj
operację
(w
obiektowych
językach
programowania operacje nazywa się metodami) dla
obiektu buforCykliczny, która pobiera kolejną wartość z
bufora i zapisuje ją do zmiennej.
w = buforCykliczny.pobierz()
// Wywołaj metodę termostatu, ustawiającą temperaturę
termostat.ustawTemperaturę(20);
Związki między klasami
• W modelu zwykle istnieją różne zależności (wiązania, ang. links)
pomiędzy obiektami należącymi do różnych klas obiektów.
stan o3
o3 : K3
stan o4
o4 : K4
stan o1
o1 : K1
o6 : K6
stan o5
o5 : K5
stan o2
o2 : K2
stan o6
• Zależności te reprezentuje się przez związek (inaczej relację,
ang. association) między klasami.
Związki między klasami
Powiązanie
• Najprostszym, ogólnym związkiem jest powiązanie
(ang. binary association; general association). Używa
się go do wskazania, że atrybut obiektu jest powiązany
z innym obiektem, albo że implementacja metody
korzysta
z
powiązanego
obiektu.
Powiązanie
modelowane jest linią łączącą klasy obiektów, która
może mieć dodatkowe adnotacje (opis związku).
Istnieją również powiązania n-arne, łączące ze sobą
więcej niż 2 klasy.
jest-
członkiem►
jest-zarządzany-przez
zarządza
Kierownik
Dział
Pracownik
Związki między klasami
Uogólnienie
(dziedziczenie, implementacja,
ang. generalization, inheritance,
implementation
)
• Klasy obiektów można ułożyć w hierarchię
uogólnienia, w której widać związek między
ogólnymi i bardziej szczegółowymi klasami obiektów.
• Szczegółowa klasa obiektów jest w pełni zgodna z
ogólną klasą obiektów, ale zawiera więcej informacji.
• W UML uogólnienie obrazuje się za pomocą obrazów
strzałki wskazującej klasę macierzystą.
• W obiektowych językach programowania uogólnienie
zwykle implementuje się za pomocą mechanizmu
dziedziczenia. Klasa potomna dziedziczy atrybuty i
operacje po klasie macierzystej.
Hierarchia uogólnień
Pracownik
Kierownik
zarządzaneBud
żety
dataPrzyjęcia
Programista
przedsięwzięci
e
językiProgr
Kierownik
Przedsięwzięcia
przedsięwzięcie
Kierownik
Działu
dział
Kierownik
Strategiczny
obowiązki
Zalety uogólniania
• Oszczędność czasu, przejrzystość i
wygoda: klasy niższe w hierarchii mają te
same atrybuty i operacje co ich klasy
macierzyste, mogą jednak dodawać nowe
atrybuty i operacje lub modyfikować
niektóre z tych odziedziczonych.
• Bezpieczeństwo: zasada uogólniania
działa jedynie w jednym kierunku.
Związki między klasami
Agregacja i kompozycja
Agregacja
(ang. aggregation)
: tworzenie nowej
klasy, przy użyciu klas już istniejących.
Nowa klasa może być zbudowana z
dowolnej liczby obiektów (obiekty te
mogą być dowolnych typów) i w
dowolnej kombinacji, by uzyskać
żądany efekt. Jest to relacja typu
"zawiera" np: "samochód zawiera koła i
silnik" - gdzie „samochód”, „koło” i
„silnik” są klasami. Symbol – linia
zakończona rombem.
Kompozycja
(ang. composition)
: składanie się
obiektu z obiektów składowych, które
nie mogą istnieć bez obiektu głównego.
Kompozycja jest relacją typu "posiada".
Dana część może należeć tylko do
jednej całości. Część nie może istnieć
bez całości, a usunięcie całości
powoduje automatyczne usunięcie
wszystkich części związanych z nią
związkiem kompozycji. Symbol – linia
zakończona zaczernionym rombem.
Związki między klasami
Zależność
• Zależność
(ang. dependency)
między klasami
zachodzi, jeżeli zmiany dokonane w stanie
jednego z obiektów danej klasy mogą mieć
wpływ na obiekt należący do innej klasy.
Związek, tak jak i obiekt, też może posiadać atrybuty
(tzw. związek kwalifikowany).
prawa dostępu
Plik
Użytkownik
Krotność związku
• Krotność związku
(ang. multiplicity)
określa, ile
obiektów danej klasy jest równocześnie związana
z obiektami innej klasy
0..1
Zero lub jeden
1
Tylko jeden
n
Tylko n (gdzie n > 1)
0..*
Zero lub więcej (skrót: *)
1..*
Jeden lub więcej
0..n
Od zera do n (gdzie n > 1)
1..n
Od jednego do n (gdzie n >
1)
Stereotypy
• Idea stereotypów
(ang. stereotypes)
polega na
ustaleniu pewnej meta-klasyfikacji obiektów (i
innych bytów) i wprowadzeniu oznaczeń
graficznych klas zgodnych z tą meta-klasyfikacją.
• Przykład: obiekty interfejsu, obiekty sterujące i
obiekty rzeczywiste.
• Oznaczenie: ciągi znaków wewnątrz nawiasów «
»; np. «interface»
Budowa modelu obiektowego
• Identyfikacja klas obiektów
Podejście praktyczne polega na wyselekcjonowaniu
rzeczowników z Specyfikacji Wymagań Systemowych
i potraktowaniu ich jako identyfikatorów klas
obiektów.
Innym źródłem identyfikacji obiektów mogą być:
– Specyfikacja przypadków użycia
– dodatkowe klasy obiektów wynikające z ogólnej
wiedzy na temat problemu.
• Identyfikacja związków między klasami
– Wstępna identyfikacja przez rozpatrzenie ze
specyfikacji wymagań fraz zawierających
czasowniki.
Budowa modelu obiektowego
• Identyfikacja atrybutów i operacji
– Wstępna identyfikacja atrybutów polega na
rozważeniu przymiotników, wyrażeń
dzierżawczych odnoszących się do już
zidentyfikowanych klas i związków.
– Wstępna identyfikacja operacji m.in. na
podstawie modelu przypadków użycia.
• Optymalizacja modelu
– Identyfikacja związków dziedziczenia
– Grupowanie klas w moduły (pakiety)
– Weryfikacja, walidacja i uszczegóławianie modelu
DIAGRAM KLAS
Diagram klas
•
Diagram klas - statyczny diagram strukturalny,
przedstawiający strukturę systemu w modelach obiektowych,
przez ilustrację struktury klas i zależności między nimi.
Inżynieria
oprogramowania
Wykład 6 –
Więcej o UML (Unified Modeling
Language, ujednolicony język
modelowania)
Prezentacja częściowo oparta na prezentacji przygotowanej przez Bartosza Waltera (UW)
Historia projektowania
obiektowego
•
Początki projektowania obiektowego: lata 70-te XX
wieku; najważniejsze metodologie obiektowe:
- OOADA (Object-Oriented Analysis and Design with
Aplications) - Grady Booch – nacisk na projektowanie
- OOSE (Object Oriented Software Engineering) - Ivar
Jacobson – nacisk na inżynierię wymagań
- OMT (Object Modeling Technique) - James
Rumbaugh – nacisk na analizę
Historia UML
• Język UML: unifikacja metod Boocha, Jacobsona i
Rumbaugh (1994 r.) – z poszczególnych notacji
przejęto najlepsze rozwiązania
• Język początkowo wspierany przez firmę Rational
Software (program Rational Rose)
• Najbardziej rozpowszechnione wersje UML: 1.1
(1997) oraz 1.4 (2002 r.)
• 2005 r. – wersja UML 1.4 oficjalnym ,
międzynarodowym standardem projektowania
aplikacji (Information technology: ISO/IEC
19501:2005)
• Bieżąca, oficjalna wersja: 2.0 (2005 r.)
• Wersja 2.1 w końcowej fazie specyfikacji (2007 r.)
• Obecnie język UML nie posiada praktycznie
konkurencji w dziedzinie obiektowego projektowania
aplikacji
OMG - Object Management
Group
• OMG – niekomercyjna organizacja powstała w
1989 r. Jej celem jest promowanie teorii oraz
praktyki technologii obiektowych.
• Założycielami OMG było 13 liczących się
przedsiębiorstw z branży software'owej.
• Obecnie do organizacji należy ponad 750 firm -
producentów oprogramowania oraz sprzętu
komputerowego.
• Organizacja zajmuje się opracowywaniem
standardów pomagających w tworzeniu aplikacji
obiektowych.
• W 1997 r. OMG włączyła się do prac nad UML
• 2005 r. – OMG doprowadziła do uznania UML 1.4
jako oficjalnego standardu.
Czym jest UML?
• UML jest językiem do specyfikacji, wizualizacji,
konstrukcji, dokumentowania projektów
związanych z systemami informacyjnymi
intensywnie wykorzystującymi oprogramowanie,
a także do modelowania biznesowego wszelkich
innych systemów.
• UML oferuje standaryzowany sposób zapisu
projektu, obejmującego zarówno jego
konceptualne aspekty, takie jak procesy
biznesowe czy funkcje systemu, jak też i
elementy fizyczne (np. schematy bazy danych,
warstwę sprzętową systemu).
• UML standaryzuje notację graficzną – określa
sposób zapisu modeli.
Czym nie jest UML?
• UML nie jest metodyką
– UML nie określa metody modelowania
– zaleca jedynie stosowanie podejścia
przyrostowego
• UML nie jest narzędziem
– UML to specyfikacja dla narzędzi
• UML nie jest językiem programowania
– generowanie kodu z modelu stosowane jest
obecnie na niewielką, choć stale zwiększającą się
skalę (przyczyna: dopiero teraz powstają
narzędzia CASE lepiej wspomagające ten proces)
„Perspektywy” UML
• Perspektywa przypadków użycia – opisuje funkcjonalność, jaką
powinien dostarczać system, widzianą przez jego użytkowników.
• Perspektywa logiczna – zawiera sposób realizacji
funkcjonalności, strukturę systemu widziana przez projektanta.
• Perspektywa implementacyjna – opisuje poszczególne moduły i
ich interfejsy wraz z zależnościami; perspektywa ta jest
przeznaczona dla programisty.
• Perspektywa procesowa – zawiera podział systemu na procesy
(czynności) i procesory (jednostki wykonawcze); opisuje
właściwości pozafunkcjonalne systemu i służy przede także
programistom i integratorom.
• Perspektywa wdrożenia – definiuje fizyczny podział elementów
systemu i ich rozmieszczenie w infrastrukturze; perspektywa
taka służy integratorom i instalatorom systemu.
Diagramy UML 2.0
diagram klas (class)
diagram obiektów (object)
diagram struktur złożonych (composite structure)
diagram pakietów (package diagram)
diagram komponentów (component)
diagram wdrożenia (deployment)
diagram przypadków użycia (use cases)
diagram maszyny stanowej (state machine)
diagram czynności (activity)
diagram sekwencji (sequence)
diagram komunikacji (communication)
diagram przeglądu interakcji (interaction overview)
diagram uwarunkowań czasowych (timing)
diagramy strukturalne
diagramy zachowania
(behawioralne)
diagramy
interakcji
Diagram przypadków użycia
• Modelowanie użytkowników systemu (aktorów)
i ich potrzeb w stosunku do tworzonego systemu.
• Omówiony na wykładzie nr 2
Diagram klas
• Przedstawia klasy występujące w systemie
i statyczne relacje pomiędzy nimi
• Omówiony na wykładzie nr 5
Diagram obiektów
• Diagram obiektów prezentuje możliwą konfigurację
obiektów w określonym momencie. Jest pewnego
rodzaju instancją diagramu klas, w której zamiast
klas przedstawiono ich obiekty.
• Diagram posługuje się identycznymi symbolami co
diagram klas, zamiast symboli klas występują
symbole obiektów.
Diagramy obiektów przydają się w
przypadku szczególnie
skomplikowanych zależności,
których nie można przedstawić na
diagramie klas.
Wówczas przykładowe konfiguracje
obiektów pomagają w zrozumieniu
modelu.
Diagram struktur złożonych
• Diagram przedstawia hierarchicznie wewnętrzną strukturę
złożonego obiektu z uwzględnieniem punktów interakcji z
innymi częściami systemu.
• Obiekt składa się z części, które reprezentują poszczególne
składowe obiektu realizujące poszczególne funkcje obiektu.
Komunikacja pomiędzy obiektem, a jego środowiskiem
przebiega poprzez port (oznaczany jako mały prostokąt
umieszczony na krawędzi obiektu). Porty są połączone z
częściami obiektu, które są odpowiedzialne za realizacje tych
funkcji.
Diagramy struktur
złożonych mogą
zawierać interfejsy
wewnętrzne i
interfejsy
udostępnione,
widoczne na
zewnątrz obiektu
Diagram komponentów
• Komponent to wymienny, wykonywalny fragment systemu o
hermetyzowanych szczegółach implementacyjnych.
Komponenty z natury służą do ponownego wykorzystania
poprzez połączenie ich z innymi komponentami, zwykle
poprzez ich skonfigurowanie, bez potrzeby rekompilacji.
• Funkcjonalność oferowana przez komponent jest dostępna
przez interfejsy, które ten implementuje. Z drugiej strony,
komponent może wymagać pewnych interfejsów, które muszą
być dostarczone przez inne komponenty.
• Diagram
komponentó
w
przedstawia
komponenty
, ich
interfejsy
oraz
zależności
pomiędzy
nimi.
Diagram pakietów
Służy do modelowania fizycznego i logicznego
podziału systemu. Pakiety są elementem
strukturalizującym elementy UML i służą do
grupowania ich według dowolnego kryterium. W
pakiecie można umieścić praktycznie dowolne
elementy: klasy, komponenty, przypadki użycia,
pojemniki danych a także inne pakiety. W ten
sposób przedstawiają one drzewiastą strukturę
elementów modelu.
Diagram wdrożenia
• Odzwierciedla fizyczną strukturę całego systemu, z
uwzględnieniem oprogramowania i sprzętu.
• Jednostki oprogramowania są reprezentowane przez artefakty
(czyli skompilowane wersje komponentu, który można uruchomić),
dane i biblioteki.
• Stronę sprzętową reprezentują węzły, czyli poszczególne
urządzenia obliczeniowe, komunikacyjne i przechowujące,
powiązane ścieżkami komunikacyjnymi (np. połączeniem TCP/IP).
• Diagram ten istotną rolę odgrywa przy wdrażaniu dużych,
rozproszonych systemów.
Diagram stanów
(maszyny stanowej)
• Reprezentuje zachowanie systemu lub jego elementu
(zwykle obiektów danej klasy), a w szczególności zmiany
tego zachowania.
• Podstawowymi elementami diagramu są stany obiektu
połączone strzałkami przejść. Obiekt, reagując na
nadchodzące zdarzenia, jeżeli spełnione są określone
warunki, zmienia swój stan i położenie na diagramie
stanu.
Stan
•
Stan jest etapem cyklu życia obiektu. Obiekt przebywający
w danym stanie spełnia określony warunek.
•
Stany są reprezentowane przez prostokąty z zaokrąglonymi
narożnikami. Każdy stan ma swoją nazwę.
•
Ze stanem mogą być związane pewne akcje, wykonywane w
określonym momencie:
• entry: jest akcją wykonywaną w momencie gdy obiekt
przyjmuje dany stan; akcja ta jest wykonywana jeden raz i
niepodzielnie
• do: jest akcją wykonywaną nieprzerwanie w czasie, gdy
obiekt przebywa w tym stanie
• exit: oznacza (analogicznie do entry) moment opuszczenia
stanu; podobnie, akcja taka jest wykonywana tylko raz.
• event: reprezentuje akcję wykonywaną w momencie
nadejścia zdarzenia określonego typu
•
Wykonanie każdej z tych akcji może również generować
zdarzenie.
Przejścia pomiędzy stanami
•
Stany są powiązane ze sobą przejściami. Przejścia definiują warunki, jakie
muszą zaistnieć, aby obiekt zmienił swój stan ze źródłowego na docelowy.
Formalnie opis przejścia składa się z czterech elementów:
• wyzwalacza (ang. trigger) – zdarzenia, które może spowodować
przejście i zmianę stanu
• dozoru (ang. guard condition) – warunku, jaki musi być spełniony, aby
przejście zostało wykonane; warunek ten jest ewaluowany w momencie
pojawienia się wyzwalacza
• akcji (ang. action) – operacji wykonywanej w momencie przejścia ze
stanu do stanu; nawet jeżeli akcja przejścia jest złożona z wielu akcji
elementarnych, jest ona wykonywana niepodzielnie
• zdarzenia (ang. event) – wysyłanego w momencie wykonania przejścia.
Przykład –
diagram
dla obiektów
klasy
książka.
Przejście
pomiędzy
dwoma stanami:
Dostępna i
Zniszczona.
Pseudostany
•
Stany pomocnicze (pseudostany):
• początkowy, który reprezentuje obiekt w momencie jego
utworzenia.
• końcowy, który reprezentuje usunięcie obiektu z systemu.
• decyzja, przedstawiająca wybór pomiędzy dwiema wartościami
logicznymi pewnego wyrażenia.
• złączenie/rozwidlenie – powoduje synchronizację stanów
(wszystkie dochodzące do niego przejścia muszą być wykonane)
• historia (literka H w okręgu wewnątrz stanu) – zapewnia możliwość
zapamiętania poprzedniego stanu obiektu i przywrócenie go.
Diagram dla obiektów klasy
rezerwacja.
Stany złożone
•
Stany złożone
posiadają wewnętrzną
maszynę stanów.
Wejście do stanu jest
jej stanem
początkowym, a
wyjście –końcowym.
Przykład –
pełny diagram
maszyny stanowej dla
obiektów klasy książka
(dla przejrzystości nie
uwzględnia akcji).
Diagram czynności
•
Prezentuje przepływ sterowania w systemie związany z
wykonaniem pewnej funkcji.
•
Przepływ łączy czynności wykonywane przez poszczególne
obiekty i stany obiektów, w których znajdują się po wykonaniu
czynności.
•
W odróżnieniu od diagramu maszyny stanowej, diagram
czynności może obejmować wiele obiektów na raz, zwykle
umieszczanych w odpowiednich torach.
<<Interfejs>>
: StacjaMeterologiczna
<<BazaDanych>>
: DaneMeteorologiczne
<<Aktor>>
: Obsługa
1: raportPogodowy()
2: testuj()
4: zbierzDane()
3: podsumuj()
5: danePogodowe
6: raport
Visual Paradigm for UML Community Edition [not for commercial use]
Diagram sekwencji
•
Prezentuje kolejność wywołań operacji, przepływ sterowania pomiędzy obiektami oraz
szablon realizowanego algorytmu.
•
Składa się z pionowych linii życia (ang. lifelines) poszczególnych obiektów
uczestniczących w interakcji oraz wymienianych między nimi komunikatów (wywołań
operacji). Białe prostokąty umieszczone na linii życia obiektu oznaczają, że obiekt jest
zajęty wykonywaniem pewnej czynności. Czas jest reprezentowany w postaci pionowej
osi diagramu. Fizycznie usunięcie obiektu można wprost oznaczyć jako znak X na linii
życia
Blok
•
Często zachodzi konieczność wskazania specjalnej własności pewnej części
interakcji, np. pętli. Na diagramach sekwencji taką grupę operacji obejmuje
się prostokątem, w którego lewym górnym narożniku, w pięciokącie
umieszcza się słowo kluczowe lub opis określający znaczenie danego bloku
(tzw. operator interakcji), np.:
• alt (od alternative) – określający warunek wykonania bloku operacji,
odpowiadający instrukcji if-else; warunek umieszcza się wówczas wewnątrz
bloku w nawiasach kwadratowych
• opt (od optional) – reprezentujący instrukcję if (bez else)
• par (od parallel) – nakazujący wykonać operacje równolegle
• critical – oznaczający obszar krytyczny
• loop – definiujący pętlę typu for (o określonej z góry liczbie iteracji) lub
while (wykonywanej dopóki pewien warunek jest prawdziwy)
Diagram komunikacji
•
Skupia się on na obiektach wchodzących w skład interakcji i
wymienianymi przez nie komunikatach, natomiast w
mniejszym stopniu niż diagram sekwencji wskazuje na aspekt
czasowy.
•
Komunikacje są przedstawiane za pomocą linii łączących
obiekty, natomiast przesyłane między obiektami komunikaty i
dane są umieszczane obok tych linii. Każdy komunikat jest
opatrzony etykietą liczbową, wskazującą na kolejność
wysłania. Etykieta ma postać liczb oddzielonych kropkami.
Diagram przeglądu interakcji
•
Służy do przedstawiania ogólnego przepływu sterowania w
interakcjach pomiędzy obiektami, korzystając z uproszczonej
notacji diagramu czynności.
•
Na jednym diagramie pokazany jest przepływ sterowania
pomiędzy interakcjami pokazanymi w postaci innych
diagramów, np. sekwencji.
•
Diagram ten może korzystać z większości elementów
obecnych na diagramach czynności: punktu decyzyjnego,
pętli, rozwidlenia i synchronizacji, etc.
Diagram uwarunkowań
czasowych
•
Specjalna forma diagramów interakcji, przeznaczona niemal
wyłącznie do prezentowania zależności związanych z czasem
wykonywania operacji przez obiekt lub grupę obiektów.
•
Linia czasu jest reprezentowana przez poziomą oś diagramu,
natomiast oś pionowa przedstawia kolejne obiekty uczestniczące w
interakcji oraz ich zmieniające się stany wewnętrzne. Odległości
pomiędzy momentami zmian stanów wyznaczają uwarunkowania
czasowe.
•
Diagram ten ma duże znaczenie w modelowaniu systemów czasu
rzeczywistego.
Rozszerzanie UML, język OCL
•
Mechanizm rozszerzania języka UML obejmuje trzy elementy:
- stereotypy (stereotypes), zmieniające lub doprecyzowujące
semantykę elementów modelu. Zapisywane są w danym elemencie w
postaci
<<nazwa stereotypu>>.
- metki (tagged values), dołączające do elementu dodatkowe
właściwości w postaci par {klucz = wartość}. Metki są dołączane do
elementów w postaci notatek.
- profile (profiles), zawierające predefiniowane zestawy stereotypów
i metek dla danej dziedziny zastosowań.
•
Język OCL (Object Constraint Language) – język formalnego
wyrażania ograniczeń w UML
- wyraża dowolną regułę logiczną: warunki wstępne, końcowe,
niezmienniki, wyniki metod etc. w postaci warunku zapisanego w
nawiasach klamrowych
- nie może modyfikować modelu, jedynie go sprawdzać
- można go związać z dowolnym elementem modelu (klasą, operacją,
atrybutem, asocjacją itp.)
Uwagi końcowe
•
Metodologia obiektowa także nie jest idealna.
•
Wiele celów łatwiej jest czasem osiągnąć stosując tradycyjne
metody projektowania.
•
Jednak ze względu na konieczność zapewnienia bezpiecznej
pracy przy tworzeniu dużych systemów informatycznych przez
duże zespoły projektantów – właśnie ta metodologia będzie
zapewne dominująca w przyszłości.
•
Krytycyzm UML:
- przeładowanie
- nie zawsze precyzyjny
- trudności w nauce (wynik powyższych dwóch wad)
- język „do wszystkiego”
- narzędzia CASE często implementują UML „po swojemu”
Budowa modelu
behawioralnego
• Identyfikacja scenariuszy:
– Zbiór scenariuszy, które opisują typowe interakcje
systemu ze światem zewnętrznym.
– Punktem wyjścia jest tu specyfikacja przypadków użycia
systemu, o ile została ona sprecyzowana w Specyfikacji
Wymagań Systemowych. Jeśli nie została, należy je
jawnie zidentyfikować i rozpatrzyć różne przypadki
użycia systemu.
• Identyfikacja zdarzeń:
– Dla danego scenariusza powstaje odpowiadający mu
ślad zdarzeń przedstawiający drogi przepływu zdarzeń
pomiędzy obiektami systemu.
• Budowa diagramów interakcji:
– Dla każdego scenariusza budowane są diagramy
sekwencji oraz (rzadziej) diagramy komunikacji,
przeglądu interakcji oraz przebiegów czasowych.
Budowa modelu
behawioralnego
(c.d.)
• Budowa diagramów stanu (maszyny stanowej):
– Dla każdej klasy modelu obiektowego tworzony jest
diagram stanów opisujących jej zachowanie. Jeśli
zachowanie obiektu klasy jest trywialne można pominąć
jawną specyfikacje ich diagramów stanu.
• Identyfikacja wejść i wyjść.
• Budowa diagramu czynności:
– Definiujemy podstawowe (nie podlegające dalszej
dekompozycji) transformacje danych opisywane jako
zależności funkcyjne między danymi wejściowymi i
wyjściowymi.
– tworzymy diagram czynności, który uwidacznia obliczenia
mające na celu wywiedzenie danych wyjściowych na
podstawie odpowiednich wejść.
• Identyfikacja ograniczeń:
– Identyfikacja zależności, których nie da się wyrazić w
terminach relacji wejście – wyjście i naniesienie ich na
diagramy.
Inżynieria
oprogramowania
Wykład 7 –
zarządzanie przedsięwzięciem
Prezentacja częściowo oparta na prezentacji przygotowanej przez Prof. J.E. Sienkiewicza
(opartej z kolei na podręczniku Iana Sommerville’a Inżynieria oprogramowania, WNT 2003)
Cechy zarządzania procesem
tworzenia oprogramowania
• Produkt jest nieuchwytny. Oprogramowania nie
można dotknąć ani zobaczyć. Zarządzający
standardowym procesem inżynierskim może
oglądać produkt w trakcie jego tworzenia, a jeśli nie
dotrzymano harmonogramu, widać to wyraźnie po
stanie produktu (pewne części budowanej struktury
są w oczywisty sposób nie ukończone). W przypadku
oprogramowania nie ma zwykle takiej możliwości.
• Nie ma standardowych procesów tworzenia
oprogramowania. Nie zostały jeszcze rozpoznane w
sposób wystarczająco precyzyjny związki między
procesem, a typem produktu.
• Wielkie przedsięwzięcia programistyczne są często
jednorazowe. Wielkie przedsięwzięcia
programistyczne są zwykle inne niż poprzednie
przedsięwzięcia.
Rola zarządzania
przedsięwzięciem
programistycznym
• Konieczność zarządzania stanowi istotną różnicę
między programowaniem amatorskim a
profesjonalnym tworzeniem oprogramowania.
• Zarządzanie przedsięwzięciami
programistycznymi jest niezbędne, ponieważ
profesjonalna inżynieria oprogramowania zawsze
podlega ograniczeniom budżetowym i czasowym,
ustalanym przez firmę budującą oprogramowanie.
• Zadaniem kierownika zarządzającego
przedsięwzięciem programistycznym jest
zapewnienie, że przedsięwzięcie zmieści się w
narzuconych ograniczeniach i doprowadzi do
dostarczenia oprogramowania.
Kierownik projektu
Naczelny inżynier
czy główny urzędnik?
• zdolność do przewidywania
• umiejętność motywowania
• przystosowanie się do zmieniającej się
sytuacji
• rozwijanie potencjału podwładnych
• zdolność komunikowania się
• zdecydowanie, zdolność do terminowego
podejmowania decyzji
Czynności procesu zarządzania
• Opracowywanie oferty
• Planowanie i tworzenie
harmonogramu przedsięwzięcia
• Szacowanie kosztów przedsięwzięcia
• Wybór i ocena personelu
• Opracowywanie raportów i
prezentacji
Uwagi wstępne
• Pierwsza faza to opracowanie oferty zawierającej cele i
sposoby realizacji. Zwykle zawiera oszacowanie
kosztów i wstępny harmonogram. Od umiejętności
przygotowywania ofert, która nabywa się wraz z
doświadczeniem, zależy ilość podpisanych kontraktów.
• Planowanie przedsięwzięcia polega na identyfikowaniu
czynności, odbiorców i produktów powstających w
przedsięwzięciu. Następnie należy sformułować plan,
który doprowadzi do osiągnięcia celów
przedsięwzięcia.
• Szacowanie kosztów jest czynnością powiązaną z
planowaniem, która polega na kalkulacji zasobów
koniecznych do realizacji przedsięwzięcia.
• Monitorowanie przedsięwzięcia jest ustawiczna
czynnością. Kierownik musi obserwować postęp
przedsięwzięcia i porównywać rzeczywiste koszty w
stosunku do planów.
Ogólny plan przedsięwzięcia
• Wprowadzenie, w którym opisuje się cele i ograniczenia (np.
budżetu i czasu) mające wpływ na zarządzanie.
• Organizacja przedsięwzięcia, w której opisuje się sposób
organizacji zespołu wytwórczego, osoby i ich funkcje w zespole.
• Analiza zagrożeń, w której opisuje się zagrożenia
przedsięwzięcia, prawdopodobieństwo ich wystąpienia i
proponowane strategie ich zmniejszenia.
• Wymagania stawiane zasobom sprzętowym i programowym, w
których opisuje się sprzęt i pomocnicze oprogramowanie
niezbędne do stworzenia produktu.
• Podział pracy, w którym opisuje się podział przedsięwzięcia na
zadania oraz identyfikuje etapy i produkty związane z tymi
zadaniami.
• Harmonogram przedsięwzięcia, w którym opisuje się zależności
pomiędzy zadaniami, czas potrzebny do ich wykonania oraz
przydział osób do poszczególnych zadań.
• Mechanizmy monitorowania i składania raportów, w których
opisuje się raporty menedżerskie, terminy ich dostarczenia i
sposoby monitorowania całego przedsięwzięcia.
Rodzaje planów
Plan
Opis
Plan jakości
Obejmuje procedury
zapewnienia jakości i standardy
obowiązujące w przedsięwzięciu.
Plan zatwierdzania
Obejmuje podejście, zasoby i
harmonogram zatwierdzania
systemu.
Plan zarządzania konfiguracjami Obejmuje procedury zarządzania
konfiguracjami i używane
struktury.
Plan pielęgnacji
Przewiduje się w nim
wymagania stawiane
pielęgnacji, jej koszty i
niezbędne nakłady.
Plan rozwoju umiejętności
personelu
Opisuje się w nim jak będą
wzrastały umiejętności i
doświadczenie personelu.
Etapy i produkty
• Kierownicy potrzebują informacji. Ponieważ
oprogramowanie nie jest uchwytne, informacje
mogą być dostarczane jedynie w postaci
dokumentów, w których opisano stan
budowanego oprogramowania. Bez tej informacji
nie można ocenić postępów, oszacować kosztów
ani skorygować harmonogramu.
• Planując przedsięwzięcie, należy ustalić etapy,
czyli ukończenie określonego zadania związanego
z jakimś formalnym wynikiem.
• Produkt jest wynikiem przedsięwzięcia,
dostarczanym klientowi. Jest zwykle
przekazywany na zakończenie pewnej, dużej fazy
przedsięwzięcia.
• Produkty są zwykle związane z etapami, ale nie
odwrotnie.
Tworzenie harmonogramu
•Menedżerowie szacują czas i zasoby niezbędne do
ukończenia czynności oraz organizują je w zwarte
sekwencje.
•Tworzenie harmonogramu przedsięwzięcia obejmuje
dzielenie całkowitego nakładu pracy na oddzielne
czynności i kalkulowanie czasu wymaganego na ich
ukończenie.
•Tworzenie harmonogramu przedsięwzięcia jest
szczególnie trudnym zadaniem dla zarządzającego
procesem tworzenia oprogramowania. Staje się
jeszcze bardziej skomplikowane wskutek tego, że w
rozmaitych przedsięwzięciach używa się często
różnych metod projektowania i implementacji.
Wykresy czynności
i wykresy paskowe
Opracuj grafy
przedsięwzięcia
Przydziel osoby
do czynności
Opracuj zasoby
dla czynności
Zidentyfikuj
czynności
Zidentyfikuj
zależności
między
czynnościami
Wymagania stawiane
oprogramowaniu
Problemy przy tworzeniu
harmonogramu
• Nie można zakładać, że każdy etap przedsięwzięcia
będzie wolny od problemów. Zatrudnione osoby
mogą zachorować lub pójść na urlop, sprzęt może
się popsuć, a dostawa podstawowego
oprogramowania wspomagającego lub sprzętu może
się opóźnić.
• Oprócz kalendarza zarządzający muszą także
oszacować zasoby niezbędne do ukończenia każdego
zadania. Najważniejszym zasobem jest praca ludzi.
• Dobrą, praktyczną zasadą jest szacowanie tak, jakby
wszystko miało się udać, a następnie zwiększenie
szacunków, aby uwzględnić nie przewidziane kłopoty.
• Na końcu można wszystko pomnożyć przez
dodatkowy czynnik rezerwy.
Wykresy paskowe i sieci
działań
• Wykresy paskowe i sieci działań to notacje
graficzne stosowane do przedstawiania
harmonogramów przedsięwzięcia.
• Na wykresie paskowym obrazuje się, kto
odpowiada za każdą czynność oraz kiedy
ta czynność ma się rozpocząć i skończyć.
• Za pomocą sieci działań zapisuje się
zależności między różnymi czynnościami
składającymi się na przedsięwzięcie.
• Wykresy paskowe oraz sieci działań mogą
być przygotowywane automatycznie przez
narzędzia wspomagające zarządzanie na
podstawie zawartości bazy danych
przedsięwzięcia.
Zbiór zadań, czas ich trwania
oraz zależności
T – zadania; M – etapy
Sieć działań
T2
M3
T6
T10
M7
T5
T7
M2
T4
M5
T8
4/7/99
8
14/7/99
15
4/8/99
15
25/8/99
7
5/9/99
10
19/9/99
15
11/8/99
25
10
20
5
25/7/99
15
dni
25/7/99
18/7/99
10
T1
M1
T3
T9
M6
T11
M8
T12
M4
początek
dni
dni
dni
dni
dni
dni
dni
dni
dni
dni
dni
koniec
Etap Zadanie
Diagram paskowy czynności
4/7
11/7 18/7 25/7
1/8
8/8
15/8
22/8 29/8
5/9
12/9
19/9
T4
T1
T2
M1
T7
T3
M5
T8
M3
M2
T6
T5
M4
T9
M7
T10
M6
T11
M8
T12
Start
Finish
Przydział personelu
4/7
11/7 18/7 25/
1/8
8/8
15/8 22/8 29/8 5/9
12/9 19/9
T4
T8
T11
T12
T1
T3
T9
T2
T6
T10
T7
T5
Fred
Jane
Anne
Mary
Jim
Personel - motywacja
• Potrzeby osobiste
– potrzeby społeczne: kontakty ze współpracownikami,
współtworzenie atmosfery
– szacunek: okazanie ludziom, że są cenieni przez swoją
firmę (wynagradzanie, publiczne uznanie zasług)
– samorealizacja: odpowiedzialność za własną pracę,
przydzielanie wymagających zadań, program szkoleń
• Zgrany zespół
– poczucie przynależności, identyfikacja z grupą
– odczucie własnej roli w grupie
• Właściwa organizacja pracy
– przydzielanie zadań w zależności od umiejętności i
doświadczeń
– warunki i środowisko pracy
Dobór personelu
• Doświadczenie w zakresie dziedziny
aplikacji
• Doświadczenie w ramach platformy
• Doświadczenie w zakresie języka
programowania
• Wykształcenie
• Zdolność komunikacji w grupie
• Elastyczność
• (!) Postawa
• (!) Osobowość
Dobór personelu – ograniczenia
• Przy wyborze pracowników do przedsięwzięcia,
zarządzający procesem tworzenia oprogramowania
musi działać zgodnie z poniższymi ograniczeniami:
- Zwykle tak bywa, że założony budżet przedsięwzięcia nie
wystarcza na odpowiednio dobre opłacanie personelu. W
związku z tym do realizacji przedsięwzięcia trzeba
przyjmować mniej doświadczonych, a co za tym idzie gorzej
wynagradzanych pracowników.
- Najczęściej trzeba poszukiwać personelu z odpowiednim
doświadczeniem w samej firmy bądź w jej otoczeniu. Należy
jednak wziąć pod uwagę, że najlepsi ludzie w firmie mogą już
brać udział w innych przedsięwzięciach.
- Firma może oczekiwać, że pracownicy będą doskonalić
swoje umiejętności. Do przedsięwzięcia przydziela się
wówczas mniej doświadczone osoby, aby w jego trakcie
uczyły się i zdobywały doświadczenie i nowe umiejętności.
Praca zespołowa
• Spójny, zgrany zespół – pożądany cel!
– lojalność
– identyfikacja z zespołem
– dążenie do tych samych celów
– ścisła współpraca
– znajomość pracy wykonywanej przez
innych
członków zespołu
– „programowanie niesamolubne”
• Cienie:
– nieograniczona lojalność względem „wodza”
– „syndrom myślenia grupowego”
Komunikacja w zespole
Czynniki wpływające na zdolność komunikacyjną:
• rozmiar zespołu: trudności komunikacyjne rosną z
kwadratem rozmiaru zespołu; zalecenie: nie
przekraczać 8 osób
• modele organizacji zespołu
• status i predyspozycje członków zespołu
• otoczenie
- rola wspólnego pomieszczenia i udogodnień
socjalnych - „automaty z kawą”;
- sąsiednie pokoje w instytucie.
Przykłady modeli organizacji
• Zespół nieformalny
• Zespół głównego programisty:
– główny programista
– drugi programista
– bibliotekarz
– specjaliści:
administrator
narzędziowiec
specjalista ds. systemu operacyjnego
kierownik testów
Zarządzanie zagrożeniami
• Ważnymi zadaniami zarządzającego
przedsięwzięciem jest przewidywanie zagrożeń,
które mogą mieć wpływ na harmonogram
przedsięwzięcia lub jakość budowanego
oprogramowania, oraz podejmowanie działań w celu
uniknięcia tych zagrożeń.
• Kategorie zagrożeń można podzielić w następujący
sposób:
– zagrożenia przedsięwzięcia mają wpływ na zasoby
i harmonogram przedsięwzięcia,
– zagrożenia produktu mają wpływ na jakość i
efektywność budowanego oprogramowania,
– zagrożenia przedsiębiorstwa maja wpływ na
przedsiębiorstwo budujące bądź zaopatrujące się
w oprogramowanie.
Wyszczególnienie zagrożeń
Proces zarządzania
zagrożeniami
•
Identyfikacja zagrożeń
–
Identyfikuje się możliwe zagrożenia przedsięwzięcia, produktu i
przedsiębiorstwa.
•
Analiza zagrożeń
–
Ocenia się prawdopodobieństwo i konsekwencje zagrożeń.
•
Planowanie przeciwdziałania zagrożeniom
–
Opracowuje się plany radzenia sobie z tymi zagrożeniami przez ich
unikanie lub zmniejszanie ich następstw.
•
Monitorowanie zagrożeń
–
Ustawicznie ocenia się zagrożenia i koryguje plany ich łagodzenia w
miarę napływu coraz lepszych informacji o tych zagrożeniach.
Ocena
zagrożeń
Identyfikacja
zagrożeń
Analiza
zagrożeń
Lista
potencjalnych
zagrożeń
Lista zagrożeń
z przypisanymi
priorytetami
Przeciwdziałania
zagrożeniom
Monitorowanie
zagrożeń
Ocena zagrożeń
Plany
unikania
zagrożeń
i awaryjne
Identyfikacja zagrożeń
• Zagrożenia technologiczne
• Zagrożenia ze strony ludzi
• Zagrożenia organizacyjne
• Zagrożenia narzędziowe
• Zagrożenia wymagań
• Zagrożenia szacowania
Czynniki ryzyka
Typy zagrożeń
Analiza zagrożeń
Zarządzanie zagrożeniami
Przeciwdziałanie zagrożeniom
• W procesie planowania przeciwdziałania
zagrożeniom bierze się pod uwagę każde poważne
zagrożenie i opracowuje strategię panowania nad
nim.
• Strategie unikania
–
Ich zastosowanie prowadzi do zmniejszenia
prawdopodobieństwa wystąpienia zagrożenia.
• Strategie minimalizacji
–
Ich zastosowanie prowadzi do zmniejszenia konsekwencji
zagrożenia.
• Plany awaryjne
–
Ich zastosowanie polega na przygotowaniu się i
opracowaniu strategii przeciwdziałania na wypadek
najgorszego.
Inżynieria
oprogramowania
Wykład 8 –
szacowanie kosztu
oprogramowania
Prezentacja częściowo oparta na prezentacji przygotowanej przez Prof. J.E. Sienkiewicza
(opartej z kolei na podręczniku Iana Sommerville’a Inżynieria oprogramowania, WNT 2003)
Szukamy odpowiedzi na
pytania:
• Ile pracy trzeba na ukończenie
czynności?
• Ile czasu kalendarzowego trzeba na
ukończenie czynności?
• Jaki jest całkowity koszt czynności?
Składniki kosztu
wytworzenia oprogramowania
– koszt sprzętu wraz z pielęgnacją,
– koszt oprogramowania wraz z pielęgnacją,
– koszty podróży służbowych,
– koszt szkoleń,
– koszt pracy
Składniki całkowitego kosztu
pracy
• Koszt udostępnienia, ogrzania i oświetlenia
przestrzeni biurowej.
• Koszt personelu pomocniczego związanego
np.
z
prowadzeniem
księgowości
i
sekretariatu, sprzątaniem i pomocą
techniczną.
• Koszt sieci komputerowej i telekomunikacji.
• Koszt udogodnień centralnych, takich jak
biblioteka, pomieszczenia rekreacyjne.
• Koszt ubezpieczenia społecznego, m.in. na
świadczenia dla pracowników, takie jak
emerytury i ubezpieczenie zdrowotne.
uproszczony schemat kalkulacji ceny:
cena = koszt + zysk
koszt marża (zysk) kalkulacja
ceny
zysk cena kalkulacja
kosztów
Kalkulacja ceny
oprogramowania
Od czego w rzeczywistości
zależy cena oprogramowania?
Czynnik
Przykładowy opis
Okazja rynkowa
Przedsiębiorstwo produkujące może podać niską cenę, ponieważ chce
zaistnieć w nowym segmencie rynku oprogramowania. Zgoda na mały
zysk z jednego przedsięwzięcia może dać okazję do późniejszych zysków.
Zdobyte doświadczenie może umożliwić tworzenie nowych produktów.
Niepewność
Jeśli przedsiębiorstwo nie jest pewne swoich szacunków kosztów, to może
oszacowania
zwiększyć cenę o pewien czynnik rezerwowy powyżej swego zwykłego
kosztów
zysku.
Warunki umowy
Klient może wyrazić zleceniobiorcy zgodę na zatrzymanie prawa własności
kodu źródłowego i wielokrotne wykorzystanie go w następnych
przedsięwzięciach. Ustalona cena może być wówczas niższa niż w wypadku
przekazania kodu źródłowego klientowi.
Płynność
Jeśli wymagania przypuszczalnie będą się zmieniać, to firma może obniżyć
wymagań
cenę, aby zdobyć kontrakt. Po przyznaniu kontraktu można zażądać
wysokich cen za zmiany wymagań.
Kondycja
Firmy produkujące w złej kondycji finansowej mogą obniżać swoje ceny w
finansowa
celu zdobycia kontraktu. Od wypadnięcia z rynku lepszy jest mniejszy niż
zwykle zysk lub nawet strata.
Produktywność
• W
procesie
tworzenia
oprogramowania
menedżerowie muszą oceniać produktywność
inżynierów.
Takie
oszacowania
mogą
być
niezbędne
przy
szacowaniu
kosztów
przedsięwzięcia i przy ustalaniu, czy ulepszenia
procesowe i technologiczne były skuteczne.
• Problemy z określeniem produktywności:
- W wypadku budowy oprogramowania istnieje
wiele różnych rozwiązań o różnych atrybutach.
- Gdy pojawiają się dwa rozwiązania o różnych
atrybutach, porównywanie szybkości ich tworzenia
nic tak naprawdę nie daje. Jedno rozwiązanie może
działać bardziej efektywnie, podczas gdy inne jest
bardziej czytelne i łatwiejsze do pielęgnacji.
Czynniki wpływające na
produktywność
Czynnik
Opis
Wiedza
Wiedza z dziedziny zastosowania jest konieczna do skutecznego tworzenia
z dziedziny
oprogramowania. Inżynierowie, którzy już rozumieją dziedzinę, będą
zastosowania
najbardziej produktywni.
Jakość procesu Zastosowany proces tworzenia może mieć znaczący wpływ na
produktywność.
Wielkość
Im przedsięwzięcie jest większe, tym więcej trzeba komunikacji zespołu.
przedsięwzięcia
Mniej czasu pozostaje na tworzenie, więc indywidualna produktywność
jest mniejsza.
Wspomaganie Dobre wspomaganie technologiczne, takie jak narzędzia CASE, pomocnicze
technologiczne systemy zarządzania konfiguracjami itd. mogą poprawić produktywność.
Środowisko
Ciche środowisko pracy z prywatnymi miejscami pracy przyczynia się do
pracy
wzrostu produktywności.
Rodzaje miar
• Miary wielkościowe. Są związane z
wielkością pewnego wyniku czynności.
Najczęściej stosowaną wielkościową
miarą produktywności jest liczba wierszy
dostarczonego kodu źródłowego.
• Miary funkcyjne. Są związane z ogólną
funkcjonalnością dostarczonego
oprogramowania. Produktywność
wyraża się w kategoriach ilości
użytecznej funkcjonalności dostarczonej
w pewnym czasie.
Szacowanie kosztu pracy
programisty za pomocą liczby
wierszy kodu
• Liczba wierszy kodu na miesiąc pracy
programisty to szeroko stosowana miara
produktywności.
• Wyznacza się ją przez obliczenie całkowitej
liczby dostarczonego kodu źródłowego. Tę
liczbę dzieli się następnie przez miesiące
pracy
programisty,
konieczne
do
ukończenia przedsięwzięcia.
• Ten czas obejmuje zatem czas potrzebny
na analizę, projektowanie, kodowanie i
dokumentowanie.
Czas budowania systemu
Analiza Projek- Kodowanie
Testowanie
Dokumentowanie
towanie
Asembler
3 tyg.
5 tyg.
8 tyg.
10 tyg.
2 tyg.
Język wysokiego 3 tyg.
5 tyg.
8 tyg.
6 tyg.
2 tyg.
poziomu
Wielkość
Praca
Produktywność
Asembler
500 wierszy
28 tyg.
714 wierszy/miesiąc
Język wysokiego 1500 wierszy
20 tyg.
300 wierszy/miesiąc
poziomu
Szacowanie kosztu pracy
programisty za pomocą punktów
funkcyjnych
Inną stosowaną miarą jest liczba punktów funkcyjnych.
Całkowitą liczbę punktów funkcyjnych wyznacza się przez
zmierzenie lub oszacowanie następujących elementów
programu:
- zewnętrzne dane wejściowe i wyjściowe,
- interakcje z użytkownikiem,
- interfejsy zewnętrzne,
- pliki używane przez system.
Wagi: od 3 (proste dane wejściowe) do 15 (złożone pliki)
UFC = ∑ liczba_elementów_danego_typu x waga
Punkty funkcyjne są niezależnie od języka, można więc za
ich pomocą porównywać produktywność w różnych
językach programowania. Produktywność wyraża się jako
liczby punktów funkcyjnych utworzonych w czasie
miesiąca.
Szacowanie kosztu pracy
programisty za pomocą punktów
obiektowych
W przypadku stosowania narzędzi obiektowych,
stosujemy miarę w postaci liczby punktów
obiektowych - miarę ważoną następujących
składników:
- liczba różnych wyświetlanych ekranów
(prosty ekran to 1 punkt obiektowy, bardzo
złożony ekran - 3)
- liczba tworzonych raportów (prosty raport to
2 punkty obiektowe, bardzo złożony - 8
punktów)
- liczba modułów napisanych w językach
proceduralnych, które należy opracować w
celu uzupełnienia kodu (każdy moduł liczy się
jako 10 punktów obiektowych.
Miary – uwagi końcowe
• Kłopot miarami wyrażonymi za pomocą ilości w
czasie polega na tym, że nie bierze się w nich pod
uwagę
niefunkcjonalnych
właściwości
oprogramowania,
takich
jak
niezawodność,
zdatność do pielęgnacji itd.
• Miary nie biorą też pod uwagę możliwości
wielokrotnego
użycia
wytworzonego
oprogramowania
• Wielkość kodu = AVC x UFC
(AVC – średnia liczba wierszy kodu niezbędnych
do zaimplementowania punktu funkcyjnego; 200-
300 dla asemblera, 2-40 dla języków wysokiego
poziomu)
Szacowanie pracy potrzebnej do
zbudowania oprogramowania
• Nie istnieje prosty sposób dokładnego szacowania
pracy niezbędnej do zbudowania systemu
oprogramowania.
• Wstępne szacunki muszą być wykonywane na
podstawie definicji wymagań.
• Oprogramowanie może być przeznaczone do
działania na słabo znanym komputerze lub jego
tworzenie może odbywać się z użyciem nowej
technologii.
• Ludzie biorący udział w przedsięwzięciu i ich
umiejętności nie będą prawdopodobnie znane.
Wszystkie te czynniki oznaczają, że trudno jest
podać dokładnie oszacowanie kosztu budowania
systemu we wczesnej fazie przedsięwzięcia.
Metody szacowania kosztów
Metoda
Opis
Algorytmiczne
Na podstawie historycznej informacji o kosztach opracowuje się model, który wiąże
modelowanie
pewną miarę oprogramowania (zwykle jego wielkość) z kosztem przedsięwzięcia.
kosztów
Szacuje się wartość tej miary i na podstawie modelu ustala się wymaganą pracę.
Ocena
Zasięga się rady kilku ekspertów od zaproponowanych metod tworzenia
ekspertów
oprogramowania i dziedziny zastosowania. Każdy z nich szacuje koszt
przedsięwzięcia. Te szacunki porównuje się i omawia. Proces szacowania powtarza
się do chwili ustalenia uzgodnionego oszacowania.
Szacowanie przez
Tę metodę można zastosować, jeśli ukończono już podobne przedsięwzięcia w tej
analogię
samej dziedzinie zastosowań. Koszt nowego przedsięwzięcia ocenia się przez
analogię do kosztów tych zakończonych przedsięwzięć.
Prawo
Prawo Parkinsona mówi, ze praca rozciąga się tak, że wypełnia wyznaczony czas.
Parkinsona
Koszt jest determinowany przez dostępne zespoły, a nie przez obiektywną ocenę.
Jeśli oprogramowanie musi być dostarczone w ciągu 12 miesięcy i mamy do
dyspozycji pięć osób, to niezbędną pracę ocenia się na 60 osobomiesięcy.
Ustalanie ceny
Koszt oprogramowania jest szacowany na tyle, ile klient może wydać na to
pod zwycięstwo przedsięwzięcie. Przybliżona praca zależy od budżetu klienta, a nie od
funkcjonalności oprogramowania.
Problemy z doświadczalnym
wyznaczaniem kosztów
• Zmiany w technologii tworzenia oprogramowania,
które
mogą
wpłynąć
na
doświadczalne
szacowanie kosztów:
– tworzenie
obiektowe
zamiast
tworzenia
funkcyjnego
– system klient-serwer zamiast systemu na
komputerze głównym
– wielokrotne
wykorzystania
kodu:
użycie
komponentów z półki zamiast tworzenia tych
komponentów
– użycie
narzędzi
CASE
i
generatorów
programów zamiast tworzenia oprogramowania
bez takiego wspomagania.
Modelowanie algorytmiczne
kosztów
• Model algorytmiczny kosztów można zbudować
analizując
koszty
i
atrybuty
ukończonych
przedsięwzięć.
• Do przewidywania kosztów używa się formuły
matematycznej,
w
której
uwzględnia
się
oszacowanie wielkości przedsięwzięcia, liczbę
programistów oraz inne czynniki procesowe i
produktowe.
• Większość modeli algorytmicznych szacowania
zawiera komponent wykładniczy. Odzwierciedla
on fakt, że zwykle koszt nie rośnie liniowo wraz ze
wzrostem wielkości przedsięwzięcia.
Ogólna postać
oszacowania algorytmicznego
• Praca = A x Wielkość
B
x M
• A jest stałym czynnikiem, który zależnie od
lokalnych zwyczajów firmy i rodzaju
tworzonego oprogramowania.
• Wartość wykładnika B zwykle waha się
między
1
i
1,5.
Odzwierciedla
nieproporcjonalność pracy niezbędnej w
wypadku wielkich przedsięwzięć.
• M to mnożnik określany na podstawie
połączenia różnych atrybutów procesu,
produktu i tworzenia.
Dokładność szacunków na
podstawie modelu
algorytmicznego
•Zależy od dostępnej informacji o systemie.
•W miarę postępów procesu tworzenia oprogramowania pojawia się
coraz więcej informacji – oszacowania stają się coraz bardziej
precyzyjne.
x
2x
4x
0.5x
0.25x
Wykonalność
Wymagania
Projekt
Kod
Dostarczenie
Model COCOMO
• Wywnioskowano go na podstawie danych
zebranych z wielkiej liczby przedsięwzięć
programistycznych.
• Zanalizowano je w celu wykrycia formuł
najlepiej pasujących do obserwacji.
• Jest dobrze udokumentowany, publicznie
bezpłatnie dostępny i wspomagany przez
narzędzia bezpłatne i komercyjne.
• Ma długi rodowód od pierwszego wcielenia
w 1981, poprzez poprawki w celu
dostosowania
do
tworzenia
oprogramowania w języku Ada (1989), aż do
najnowszej wersji opublikowanej w 1995 r.
Podstawowy model COCOMO
81
Złożoność
Formuła
Opis
przedsięwzięcia
Mała
PM = 2,4 (KDSI)
1,05
* M
Zrozumiałe programy
użytkowe
tworzone przez małe zespoły.
Średnia
PM = 3,0 (KDSI)
1,12
* M
Bardziej złożone
przedsięwzięcia, w
których członkowie zespołu
mogą mieć
ograniczone doświadczenia z
podobnymi systemami.
Duża
PM = 3,6 (KDSI)
1,20
* M
Złożone przedsięwzięcia,
w których
oprogramowanie jest częścią
silnie
powiązanego złożonego sprzętu,
oprogramowania, regulacji i
procedur
działania.
(KDSI – 1000 linii kodu źródłowego)
Model COCOMO 2
• Stosowany na trzech etapach (poziomach)
tworzenia systemu:
- poziom wczesnego projektowania
- poziom postarchitektoniczny
- poziom wczesnego prototypowania
• W odróżnieniu od modelu 81, uwzględnia
różne nowe podejścia do tworzenia
oprogramowania
• Czynnik skali jest sparametryzowany,
zarówno jak i mnożnik M.
• Czynnik A przyjmowany jest na poziomie
2.5
Wyznaczanie czynnika skali
Czynnik skali jest wyznaczany na podstawie następujących parametrów
(ocenianych w skali 0-5):
• Nadrzędność: wcześniejsze doświadczenia firmy z przedsięwzięciami
danego rodzaju
• Elastyczność tworzenia: użycie nakazanego procesu wytwarzania
oprogramowania lub ustalenie przez klienta jedynie ogólnych celów
• Ocena przeprowadzonej analizy ryzyka
• Spójność zespołu: ocena trudności komunikacyjnych
• Ocena dojrzałości procesu wytwarzania oprogramowania w firmie
B = 1.01 + suma_ocen/100
Przykład: małe doświadczenie (4), brak udziału klienta (1), brak oceny
ryzyka (5), nowy zespół (3), przeciętna dojrzałość procesu (3);
B=1.17
Wyznaczanie mnożnika M
Na poziomie postarchitektonicznym mnożnik M jest wyznaczany jako iloczyn 17
parametrów, szacowanych zwykle w zakresie [0.5 – 1.5]. 1 – wartość
neutralna.
Produkt:
RUSE – wymagany stopień użycia wielokrotnego; DATA – rozmiar użytej bazy
danych; CPLX – złożoność modułów systemowych; DOCU – zakresy
wymaganej dokumentacji; RELY – wymagana niezawodność systemu
Sprzęt:
STOR – ograniczenia pamięciowe; TIME – ograniczenia wydajnościowe; PVOL –
płynność platformy tworzenia
Personel:
PEXP – doświadczenie programistów; PCON – ciągłość zatrudnienia personelu;
ACAP – możliwości analityków; AEXP – doświadczenie analityków; PCAP –
możliwości programistów; LTEX – doświadczenie w zakresie języków i narzędzi
Przedsięwzięcie:
TOOL – użycie narzędzi wspomagających; SCED – kompresja harmonogramu;
SITE – stopień rozproszenia pracy
Przykład
Koszt pracy (osobomiesiące): PM = A x Wielkość
B
x M
Wielkość systemu: 128 000 DSI
B = 1.17; A = 2.5; Wielkość = 128; M = 1
Wynik: 730 osobomiesięcy
Modyfikatory M: wymagana duża niezawodność (1.39), duża złożoność
(1.3), ograniczenia pamięciowe (1.21), małe użycie narzędzi (1.12),
przyspieszony harmonogram (1.29)
Wynik – 2306 osobomiesięcy
Modyfikatory M: wymagana mała niezawodność (0.75), mała
złożoność (0.75), brak ograniczenia pamięciowych (1), duże użycie
narzędzi (0.72), normalny harmonogram (1)
Wynik – 295 osobomiesięcy
Modele algorytmiczne kosztów w
planowaniu przedsięwzięć
• Menedżerowie przedsięwzięć mogą użyć
modelu
algorytmicznego
kosztów
do
porównania różnych sposobów inwestowania
pieniędzy w celu zmniejszenia kosztów
przedsięwzięcia.
• Jest to szczególnie istotne tam, gdzie
konieczny
jest
kompromisowy
wybór
droższego sprzętu albo oprogramowania,
oraz tam, gdzie trzeba przyjąć nowy personel
z
umiejętnościami
specyficznymi
dla
przedsięwzięcia.
Opcje menedżerów
A. Użycie istniejącego sprzętu,
systemu tworzenia i zespołu
wytwórczego
A. Użycie istniejącego sprzętu,
systemu tworzenia i zespołu
wytwórczego
D. Bardziej
doświadczony
personel
D. Bardziej
doświadczony
personel
C. Ulepszenie tylko
pamięci
Rośnie koszt
sprzętu
C. Ulepszenie tylko
pamięci
Rośnie koszt
sprzętu
B. Ulepszenie procesora i pamięci
Rośnie koszt sprzętu
Doświadczenie maleje
B. Ulepszenie procesora i pamięci
Rośnie koszt sprzętu
Doświadczenie maleje
F. Personel
z doświadczeniami
ze sprzętem
F. Personel
z doświadczeniami
ze sprzętem
E. Nowy system tworzenia
Rośnie koszt sprzętu
Doświadczenie maleje
E. Nowy system tworzenia
Rośnie koszt sprzętu
Doświadczenie maleje
Koszty opcji menedżerów
Opcja RELY STOR TIME TOOL LTEX PM Koszt
Koszt
Koszt
(osobomies.) oprogramowania sprzętu
całkowity
A 1,39 1,06 1,11 0,86 1 63 949 393
100 000 1 049 393
B 1,39 1 1 1,12 1,22 88 1 313 550
120 000 1 402 025
C 1,39 1 1,11 0,86 1 60 895 653
105 000 1 000 653
D 1,39 1.06 1,11 0,86 0,84 51 769 008
100 000 897 490
E 1,39 1 1 0,72 1,22 56 844 425
220 000 1 044 159
F 1,39 1 1 1,12 0,84 57 851 180
120 000 1 002 706
Szacowanie czasu
w modelu COCOMO
Przeciętny harmonogram przedsięwzięcia:
TDEV = 3 x (PM)
(0,33 + 0,2 x
(B – 1,01))
•
PM to oszacowanie pracy w osobomiesiącach. B to wykładnik
obliczony zgodnie z wcześniejszymi rozważaniami.
Przykład:
pracę
niezbędną
do
ukończenia
przedsięwzięcia
oszacowano na 60 osobomiesięcy.
•
Załóżmy, że wartością wykładnika B jest 1,17.
•
Na podstawie równania harmonogramu obliczamy czas
niezbędny do ukończenia przedsięwzięcia:
TDEV = 3(60)
0,36
= 13 miesięcy
Optymalna liczba osób zatrudniona w projekcie:
P = PM / TDEV = (przykład) 60/13 ≈ 5 osób
Inżynieria
oprogramowania
Wykład 9 –
projektowanie architektoniczne.
Prezentacja częściowo oparta na prezentacji przygotowanej przez Prof. J.E. Sienkiewicza
(opartej z kolei na podręczniku Iana Sommerville’a Inżynieria oprogramowania, WNT 2003)
Projektowanie architektoniczne
• Wielkie systemy są zwykle podzielone na
podsystemy, które oferują pewien zbiór
powiązanych ze sobą interfejsów.
• Produktem tej fazy procesu jest opis
architektury oprogramowania.
• Model architektoniczny może być punktem
początkowym
do
specyfikowania
rozmaitych części systemu.
• Obejmuje identyfikację najważniejszych
komponentów systemu i komunikacji
między nimi.
Etapy
projektowania
architektonicznego
• Strukturalizacja systemu
– System jest dzielony na kilka podstawowych
podsystemów, przy czym podsystem jest
niezależną jednostką oprogramowania. Identyfikuje
się też komunikację między podsystemami.
• Modelowanie sterowania
– Określa się ogólny model związków sterowania
między częściami systemu.
• Podział na moduły
– Każdy zidentyfikowany podsystem jest dzielony na
moduły.
Podsystemy i moduły
• Podsystem jest systemem na swoich
własnych prawach; jego usługi nie zależą
od
usług
oferowanych
przez
inne
podsystemy. Podsystemy składają się z
modułów i mają interfejsy używane do
komunikacji z innymi podsystemami.
• Moduł jest zwykle komponentem systemu,
który oferuje co najmniej jedną usługę
innym modułom. Korzysta z usług innych
modułów. Zwykle nie jest traktowany jako
niezależny system. Moduły są zwykle
zbudowane z kilku innych, prostszych
komponentów systemu.
• Statyczny model strukturalny obejmuje
komponenty lub podsystemy, które można
zbudować jako niezależne jednostki.
• Model dynamiczny procesu, w którym
przedstawia się podział systemu na procesy
czasu wykonania.
• Model interfejsów, w którym definiuje się
usługi oferowane przez każdy podsystem za
pośrednictwem jego interfejsu publicznego.
• Model związków, który obejmuje związki,
takie
jak
przepływ
danych
między
podsystemami.
Opracowywanie modeli
architektonicznych
Pożądane własności
architektury systemu
• Efektywność
– Krytyczne operacje w niewielkiej liczbie podsystemów.
• Zabezpieczenie
– Należy zastosować w architekturze strukturę
warstwową.
• Bezpieczeństwo
– Operacje dotyczące bezpieczeństwa powinny znaleźć się
w jednym podsystemie lub w niewielkiej liczbie
podsystemów.
• Zdatność do pielęgnacji
– Architektura systemu powinna składać się z
samodzielnych komponentów, można uwzględnić w
architekturze komponenty nadmiarowe
Strukturalizacja systemu
• Faza
projektowania
architektonicznego
polegająca na podziale systemu na zbiór
oddziałujących ze sobą podsystemów.
• Na najbardziej abstrakcyjnym poziomie
projekt architektoniczny można przedstawić w
postaci diagramu blokowego, na którym
każdy prostokąt odpowiada podsystemowi.
• Prostokąty wewnątrz prostokąta oznaczają, że
taki
podsystem
dalej
podzielono
na
podsystemy.
• Strzałki wskazują, że dane lub sterowanie są
przekazywane między podsystemami zgodnie
z kierunkiem grotu.
Diagram blokowy systemu
sterującego robotem
System
wizyjny
System
identyfikacji
przedmiotów
Sterownik
alarmu
Sterownik
chwytacza
System
pakujący
System
wyboru
opakowania
Sterownik
taśmociągu
Model repozytorium
• Aby
efektywnie
współpracować,
podsystemy
wchodzące w skład systemu muszą wymieniać
między sobą informacje.
A. Wszystkie współdzielone dane znajdują się w centralnej
bazie danych, z której mogą korzystać wszystkie
podsystemy. Model systemu oparty na współdzielonej bazie
danych jest czasem nazywany modelem repozytorium.
B. Każdy podsystem prowadzi własną bazę danych. Dane są
przekazywane innym podsystemom przez wysyłanie
komunikatów.
• Większość systemów używających dużej ilości
danych jest zbudowanych wokół centralnej bazy
danych lub repozytorium. Ten model jest więc
przystosowany do zastosowań, w których dane są
generowane przez jeden podsystem, a używane
przez inny.
Architektura zintegrowanego
zestawu narzędzi CASE
Translator
projektów
Edytor
programów
Generator
raportów
Analizator
projektów
Generator
kodu
Edytor
projektów
Repozytorium
przedsięwzięcia
Zalety i wady współdzielonego
repozytorium
• Efektywny sposób współdziałania dużych ilości danych. Nie
ma potrzeby jawnej transmisji danych z jednego podsystemu
do drugiego.
• Twórcy podsystemów musza jednak uzgodnić model danych
repozytorium.
• Podsystemy produkujące dane nie muszą zajmować się
sposobem użycia tych danych przez inne podsystemy.
• Ewolucja może być jednak trudna.
• Czynności takie jak tworzenie kopii zapasowej, sterowanie
zabezpieczeniami i dostępem oraz odtwarzanie po awarii są
scentralizowane.
• Różne podsystemy mogą mieć jednak odmienne wymagania
stawiane zabezpieczeniom oraz strategii odtwarzania i
kopiom zapasowym.
• Model współdziałania jest widoczny przez schemat
repozytorium. Integracja nowych narzędzi jest bardzo łatwa.
• Może być jednak trudno rozproszyć repozytorium na kilku
maszynach.
Model klient-serwer
• Architektoniczny model klient-serwer jest
modelem rozproszonego systemu, w
którym dane i przetwarzanie są rozdzielone
między zbiór procesorów.
1.
Zbiór samodzielnych serwerów oferujących
usługi innym podsystemom. Przykładami
są serwery wydruku realizujące usługi
drukowania, serwery plików realizujące
usługi zarządzania plikami.
2.
Zbiór klientów, którzy korzystają z usług
oferowanych przez serwery. Zwykle same
w sobie są podsystemami.
3.
Sieć, która daje klientom dostęp do tych
usług.
Architektura systemu biblioteki
filmów i zdjęć
Klient 4
Klient 3
Klient 2
Klient 1
Serwer
katalogu
Katalog
Serwer
filmów
Pliki z
filmami
Serwer
Zdjęć
Zdjęcia w
postaci
cyfrowej
Sieć szerokopasmowa
Zalety i wady modelu klient-
serwer
• Największa zaleta modelu klient-serwer polega na
tym, że jest to architektura rozproszona. Umożliwia
to efektowne użycie systemów sieciowych z dużą
liczba rozproszonych procesorów. Łatwo jest dostać
nowy serwer i zintegrować go z resztą systemu albo
przezroczyście aktualizować serwery bez wpływania
na inne części systemu.
• Do odniesienia pełnych korzyści z integracji nowego
serwera może być jednak konieczne wprowadzenie
pewnych
zmian
w
istniejących
klientach
i
serwerach. Nie ma dzielonego modelu danych i
podsystemy porządkują zwykle swoje dane na różne
sposoby.
Oznacza
to
potrzebę
określenia
specyficznego modelu danych dla każdego serwera,
który umożliwi zoptymalizowanie jego efektywności.
Modele sterowania
• Modele do strukturalizacji systemu opisują sposób
podziału
systemu
na
podsystemy.
Aby
podsystemy pracowały jako jeden system, należy
nimi sterować tak, żeby ich usługi były
dostarczone we właściwe miejsce i we właściwym
czasie.
• Sterowanie scentralizowane
– Jeden podsystem jest całościowo odpowiedzialny za
sterowanie; to on uruchamia i zatrzymuje inne
podsystemy.
• Sterowanie zdarzeniowe
– Informacja o sterowaniu nie jest wbudowana w
podsystem, ale każdy system może reagować na
zdarzenia zachodzące na zewnątrz. Te zdarzenia mogą
występować w innych podsystemach lub w otoczeniu
systemu.
Sterowanie scentralizowane
• Model wywołanie-powrót
– Jest to dobrze znany model podprogramów, w
którym sterowanie zaczyna się na wierzchołku
hierarchii podprogramów i przez wywołania
podprogramów przechodzi do niższych
poziomów drzewa..
• Model menedżera
– Ten model można zastosować w wypadku
systemów współbieżnych. Jeden z
komponentów systemu jest wybierany do roli
menedżera systemu i steruje rozpoczynaniem,
zatrzymywaniem i koordynacją innych
procesów systemu.
Sterowanie zdarzeniowe
• Modele sterowania zdarzeniowego są sterowane
zdarzeniami pochodzącymi z zewnątrz.
• Dwa modele sterowania zdarzeniowego:
– Modele rozgłaszania. W takich modelach
zdarzenie jest w zasadzie ogłoszeniem dla
wszystkich podsystemów. Każdy podsystem,
który może obsłużyć to zdarzenie, reaguje na
nie.
– Modele z przerwaniami. Są używane wyłącznie
w systemach czasu rzeczywistego, gdzie
zewnętrzne przerwania są wykrywane przez
obsługę
przerwań.
Następnie
są
one
przekazywane do innego komponentu, który je
przetworzy.
Rozkład na moduły
• Po zaprojektowaniu architektury strukturalnej
następnym krokiem procesu projektowania
architektonicznego jest podział podsystemów na
moduły. Nie ma precyzyjnego rozróżnienia między
podziałem systemu, a podziałem na moduły.
• Dwa modele służą do podziału podsystemu na
moduły:
– Model obiektowy. System jest dzielony na zbiór
porozumiewających się obiektów.
– Model przepływu danych. System jest dzielony
na moduły funkcjonalne, które pobierają dane
wejściowe i w jakiś sposób przetwarzają je na
dane wyjściowe.
Projekt systemu
• Podział na podsystemy i moduły
(w praktyce może to być zgrupowanie gotowych już klas w pakiety
UML odpowiadające funkcjonalnie modułom i podsystemom)
oraz propozycja modelu sterowania
• Projekt interfejsu użytkownika
• Projekt bazy danych
• Projekt użytych algorytmów
• Ogólny kosztorys oparty na modelu
COCOMO
Inżynieria
oprogramowania
Wykład 10 –
architektury systemów
rozproszonych.
Prezentacja częściowo oparta na prezentacji przygotowanej przez Prof. J.E. Sienkiewicza
(opartej z kolei na podręczniku Iana Sommerville’a Inżynieria oprogramowania, WNT 2003)
Systemy rozproszone
• W
systemie
rozproszonym
przetwarzanie
informacji jest wykonywane na kilku komputerach,
a nie przydzielone do jednej maszyny.
• W szczególnym przypadku przetwarzanie może
odbywać
się
na
jednym
komputerze
wieloprocesorowym, a nawet jednoprocesorowym.
• Niemal
wszystkie
współczesne
systemy
komputerowe są systemami rozproszonymi.
• Inżynieria systemów rozproszonych ma wiele
wspólnego z inżynierią każdego innego rodzaju
oprogramowania, istnieją jednak specyficzne
zagadnienia, które należy wziąć pod uwagę,
projektując takie systemy.
Rodzaje systemów
• Systemy osobiste, które nie są rozproszone i są
przeznaczone do pracy na komputerze osobistym
lub stacji roboczej. Przykłady: procesory tekstów,
arkusze kalkulacyjne, systemy graficzne itd.
• Systemy wbudowane, które działają na jednym
procesorze
lub
na
zintegrowanej
grupie
procesorów. Przykłady: systemy sterowania
sprzętem
domowym,
systemy
sterujące
przyrządami.
• Systemy
rozproszone,
w
których
oprogramowanie systemowe działa na luźno
zintegrowanej
grupie
współpracujących
procesorów
połączonych
siecią.
Przykłady:
systemy bankomatów, systemy rezerwacji,
systemy pracy grupowej itd.
Cechy systemu rozproszonego
• Współdzielenie zasobów
• Otwartość
• Współbieżność
• Skalowalność
• Odporność na awarie
• Przezroczystość
• Złożoność
• Trudność zabezpieczenia
• Trudność zarządzania
• Nieprzewidywalność
Wady systemów rozproszonych
Zagadnienia projektowania
systemów rozproszonych
Zagadnienia
Opis
projektowe
Identyfikacja
Zasoby systemu rozproszonego są rozmieszczone na różnych komputerach, należy więc
zasobów
opracować schemat nazewnictwa aby użytkownicy mogli znajdować i wykorzystywać
potrzebne im zasoby. Przykładem takiego schematu jest URL (Uniform Resource Locator-
jednolity lokalizator zasobów) służący do identyfikacji stron WWW. Jeśli nie zastosuje się
znaczącego i powszechnie rozumianego schematu, to wiele zasobów będzie niedostępnych
dla użytkowników systemu.
Komunikacja
Powszechna dostępność Sieci i efektywna implementacja jej protokołu komunikacyjnego
TCP/IP oznacza, że jest to najskuteczniejszy sposób komunikacji komputerów w wypadku
większości systemów rozproszonych. Tam, gdzie występują szczególne wymagania
efektywnościowe, niezawodnościowe itp., można skorzystać z innych mechanizmów
komunikacji.
Jakość usług
Jakość usług oferowanych przez system zależy od jego efektywności, dostępności i nie-
zawodności. Mają na nią wpływ także inne czynniki, takie jak podział procesów do proce-
sorów systemu, rozproszenie zasobów w ramach systemu, sprzęt sieciowy i systemowy
oraz zdolność systemu do adaptacji.
Architektury
W architekturze oprogramowania opisuje się, jak funkcjonalność programu użytkowego
oprogramowania
rozproszono na kilku logicznych komponentach oraz jak te komponenty rozproszono na
procesorach. Wybór odpowiedniej architektury programu użytkowego jest zasadniczym
warunkiem osiągnięcia pożądanej jakości usług.
Rodzaje architektur systemów
rozproszonych
• Architektury wieloprocesorowe
– W tym podejściu system jest postrzegany jako
zbiór procesów uruchomionych na oddzielnych
(ale niekoniecznie) procesorach.
• Architektury klient-serwer
– W tym podejściu system jest postrzegany jako
zbiór usług oferowanych klientom, którzy z nich
korzystają. W takich systemach odmiennie
traktuje się serwery i klientów.
• Architektury obiektów rozproszonych
– W tym podejściu nie istnieje rozróżnienie między
klientami i serwerami. System jest postrzegany
jako zbiór komunikujących się obiektów, których
położenie jest nieistotne. Nie ma różnicy między
dostawcą i użytkownikiem usług.
Śródprogramy
• Różne komponenty systemu rozproszonego mogą
być zaimplementowane za pomocą rozmaitych
języków programowania i działać na zupełnie
innych rodzajach procesorów.
• Modele danych, reprezentacja informacji i protokoły
komunikacyjne mogą być całkowicie odmienne.
• System
rozproszony
musi
zatem
zawierać
oprogramowanie, które będzie zarządzać tymi
różnorodnymi częściami oraz zapewni im możliwość
komunikacji i wymiany danych.
• Do takiego oprogramowania odnosi się podejście
śródprogramu (middleware), które znajduje się w
środku
różnych
rozproszonych
komponentów
systemu.
Architektury wieloprocesowe
• Najprostszym modelem systemu rozproszonego
jest system wieloprocesorowy, składający się z
kilku różnych procesów, które mogą (ale nie
muszą) działać na oddzielnych procesorach.
• Z logicznego punktu widzenia procesory zajmujące
się zbieraniem informacji, podejmowaniem decyzji
i sterowaniem efektorami mogłyby działać na
jednym procesorze sterowanym przez moduł
szeregujący. Użycie wielu procesorów poprawia
jednak efektywność i odporność systemu.
• Przydział procesów procesorów może być zadany z
góry (tak zwykle jest w systemach krytycznych)
albo sterowany przez dyspozytora, który decyduje
o przyznaniu procesora procesowi.
System wieloprocesorowy do
kierowania ruchem
Procesory
detektorów
Proces
sterujący
detektore
m
Procesory
natężenia
ruchu
Proces
wyświe-
tlający
Procesory
sterujące
światłami
Proces
sterując
y
światła
mi
Konsole operatorów
Detektory natężenia
ruchu i kamery
Światła
Architektury klient-serwer
• W takiej architekturze program użytkowy
jest
modelowany
jako
zbiór
usług
oferowanych przez serwery i zbiór klientów,
którzy z tych usług korzystają.
• Klienci muszą znać dostępne serwery, ale
zwykle nie muszą wiedzieć o istnieniu
innych klientów.
• Klienci i serwery są oddzielnymi procesami.
• Procesy i procesory systemu nie muszą być
wzajemnie
jednoznacznie
przyporządkowane.
System klient-serwer
s1
s2
s3
s4
k
1
k
2
k
3
k
4
k
5
k
6
k
7
k
8
k
9
k
10
k
11
k
12
Proces serwera
Proces klienta
Rodzaje architektur klient-
serwer
• Model klienta cienkiego: całość przetwarzania i zarządzania
danymi ma miejsce na serwerze. Jedynym zadaniem klienta jest
uruchomienie oprogramowania prezentacyjnego.
Klient
Prezentacja
Serwer
Zarządzanie
danymi
Przetwarzanie
• Model klienta grubego: serwer odpowiada jedynie za zarządzanie
danymi. Oprogramowanie u klienta implementuje logikę programu
użytkowego i kontakt z użytkownikiem systemu.
Klient
Prezentacja
Przetwarzanie
Serwer
Zarządzanie
danymi
Model klienta cienkiego
• Architektura dwuwarstwowa z klientem cienkim
jest najprostszym rozwiązaniem, które można
wykorzystać w scentralizowanych systemach
odziedziczonych
ewoluujących
w
kierunku
architektur klient-serwer.
• Interfejs użytkowy działa jako serwer i obsługuje
przetwarzanie użytkowe oraz zarządzanie danymi.
• Model klienta cienkiego może być również
zaimplementowany tam, gdzie klienci są raczej
prostymi
urządzeniami
sieciowymi,
a
nie
komputerami osobistymi albo stacjami roboczymi.
• Na
takim
urządzeniu
sieciowym
działa
przeglądarka sieci oraz interfejs użytkownika
realizowany przez ten system.
• Najważniejsza wadą modelu klienta cienkiego jest
duże obciążenie przetwarzaniem zarówno sieci, jak
i serwera.
Model klienta grubego
• Korzysta się z dostępnej mocy obliczeniowej i
przekazuje
klientowi
zarówno
przetwarzanie
związane z logiką programu użytkowego, jak i
prezentację.
• Serwer jest zasadniczo serwerem transakcji, który
zarządza transakcjami w bazie danych.
• Dobrze znanym przykładem architektury tego typu
są systemy bankomatów. Bankomat jest tam
klientem, a serwerem jest komputer główny
obsługujący bazę danych kont klientów.
• W modelu klienta grubego przetwarzanie jest
bardziej efektywne niż w wypadku modelu klienta
cienkiego, zarządzanie systemem jest natomiast
trudniejsze niż w tym pierwszym modelu.
Architektura warstwowa
• W tej architekturze prezentacja, przetwarzanie
użytkowe i zarządzanie danymi są logicznie
oddzielonymi procesami.
• Niekoniecznie potrzebne są trzy systemy
komputerowe włączone do sieci.
• Jeden komputer serwera może obsługiwać
zarówno
przetwarzanie
użytkowe,
jak
i
zarządzanie danymi programu użytkowego jako
dwa oddzielne logicznie serwery.
• Gdy jednak oczekiwania wzrosną, można będzie
dość łatwo wyodrębnić przetwarzanie użytkowe i
zarządzanie danymi, po czym uruchomić je na
oddzielnych procesorach.
• Czasami ze względów praktycznych redukuje się
trzy warstwy do dwóch.
Warstwy rozproszonego
systemu użytkowego
• Warstwa
prezentacji
dotyczy
przedstawiania
informacji użytkownikowi i
całego
kontaktu
z
użytkownikiem.
• W warstwie przetwarzania
implementuje się logikę
programu użytkowego.
• Warstwa
zarządzania
danymi
jest
odpowiedzialna
za
wszystkie
operacje
na
bazie danych
Warstwa przetwarzania
Warstwa zarządzania
danymi
Warstwa prezentacji
Architektura rozproszona
internetowego systemu
bankowego
Klient
Klient
Klient
Klient
Serwer WWW
Obsługa
konta
Serwer bazy danych
Baza danych
SQL kont
klientów
Zapytanie
SQL
Komunikacja HTTP
Zastosowania różnych
architektur klient-serwer
Architektura
Zastosowania
Architektura
Systemy, w których oddzielenie przetwarzania użytkowego od zarządzania
dwuwarstwowa
danymi jest niepraktyczne.
klient-serwer
Programy użytkowe wykonujące dużo obliczeń, ale w małym stopniu (albo wcale)
z klientami cienkimi
zarządzające danymi, np. kompilatory.
Programy użytkowe dużo korzystające z danych (przeglądanie i zapytywanie), ale
wykonujące mało (albo wcale) obliczeń użytkowych.
Architektura
Programy użytkowe, w których obliczenia są wykonywane u klienta, np. biurowe
arkusze kalkulacyjne
klient-serwer
Programy użytkowe wymagające złożonego obliczeniowo przetwarzania danych,
z klientami grubymi
np. przedstawiania graficznego danych.
Programy użytkowe ze względnie stabilną funkcjonalnością oferowaną użytkownikowi,
stosowane w środowisku ze starannie ustalonym zarządzaniem systemem.
Architektura
Ogromne programy użytkowe z setkami lub tysiącami użytkowników.
trójwarstwowa
Programu użytkowe, w których zarówno dane, jak i programy są płynne.
lub wielowarstwowa
Programy użytkowe, w których integruje się dane z wielu źródeł.
klient-serwer
Architektury klient – serwer:
podsumowanie
• W modelu systemu rozproszonego klient-serwer
klienci odróżniają się od serwerów.
• Klienci otrzymują usługi do serwerów, ale nie od
innych klientów.
• Serwery mogą działać jako klienci korzystający z
usług innych serwerów, ale nie mogą żądać usług
od klientów.
• Klienci muszą znać usługi oferowane przez
specyficzne serwery i wiedzieć, jak się z tymi
serwerami porozumieć.
• Ten model sprawdza się w wielu zastosowaniach.
Ogranicza jednak swobodę projektantów systemu,
którzy muszą zdecydować, gdzie mają być
oferowane usługi.
Architektura obiektów
rozproszonych
• Usunięcie rozróżnienia na klientów i serwery
• Obiekty systemu oferują interfejs do wykonywanych przez
siebie usług
• Inne obiekty mogą korzystać z tych usług bez logicznego
podziału na klientów i serwery
Szyna programowa
o1
o2
o3
o4
o5
o6
U (o1)
U (o2)
U (o3)
U
(o4)
U (o5)
U (o6)
Zalety architektury
obiektów rozproszonych
• Umożliwia projektantowi odłożenie w czasie
decyzji, gdzie i jak oferować usługi.
• Jest
architekturą
bardzo
otwartych
systemów, która umożliwia dodawanie
nowych zasobów w miarę potrzeby.
• System jest bardzo elastyczny i skalowalny.
Do obsługi rozmaitych obciążeń można
utworzyć różne egzemplarze systemu z tym
samym zbiorem usług oferowanych przez
odrębne lub powielone obiekty.
• W miarę potrzeby można dynamicznie
zmieniać
konfigurację
systemu
przez
migrację obiektów w sieci.
CORBA / DCOM
• CORBA jest zbiorem standardów dla
śródprogramów,
zdefiniowanym
przez
OMG (Object Management Group).
• Implementacje
CORBA
są
dostępne
zarówno dla systemów unixowych jak i z
rodziny MS Windows.
• DCOM jest standardem, który opracowano
i zaimplementowano w firmie Microsoft i
zintegrowano z systemami operacyjnymi z
rodziny Windows.
• Model rozproszonych obliczeń w DCOM jest
mniej ogólny niż CORBA.
CORBA: wizja programu
użytkowego
• Obiekty
użytkowe
zaprojektowane
i
zaimplementowane dla tego programu
użytkowego.
• Obiekty standardowe zdefiniowane przez
OMG na użytek specyficznej dziedziny.
• Główne
usługi
CORBA
związane
z
podstawowymi
aspektami
obliczeń
rozproszonych,
takie
jak
katalogi,
zarządzanie zabezpieczeniami itd.
• Udogodnienia CORBA, takie jak ułatwienia
interfejsu
użytkownika,
zarządzanie
systemem itp.
Standardy CORBA
• Model obiektów użytkowych, w którym obiekty
CORBA mają dobrze określony i niezależny od
języka interfejs opisany w IDL (Interface
Definition Language – język opisu interfejsów).
• Pośrednik zleceń obiektowych (Object Request
Broker, ORB), który obsługuje żądania obiektów.
• Zbiór ogólnych usług obiektowych, które
prawdopodobnie będą potrzebne w wielu
rozproszonych programach użytkowych.
• Zbiór wspólnych komponentów zbudowanych
na bazie tych podstawowych usług. Te
komponenty mogą się przydać w rozmaitych
programach użytkowych.
Struktura rozproszonego programu
użytkowego opartego na CORBA
Pośrednik zleceń obiektowych
Obiekty
użytkowe
Udogodnienia
dziedzinowe
Udogodnienia
na
poziomie CORBA
Usługi CORBA
Model obiektowy CORBA
• Obiekt jest obudową atrybutów i usług, jak to jest
zwykle w wypadku obiektów.
• Obiekty CORBA muszą mieć jednak oddzielną
definicję interfejsu, w której określa się publiczne
atrybuty i operacje obiektu.
• Interfejs obiektów CORBA ustala się za pomocą
standardowego,
niezależnego
od
języka
programowania języka opisu interfejsów (IDL).
• Gdy obiekt pragnie skorzystać z usług innego
obiektu, dostaje się do nich przez interfejs IDL.
• Obiekty CORBA mają unikatowe identyfikatory
zwane IOR (Interoperable Object Reference –
odniesienia obiektów umożliwiające współpracę).
Pośrednik zleceń
obiektowych(ORB)
• Obiekt wywołujący ma do dyspozycji namiastkę
IDL, która zawiera definicję interfejsu obiektu
oferującego żądaną usługę.
• Osoba programująca umieszcza wywołania tej
namiastki w swojej implementacji wszędzie tam,
gdzie jest potrzebna ta usługa.
• IDL jest nadzbiorem C++, jeśli więc programuje
się w tym języku, to korzystanie z namiastki jest
łatwe. Jest również dość łatwe w C i Javie.
• Zdefiniowano również przekształcenia IDL na inne
języki, na przykład COBOL i Ada. W wypadku tych
języków
zwykle
jest
jednak
konieczne
wspomaganie narzędzi łączących z IDL.
Usługi CORBA
• Usługa katalogowa i usługa handlowa,
dzięki którym obiekty mogą znajdować
się i odwoływać do innych obiektów
sieci.
• Usługi powiadamiania, dzięki którym
obiekty mogą powiadomić inne obiekty
o zajściu pewnego zdarzenia.
• Usługi
transakcyjne
do
obsługi
niepodzielnych
transakcji
i
ich
wycofywania w wypadku niepowodzenia.
Inżynieria
oprogramowania
Wykład 11 –
architektury systemów czasu
rzeczywistego.
Prezentacja częściowo oparta na prezentacji przygotowanej przez Prof. J.E. Sienkiewicza
(opartej z kolei na podręczniku Iana Sommerville’a Inżynieria oprogramowania, WNT 2003)
Systemy czasu rzeczywistego
• Komputery są obecnie używane do sterowania
rozmaitymi systemami, od maszyn domowych
do całych hal produkcyjnych.
• Te komputery bezpośrednio porozumiewają się
z urządzeniami sprzętowymi.
• Ich
oprogramowanie
jest
wbudowanym
systemem czasu rzeczywistego, który musi
reagować na zdarzenia powodowane przez
sprzęt i wysyłać sygnały sterujące w
odpowiedzi na te zdarzenia. Jest wbudowane
w pewien większy system sprzętowy i musi
reagować na zdarzenia w środowisku tego
systemu w czasie rzeczywistym.
Definicja
• System czasu rzeczywistego jest systemem
oprogramowania, którego poprawne działanie
zależy od wyników przez niego wytwarzanych i
czasu potrzebnego do ich wytworzenia.
• „Tolerancyjnym”
systemem
czasu
rzeczywistego jest system, którego działanie
jest gorsze, jeśli wyniki nie są dostępne
zgodnie
z
ustalonymi
wymaganiami
czasowymi.
• „Wymagający” system czasu rzeczywistego to
system, którego działanie jest niepoprawne,
jeśli wyniki nie są tworzone zgodnie z
ustalonymi wymaganiami czasowymi.
System bodziec-reakcja
• Na podstawie otrzymanego bodźca system musi
wygenerować odpowiednią reakcję. Zachowanie
systemu
czasu
rzeczywistego
można
więc
zdefiniować przez wyliczenie bodźców, które może
otrzymać, skojarzonych z nimi odpowiedzi oraz
czasu, w którym należy je utworzyć.
• Podział bodźców:
– Bodźce okresowe pojawiają się w
przewidywanych odstępach czasu.
– Bodźce nieokresowe pojawiają się nieregularnie.
• System czasu rzeczywistego musi reagować na
bodźce pojawiające się w różnych chwilach. Jego
architektura musi więc być tak skonstruowana, aby
sterowanie było przekazywane do odpowiedniej
procedury obsługi natychmiast po pojawieniu się
bodźca.
Uniwersalny model
architektoniczny
• Systemy czasu rzeczywistego zwykle projektowane
są jako zbiór współbieżnych, współpracujących
procesów.
• Zadaniem części systemu czasu rzeczywistego
(moduł wykonawczy) jest zarządzanie tymi
procesami.
• Z każdym rodzajem detektora kojarzy się proces
zarządzania detektorem.
• Procesy
obliczające
wyznaczają
oczekiwaną
odpowiedź na bodźce otrzymane przez system.
• Procesy sterowania efektorami zarządzają działaniem
efektorów.
• Ten model umożliwia szybkie odbieranie danych od
detektorów (zanim będą gotowe następne dane
wejściowe),
późniejsze
ich
przetwarzanie
i
reagowanie przez efektory.
Uniwersalny model systemu
czasu rzeczywistego
Detektor
Detektor
Detektor
Detektor
Detektor
Detektor
Detektor
Detektor
Detektor
Detektor
Detektor
Detektor
System sterujący
czasu rzeczywistego
System sterujący
czasu rzeczywistego
Efektor
Efektor
Efektor
Efektor
Efektor
Efektor
Efektor
Efektor
Procesy sterujące detektorami i
efektorami
Detektor
Detektor
Efektor
Efektor
Sterowanie
efektorem
Sterowanie
efektorem
Procesor
danych
Procesor
danych
Sterowanie
detektorem
Sterowanie
detektorem
Bodziec
Reakcja
• Część
procesu
projektowania
systemu
polega
na
podjęciu
decyzji,
które
udogodnienia
systemu
będą
zaimplementowane przez oprogramowanie,
a które przez sprzęt.
• Ograniczenia czasowe lub inne wymagania
mogą
oznaczać,
że
niektóre
funkcje
systemu, takie jak przetwarzanie sygnałów,
muszą być zaimplementowane w postaci
specjalnie zbudowanego sprzętu.
• Proces projektowania systemu może więc
zarówno
obejmować
projektowanie
specjalnego sprzętu, jak i projektowanie
oprogramowania czasu rzeczywistego.
Projekty systemów czasu
rzeczywistego
Wymagania
systemowe
Podział
wymagań
Wymagania
dla sprzętu
Wymagania
na
oprogramowanie
Projektowanie
oprogramowan
ia
Projektowanie
sprzętu
Projektowanie oprogramowania
i sprzętu
Proces projektowania
• Zidentyfikuj bodźce, które system musi przetwarzać oraz
skojarzone z nimi reakcje.
• Dla każdego bodźca i związanej z nim reakcji zidentyfikuj
wymagania czasowe, które dotyczą przetwarzania
zarówno bodźca, jak i reakcji.
• Pogrupuj bodźce i reakcje w kilku procesach
współbieżnych.
Dobrym
modelem
uniwersalnej
architektury takiego systemu jest skojarzenie jednego
procesu z każdą klasą bodźców i reakcji.
• Dla każdego bodźca i reakcji zaprojektuj algorytmy do
przeprowadzania koniecznych obliczeń. Te projekty
algorytmów często trzeba opracować w dość wczesnej
fazie procesu, aby poznać ilość przetwarzania i czas
potrzebny do wykonania tych obliczeń.
• Zaprojektuj system szeregujący, który zapewni, że
procesy będą uruchamiane w chwili wystarczającej do
spełnienia ograniczeń czasowych.
• Zintegruj system pod kontrolą modułu wykonawczego.
Ograniczenia czasowe
• Systemy czasu rzeczywistego musza spełniać
postawione im ograniczenia czasowe, a zatem
zastosowanie strategii projektowych, które
powodują dodatkowe narzuty implementacyjne,
byłoby
niepraktyczne
w
wypadku
wymagających systemów czasu rzeczywistego.
• Projektowanie obiektowe oznacza na przykład
ukrywanie informacji o reprezentacji danych i
dostęp do atrybutów za pośrednictwem operacji
zdefiniowanych na obiektach. Prowadzi to
nieuchronnie do narzutów i utraty efektywności.
Modelowanie systemu czasu
rzeczywistego
• Najczęściej systemy takie modeluje się za
pomocą modelu stanowego.
• W modelu stanowym systemu zakłada się,
że w każdej chwili system jest w jednym z
wielu swoich stanów.
• Po wystąpieniu bodźca może nastąpić
przejście do innego stanu.
• System sterujący zaworem może na
przykład zmienić stan z „Zawór otwarty”
na „Zawór zamknięty” po otrzymaniu
polecenia operatora (bodźca).
DIAGRAM MASZYNY STANOWEJ UML
Model maszyny stanowej kuchenki
mikrofalowej
Oczekiwanie
do: wyświetlaj
godzinę
Działanie
do:
podgrzewa
nie
Pełna moc
do: ustaw
moc
= 600
Oczekiwanie
do: wyświetlaj
godzinę
Połowa
mocy
do: ustaw
moc
= 300
Ustawienie czasu
do: odczytaj liczbę
exit: ustaw czas
Niegotowy
do:
wyświetlaj
„Czekam”
Gotowy
do:
wyświetlaj
„Gotowy”
Pełna moc
Połow
a
mocy
Połowa
mocy
Pełna
moc
Stop
er
Liczba
Stoper
Zamknię
to
drzwicz
ki
Start
Zatrzymaj
Otworzono
drzwiczki
Zatwierdzo
no czas
Wybór języka programowania
• Język programowania użyty do implementacji
systemu czasu rzeczywistego również może mieć
wpływ na projekt.
• Wymagające systemy czasu rzeczywistego wciąż
programuje się niekiedy w asemblerze, aby
sprostać limitom czasowym.
• Można skorzystać także z języków programowania
systemowego takich jak C, które dają efektywny
kod.
• Zaleta języków programowania systemowego
niskiego poziomu polega na tym, że umożliwiają
tworzenie efektywnego kodu. Taki język nie
obejmuje jednak żadnych konstrukcji do obsługi
współbieżności
albo
zarządzania
zasobami
współdzielonymi.
Problemy z Javą
• Java nie nadaje się do programowania wymagających
systemów czasu rzeczywistego lub systemów, w których
procesy mają ścisłe limity czasowe.
• Oto zasadnicze problemy z zastosowaniem Javy jako języka
programowania czasu rzeczywistego:
• Nie można określić czasu, w którym wątki powinny
działać.
• Odśmiecanie nie podlega sterowaniu – może rozpocząć
się w dowolnym czasie.
• Nie ma możliwości odczytu długości kolejek związanych
ze współdzielonymi zasobami.
• Implementacja maszyny wirtualnej Javy jest inna na
każdym komputerze.
• Język nie przewiduje szczegółowej analizy wykorzystania
procesora i pamięci w czasie wykonania.
Moduły wykonawcze czasu
rzeczywistego
• Moduł wykonawczy czasu rzeczywistego
jest odpowiednikiem systemu operacyjnego
w komputerze ogólnego przeznaczenia.
• Zarządza procesami i przydziałem zasobów
systemu czasu rzeczywistego.
• Uruchamia i zatrzymuje procesy, aby
reagować na bodźce.
• Przydziela pamięć i zasoby procesora.
• Nie obejmuje jednak najbardziej złożonych
udogodnień systemu operacyjnego, np.
zarządzania plikami.
Zbiór komponentów modułu
wykonawczego
• Zegar czasu rzeczywistego.
– Udostępnia informacje niezbędne do okresowego szeregowania
procesów.
• Procedura obsługi przerwań.
– Zarządza nieokresowymi żądaniami usług.
• Moduł szeregujący.
– Odpowiada za znajdowanie procesów, które można wykonać i wybór
jednego z nich, który będzie wykonywany.
• Menedżer zasobów.
– Przydziela procesowi wybranemu do wykonywania odpowiednie zasoby
(czas procesora i pamięć).
• Dyspozytor.
– Odpowiada za rozpoczęcie wykonywania procesu.
• Menedżer konfiguracji.
– Odpowiada za dynamiczną rekonfigurację sprzętu systemu. Bez
zatrzymywania systemu można wyłączyć z użycia pewne moduły
sprzętowe lub rozszerzyć system o nowy sprzęt.
• Menedżer awarii.
– Odpowiada za wykrywania awarii sprzętu i oprogramowania oraz
podjęcie odpowiednich działań zmierzających do odtworzenia stanu po
awariach.
Dyspozytor
Menedżer zasobów
Menedżer zasobów
Moduł
szeregujący
Moduł
szeregujący
Informacje o zasobach
wymaganych przez
procesy
Informacje o zasobach
wymaganych przez
procesy
Informacje
o szeregowaniu
Informacje
o szeregowaniu
Zegar czasu
rzeczywistego
Zegar czasu
rzeczywistego
Procesy
czekające
na zasoby
Procesy
czekające
na zasoby
Lista procesów
gotowych
Lista procesów
gotowych
Lista procesorów
Lista procesorów
Lista dostępnych
zasobów
Lista dostępnych
zasobów
Procedura obsługi
przerwań
Procedura obsługi
przerwań
Proces wykonywany
Proces
Zwolnione
gotowy
zasoby
Poziom priorytetu
• Bodźce
przetwarzane
przez
systemy
czasu
rzeczywistego mają zwykle różne poziomy priorytetu.
• W wypadku niektórych bodźców, takich jak te
związane z sytuacjami wyjątkowymi, ważne jest, aby
zakończyć ich przetwarzanie w ściśle ustalonym
czasie.
• Inne procesy można bezpiecznie opóźnić, gdy obsługi
wymaga bardziej krytyczny proces.
• Poziom przerwania oznacza najwyższy priorytet.
Nadaje się go procesom, które wymagają bardzo
szybkiej reakcji. Jednym z nich jest proces zegara
czasu rzeczywistego.
• Poziom zegarowy jest nadawany procesom
okresowym.
Procesy okresowe
• Procesy okresowe to procesy, które muszą być
wykonywane w ustalonych odstępach czasu w
celu pobrania danych i sterowania efektorami.
• Moduł wykonawczy korzysta ze swojego zegara
czasu rzeczywistego, aby określić, kiedy
proces ma być wykonywany.
• W większości systemów czasu rzeczywistego
występuje kilka klas procesów okresowych.
• Mają one różne okresy (odstępy między
wykonaniami), czasy działania i limity czasowe
(czasy, po których muszą zakończyć działanie).
• Moduł wykonawczy musi wybrać odpowiedni
proces do wykonania w każdej chwili.
Zarządzanie procesami
• Zarządzanie
procesami
w
module
wykonawczym czasu rzeczywistego polega
na
zarządzaniu
zbiorem
procesów
współbieżnych, który jest częścią systemu
czasu rzeczywistego.
• Menedżer procesów musi wybrać proces do
wykonania, przydzielić dla niego pamięć i
zasoby procesora oraz rozpocząć jego
wykonywanie na procesorze.
Moduł szeregujący
Wybierz proces
do wykonania
Menedżer zasobów
Przydziel pamięć
i procesor
Dyspozytor
Rozpocznij wykonywanie
na dostępnym procesorze
Moduł szeregujący
• Przegląda listę procesów okresowych i wybiera proces do
wykonania.
• Wybór zależy od priorytetu, okresu, oczekiwanego czasu
wykonania i limitu poszczególnych procesów gotowych.
• Czasem po jednym tyknięciu zegara trzeba wykonać dwa
procesy z różnymi limitami czasowymi. W takiej sytuacji
jeden z nich musi być opóźniony, jednak najwyżej na tyle,
aby jego zakończenie przed upływem limitu czasowego było
możliwe.
• Szeregowanie bez wywłaszczenia:
– Gdy wybrano proces do wykonywania, działa on aż do
zakończenia swojej pracy lub do chwili zablokowania z
jakiegoś powodu, np. oczekiwania na dane wejściowe.
• Szeregowanie z wywłaszczeniem:
– Działanie procesu może być przerwane, jeśli trzeba
obsłużyć proces o wyższym priorytecie.
Systemy monitorowania i
sterowania
• Systemy monitorowania i sterowania są
ważną klasą systemów czasu rzeczywistego.
• Sprawdzają stan detektorów dostarczających
informacje o środowisku systemu i wykonują
akcje zależne od odczytów z tych detektorów.
• Systemy monitorowania podejmują działania,
gdy detektory wykryją jakąś wyjątkową
wartość.
• Systemy sterowania ustawicznie sterują
sprzętowymi efektorami zależnie od wartości
związanych z nimi detektorów.
Przykład - system antywłamaniowy
• Ten system korzysta z różnych rodzajów
detektorów.
• Gdy detektor wykrywa obecność intruza,
system automatycznie dzwoni do pobliskiego
posterunku policji i za pomocą syntezatora
mowy informuje o miejscu wywołania alarmu.
• System alarmowy zwykle jest zasilany z sieci,
ale ma też zapasowe akumulatory.
• System jest „tolerancyjnym” systemem czasu
rzeczywistego, który nie ma dużych wymagań
czasowych.
• Detektory nie muszą wykrywać bardzo szybko
następujących
zdarzeń,
trzeba
je
więc
odpytywać najwyżej dwa razy na sekundę.
Proces projektowania
• Rozpoczyna się od rozpoznania bodźców
nieokresowych działających na system i
skojarzonych z nimi odpowiedzi.
• Następnym
krokiem
procesu
projektowania
jest
rozważenie
ograniczeń czasowych związanych z
każdym bodźcem i skojarzoną z nim
reakcją.
• Kolejnym krokiem jest podział funkcji
systemu do procesów współbieżnych.
Klasy bodźców w systemie
antywłamaniowym
• Zanik zasilania
– Jest zgłaszany przez układ monitorujący
napięcie. Wymagana odpowiedzią jest
przełączenie na zasilanie zapasowe
przez wysłanie sygnału do urządzenia
przełączającego zasilanie.
• Wtargnięcie intruza
– Reakcją na ten bodziec jest wyznaczenie
numeru pokoju, w którym znajduje się
aktywny detektor, zadzwonienie na
policję, uruchomienie syntezatora mowy
do obsługi telefonu oraz włączenie
syreny i świateł w okolicach włamania.
Wymagania czasowe stawiane
bodźcom i reakcji
Bodziec/reakcja Wymagania czasowe
Przerwanie zaniku
Przełączenie na zasilanie zapasowe musi być
ukończone po najwyżej zasilania 50ms
Alarm drzwiowy Każdy detektor drzwiowy musi być odpytywany dwa
razy na sekundę
Alarm okienny Każdy detektor okienny musi być odpytywany dwa razy
na sekundę
Detektor ruchu Każdy detektor ruchu powinien być odpytywany dwa
razy na sekundę
Sygnał dźwiękowy
Sygnał dźwiękowy musi być włączony po
upływie najwyżej 1 sekundy
od alarmu wywołanego przez detektor
Włączenie świateł
Światła powinny być włączone po upływie
najwyżej 1/2 sekundy
od alarmu wywołanego przez detektor
Komunikacja
Wezwanie policji przez telefon należy rozpocząć po
upływie najwyżej 2
sekund od alarmu wywołanego przez
detektor
Syntezator mowy
Komunikat z syntezatora powinien być dostępny
po upływie najwyżej 4
sekund od alarmu wywołanego przez detektor
Proces
detektorów ruchu
Proces detektorów
drzwiowych
Proces detektorów
okiennych
Proces
komunikacyjny
Proces
monitorowania budynku
Proces systemu
alarmowego
Proces przełączania
zasilania
Proces sygnalizacji
dźwiękowej
Proces sterowania
światłami
Proces syntezatora
mowy
400 Hz
60 Hz
100 Hz
Stan
detektorów
Numer
pokoju
Numer
pokoju
Stan
detektorów
560 Hz
Przerwanie
braku zasilania
System alarmowy
Kontrol
er
budynk
u
System alarmowy
Komunikat
alarmowy
System
alarmowy
Stan
detektorów
Numer
pokoju
System alarmowy
Systemy gromadzenia danych
• Systemy
gromadzenia
danych
stanowią kolejną klasę systemów
czasu
rzeczywistego,
mających
zwykle
uniwersalny
model
architektoniczny.
• Takie systemy zbierają od detektorów
dane do późniejszego przetwarzania i
analizy.
System zbierający dane od detektorów
monitorujących promieniowanie
neutronowe w reaktorze atomowym.
• Dane z detektorów są umieszczane w buforze;
następnie są z niego pobierane i przetwarzane.
• W
rezultacie
na
ekranie
operatora
jest
wyświetlane średnie natężenie promieniowania.
• Każdy detektor ma swój proces, który zmienia
dane analogowe o natężeniu promieniowania
neutronowego na sygnał cyfrowy.
• Następnie przekazuje to natężenie promieniowania
oraz swój identyfikator do bufora danych.
• Proces odpowiedzialny za przetwarzanie danych
pobiera dane z tego bufora, przetwarza je i
przekazuje do procesu wyświetlającego w celu
pokazania na konsoli operatora.
Architektura systemu
monitorującego promieniowanie
Detektory (każdy przepływ danych to stan detektora)
Proces
detektora
Przetwarzanie
danych
Wyświetlacz
Bufor z danymi
z detektorów
Identyfikator
i stan detektora
Wyznaczone
natężenie
promieniowania
Wzajemne wykluczanie
• W
systemach
czasu
rzeczywistego,
które
gromadzą
i
przetwarzają
dane,
czasy
wykonywania i okresy procesów gromadzących
oraz przetwarzających mogą być nierówne.
• W większości systemów gromadzenia danych
neutralizacja tych różnic szybkości polega na
zastosowaniu bufora cyklicznego.
• Ważne: należy zaimplementować wzajemne
wykluczanie,
aby
procesy
producentów
i
konsumentów nie miały w buforze dostępu do tego
samego elementu w tym samym czasie.
• System musi również zadbać o to, żeby producent
nie mógł dodać informacji do pełnego bufora i
żeby konsument nie pobrał informacji z pustego
bufora.
Inżynieria
oprogramowania
Wykład 12 –
systemy krytyczne.
Prezentacja częściowo oparta na prezentacji przygotowanej przez Prof. J.E. Sienkiewicza
(opartej z kolei na podręczniku Iana Sommerville’a Inżynieria oprogramowania, WNT 2003)
Systemy krytyczne
• Awarie większości systemów sterowanych
komputerami powodują jedynie niewygody, a
nie poważne, długotrwałe zniszczenia.
• Istnieją jednak systemy, których awarie
mogą
powodować
znaczne
straty
gospodarcze,
fizyczne
zniszczenia
lub
zagrożenia życia ludzkiego. Systemy te
zwykle nazywa się systemami krytycznymi.
• Pewność
jest
zasadniczym
atrybutem
systemów krytycznych. Każdy z jej aspektów
może być ważny.
Rodzaje systemów krytycznych
• Systemy krytyczne dla bezpieczeństwa to
systemy, których awaria może powodować
obrażenia i utratę życia lub poważne
zniszczenie środowiska.
• Systemy krytyczne dla zadania to systemy,
których
awaria
może
powodować
niepowodzenie pewnej czynności mającej
jakiś cel.
• Systemy krytyczne dla przedsiębiorstwa to
systemy, których awaria może powodować
kłopoty korzystających z nich przedsiębiorstw.
Składniki systemu
podatne na awarie
• Sprzęt, który może się popsuć z powodu
błędów projektowych, błędów przy ich
produkcji lub z powodu naturalnego
zmęczenia materiału.
• Oprogramowanie systemu, które może
ulec
awarii
z
powodu
błędów
w
specyfikacji, projekcie lub implementacji.
• Operatorzy
systemu,
którzy
mogą
niewłaściwie go obsługiwać.
Awarie systemu krytycznego
• Koszt awarii systemu krytycznego jest
zwykle
bardzo
wysoki.
Obejmuje
bezpośrednie koszty awarii (np. konieczność
wymiany systemu) oraz koszty pośrednie
(koszty procesów sądowych, utracone zyski
w związku z niedostępnością systemu).
• W rezultacie systemy krytyczne są zwykle
budowane raczej za pomocą starannie
sprawdzonych metod, a nie nowinek, z
którymi dotychczas nie wiążą się znaczące
praktyczne doświadczenia.
Klasyfikacja awarii
Klasa awarii
Opis
Chwilowa
Zdarza się tylko dla niektórych danych wejściowych
Trwała
Następuje dla wszystkich danych wejściowych
Usuwalna
System może ją usunąć bez interwencji operatora
Nieusuwalna
Usunięcie awarii wymaga interwencji operatora
Nieniszcząca
Awaria nie powoduje zniszczenia stanu i danych systemu
Niszcząca
Awaria powoduje zniszczenie stanu i danych systemu
Pojęcie pewności - ogólnie
• Pewność systemu komputerowego jest właściwością
systemu odpowiadającą zaufaniu, którym jest obdarzony.
• Zaufanie oznacza stopień przekonania użytkownika, że
system będzie działał tak jak należy i nie będzie się
„psuł” przy normalnym użytkowaniu.
• Ta właściwość nie może być wyrażona liczbowo, ale da
się ją zapisać nieformalnie.
• Określenia, takie jak „niepewny”, „bardzo pewny” i
„ultrapewny”, odpowiadają różnym poziomom zaufania,
którymi obdarzamy system.
• Koszt pewności jest funkcją wykładniczą.
• Systemy niepewne zwykle pozostają nieużywane.
• Trudno jest odzyskać pewność.
• Zwykle można zrekompensować np. brak efektywności
systemu, ale nie brak pewności.
• Systemy niegodne zaufania mogą spowodować utratę
informacji.
Składniki pewności
Zabezpieczenie
Bezpieczeństwo
Niezawodność
Dostępność
Pewność
Zdolność systemu do
realizacji usług,
gdy są potrzebne
Zdolność systemu do
realizacji usług zgodnie
ze specyfikacją
Zdolność systemu do
działania bez
katastroficznych
awarii
Zdolność systemu
do
zabezpieczenia
siebie
przed
przypadkowym
lub
celowym
włamaniem
• Niezawodność i dostępność uważa się zwykle za
najważniejsze wymiary pewności.
• Dostępność systemu to prawdopodobieństwo, że będzie
on realizował usługi dla użytkowników, gdy mu to zlecą.
• Niezawodność to prawdopodobieństwo, że system
zaoferuje usługi zgodne ze specyfikacją.
• Niezawodność
wymaga
dostępności,
ponieważ
niezrealizowanie wyspecyfikowanych usług nie jest
oczywiście zachowaniem zgodnym ze specyfikacją.
• Definicje precyzyjne
– Niezawodność: prawdopodobieństwo bezawaryjnego
działania w ciągu ustalonego czasu w zadanym
środowisku w określonym celu.
– Dostępność: prawdopodobieństwo, że w ustalonej
chwili system będzie działał i będzie zdolny do
realizacji żądanych usług.
Dostępność i niezawodność
• Unikanie usterek.
– Stosuje się metody tworzenia, które zmniejszają
możliwość pomyłek lub umożliwiają wychwytywanie
ich, zanim doprowadzą do awarii systemu.
• Wykrywanie i usuwanie usterek.
– Stosuje się metody weryfikacji i zatwierdzania,
które zwiększają szansę wykrycia i usunięcia
usterek przed przystąpieniem do użytkowania
systemu.
• Tolerowanie usterek.
– Stosuje się metody, które zapewniają, że usterki w
systemie nie powodują błędów, a błędy systemu
nie powodują awarii.
Poprawianie niezawodności
systemu
• Program może zawierać znane błędy, a mimo
tego użytkownicy mogą go uważać za
niezawodny.
• Co więcej, doświadczeni użytkownicy zwykle
„obchodzą” usterki oprogramowania, o których
wiadomo, że powodują awarie. Świadomie
unikają korzystania z udogodnień systemu, o
których wiedzą, że spowodują kłopoty.
• Niektórzy nigdy nie wprowadzą błędnych
danych wejściowych, awaria nigdy się więc nie
zdarzy.
• Naprawienie usterek w tych udogodnieniach
praktycznie
nie
zmienia
niezawodności
postrzeganej przez użytkowników.
Niezawodność - uwagi
Bezpieczeństwo
• Bezpieczeństwo
systemu
to
atrybut
odzwierciedlający zdolność systemu do
normalnego lub nienormalnego działania
bez wywoływania zagrożeń dla ludzi lub
środowiska.
• Jeśli bezpieczeństwo jest zasadniczą cechą
systemu krytycznego, to nazywamy go
systemem krytycznym dla bezpieczeństwa.
• Przykładami takich systemów są systemy
sterowania i kontroli w samolocie, systemy
sterowania
procesami
w
reaktorach
chemicznych i farmaceutycznych oraz
systemy sterowania samochodami.
Sposoby zapewnienia
bezpieczeństwa
• Unikanie zagrożeń. System jest zaprojektowany tak, aby
uniknąć zagrożeń.
– System tnący, którego zadziałanie wymaga od operatora
naciśnięcia dwóch przycisków w tej samej chwili, wystrzega
się na przykład ryzyka umieszczenia rąk operatora w
zasięgu noża.
• Wykrywanie i eliminowanie zagrożeń. System jest
zaprojektowany tak, aby wykrywać i eliminować zagrożenia,
zanim doprowadzą do wypadku.
– System reaktora chemicznego może na przykład wykrywać
nadmierne ciśnienie i otwierać zawór bezpieczeństwa w
celu zmniejszenia ciśnienia, zanim dojdzie do eksplozji.
• Ograniczanie szkód. System może obejmować udogodnienia
zabezpieczające, które ograniczają szkody będące
konsekwencją wypadku.
– Silnik lotniczy zawiera na przykład automatyczne gaśnice.
Gdy pojawi się ogień, zwykle można go ugasić, zanim
stanie się zagrożeniem dla pasażerów i załogi.
Zabezpieczenie
• Zabezpieczenie systemu to oszacowanie
stopnia zabezpieczenia systemu przed
atakami
z
zewnątrz,
zarówno
przypadkowymi, jak i celowymi.
• Przykładami
ataków
są
wirusy,
nieuprawnione
użycie
usług
systemu,
nieuprawnione aktualizowanie systemu lub
jego danych itd.
• Bez rozsądnego poziomu zabezpieczeń
dostępność, niezawodność i bezpieczeństwo
systemu mogą być zniweczone przez
zewnętrzne ataki, które wywołały szkody w
systemie.
Szkody, które mogą być
wynikiem ataku z zewnątrz
•
Zaprzestanie usługi. System może być
zmuszony do przyjęcia stanu, w którym nie
jest możliwe normalne realizowanie usług.
•
Uszkodzenie programów lub danych.
Komponenty programowe systemu mogą
być podmienione w nieuprawniony sposób.
•
Ujawnienie poufnej informacji.
Informacja przechowywana w systemie
może być poufna. Atak z zewnątrz może
ujawnić ją nieuprawnionym osobom.
Wymagania dla systemów
krytycznych
• Oczekiwanie
pewności
systemów
krytycznych
prowadzi
do
wymagań
funkcjonalnych i niefunkcjonalnych:
– Wymagania funkcjonalne mogą być
definicjami udogodnień do wykrywania
błędów i odtwarzania systemu oraz
definicjami właściwości systemu, które
uchronią go przed awariami.
– Wymagania niefunkcjonalne mogą być
definicjami wymaganej niezawodności i
dostępności systemu.
Wymagania typu „nie będzie”
• Służą do określenia nieakceptowalnych
zachowań systemu. Oto przykłady takich
wymagań:
– System nie będzie umożliwiał użytkownikom
modyfikowania praw dostępu do plików,
których nie utworzyli (zabezpieczenie).
– System nie będzie umożliwiał wybrania trybu
wstecznej siły ciągu, gdy samolot jest w
powietrzu (bezpieczeństwo).
– System nie będzie umożliwiał jednoczesnego
uruchomienia więcej niż trzech sygnałów
alarmowych (bezpieczeństwo).
Miary niezawodności
• Pierwsze
miary
niezawodności
dotyczyły
komponentów sprzętowych.
• Awarie takich komponentów są nieuchronne ze
względu na czynniki fizyczne, takie jak zużycie
ścierne, ogrzewanie elektryczne itd.
• Te miary sprzętowe nie zawsze są odpowiednie do
specyfikowania niezawodności oprogramowania,
ponieważ natury awarii sprzętu i oprogramowania
są różne.
• Awarie komponentów programowych są zwykle
chwilowe, a nie trwałe. Pojawiają się jedynie dla
pewnych
danych
wejściowych.
Jeśli
nie
uszkodzono danych, to system często może
kontynuować działanie po wystąpieniu awarii.
Miary niezawodności
Miara
Objaśnienie
POFOD
Prawdopodobieństwo awarii przy zleceniu. Prawdopodobieństwo, że
Probability
system ulegnie awarii po zleceniu mu usługi. POFOD o
wartości 0,001
of failure oznacza, że jedno zlecenie na tysiąc skończy się awarią.
on demand
ROCOF
Częstotliwość występowania awarii. Częstotliwość występowania
Rate of failure
nieoczekiwanych zachowań. ROCOF o wartości 0,02 oznacza, że w
occurence ciągu 100 jednostek czasu działania prawdopodobnie zdarza się 2
awarie. Ta miara bywa czasem nazywana intensywnością awarii.
MTTF (MTBF) Średni czas do awarii. Średni czas między zaobserwowanymi awariami
Mean timesystemu. MTTF o wartości 500 oznacza, że co 500 jednostek czasu to
to (between) failure można oczekiwać jednej awarii.
AVAIL
Dostępność. Prawdopodobieństwo, że system jest dostępny dla
Availability
użytkownika w określonej chwili. Dostępność o wartości 0,998 oznacza,
że na 1000 jednostek czasu system prawdopodobnie będzie dostępny
w czasie 998 jednostek.
MTTR
Średni czas (wyrażony np. w godzinach),
Mean time to repair wymagany do naprawy uszkodzonego urządzenia / oprogramowania
od momentu wystąpienia awarii
Przykład specyfikacji
niezawodności
• Rozważmy wymagania niezawodnościowe stawiane
bankomatowi.
• Przypuśćmy, że każda maszyna w sieci jest używana
około 300 razy dziennie.
• Czas życia sprzętu systemu wynosi osiem lat, a
oprogramowanie jest aktualizowane średnio raz na dwa
lata.
• W czasie działania jednej wersji oprogramowania każda
maszyna obsługuje około 200 000 transakcji.
• Sieć banku składa się z 1000 maszyn.
• Oznacza to, że dziennie następuje 300 000 transakcji w
centralnej bazie danych (około 100 milionów rocznie).
• Awarie dzieli się na dwie duże klasy: te, które wpływają
na jedną maszynę w sieci, oraz te, które wpływają na
bazę danych, a zatem na wszystkie bankomaty w sieci.
Specyfikacja niezawodności
bankomatu
Klasa awarii
Przykład
Miara niezawodności
Trwała System nie działa z żadną wsuwaną
ROCOF
nieniszcząca
kartą. Usunięcie awarii wymaga ponownego 1
zdarzenie/1000 dni
uruchomienia oprogramowania.
Chwilowa
Pasek magnetyczny nieuszkodzonej
ROCOF
nieniszcząca
wsuniętej karty nie może być odczytany 1 na 1000 transakcji
Trwała
Zestaw jednoczesnych transakcji w sieci Niemierzalna! Nie
powinna
niszcząca
powoduje uszkodzenie bazy danych
się zdarzyć w
czasie życia
systemu
Cykl życia
bezpieczeństwa
zgodny z IEC 61508
Budowanie systemów
związanych z bezpieczeństwem
Budowanie systemów
związanych z bezpieczeństwem
Planowanie
Zatwierdzenie i instalacja
Planowanie
Zatwierdzenie i instalacja
Instalacja
i przekazanie
Instalacja
i przekazanie
Zatwierdzenie
bezpieczeństwa
Zatwierdzenie
bezpieczeństwa
Działanie
i pielęgnacja
Działanie
i pielęgnacja
Likwidacja systemu
Likwidacja systemu
Zewnętrzne udogodnienia
do redukcji ryzyka
Zewnętrzne udogodnienia
do redukcji ryzyka
Analiza zagrożeń
i ryzyka
Analiza zagrożeń
i ryzyka
Definicja pojęć
i zakresu
Definicja pojęć
i zakresu
Przyporządkowanie
wymagań bezpieczeństwa
Przyporządkowanie
wymagań bezpieczeństwa
Opracowanie wymagań
bezpieczeństwa
Opracowanie wymagań
bezpieczeństwa
Specyfikowanie
bezpieczeństwa
Analiza zagrożeń i ryzyka
• Analiza zagrożeń i ryzyka polega na badaniu systemu i
środowiska, w jakim system działa.
• Jej celem jest znalezienie potencjalnych zagrożeń, które
mogą pojawić się w środowisku, pierwotnych przyczyn
tych zagrożeń i związanego z nimi ryzyka.
• To
złożony
i
trudny
proces,
który
wymaga
niestandardowego myślenia i wiedzy ekspertów z
rozmaitych dziedzin.
• Powinien być wykonywany przez doświadczonych
inżynierów
z
udziałem
ekspertów
z
dziedziny
zastosowania
i
profesjonalnych
doradców
od
bezpieczeństwa.
• Do identyfikacji zagrożeń można użyć sposobów pracy
grupowej, takich jak burza mózgów.
• Zagrożenia mogą być znalezione także dzięki temu, że
jeden z uczestniczących analityków bezpośrednio
doświadczył incydentu, który doprowadził do zagrożenia.
Proces analizy zagrożeń i ryzyka
• Rozpoznawanie zagrożeń. Rozpoznaje się
potencjalne zagrożenia, które mogą wystąpić.
Ich zbiór zależy od środowiska, w którym
system będzie użytkowany.
• Analiza ryzyka i klasyfikacja zagrożeń. Każde
zagrożenie rozpatruje się oddzielnie. Te
szczególnie poważne i nie wykluczone są
wybierane do dalszej analizy.
• Rozkładanie zagrożeń. Każde zagrożenie
rozpatruje się oddzielnie i szuka jego
przyczyn.
• Ocena szans zmniejszenia ryzyka. Znajduje
się propozycje zmniejszenia i redukcji
rozpoznanego ryzyka.
System podawania insuliny
• Za duża dawka insuliny (niepowodzenie usługi).
• Za mała dawka insuliny (niepowodzenie usługi).
• Brak zasilania w związku z wyczerpaniem baterii
(elektryczne).
• Elektryczna interferencja maszyny z innym
sprzętem medycznym, takim jak rozrusznik serca
(elektryczne).
• Złe podłączenie detektora lub efektora
spowodowane przez niedopasowanie (fizyczne).
• Części maszyny pozostawione w ciele chorego
(biologiczne).
• Zakażenie spowodowane podłączeniem maszyny
(biologiczne).
• Reakcja alergiczna na materiał lub insulinę używaną
w maszynie (biologiczne).
Analiza drzewa awarii
• W wypadku każdego rozpoznanego zagrożenia
należy przeprowadzić analizę, której celem jest
znalezienie sytuacji powodujących to zagrożenie.
• Istnieją dedukcyjne i indukcyjne metody analizy
zagrożeń.
• Metody dedukcyjne (zwykle łatwiejsze w użyciu)
polegają na rozpoczęciu od zagrożenia i na jego
podstawie poszukiwania możliwych awarii systemu.
• Metody indukcyjne polegają na rozpoczęciu od
awarii systemu i poszukiwaniu zagrożeń, które
mogą powstać.
• Jeśli to możliwe, w analizie zagrożeń należy użyć
obu rodzajów metod
Drzewo awarii
systemu podawania insuliny
Podano nieodpowiednią
dawkę insuliny
Awaria systemu
podawania
Odpowiednia dawka
podana w niewłaściwym
czasie
Błędne sygnały pompy
Niepoprawny pomiar
poziomu cukru
Awaria zegara
Błąd przy obliczaniu
poziomu cukru
Awaria detektora
Błąd
arytmetyczny
Błąd
algorytmiczny
Błąd przy
obliczaniu
poziomu cukru
Błąd
algorytmiczny
Błąd
arytmetyczny
lub
lub
lub
lub
lub
Potencjalne problemy
oprogramowania
• Błąd arytmetyczny.
– Pojawia się, gdy jakieś obliczenie arytmetyczne
powoduje błąd reprezentacji. W specyfikacji
trzeba wskazać wszystkie błędy arytmetyczne,
które mogą się zdarzyć. Zależą one od
zastosowanego algorytmu.
• Błąd algorytmiczny.
– To znacznie trudniejsza sytuacja, ponieważ
trudno wykryć jakiekolwiek nienormalne
okoliczności. Można je wykryć przez porównanie
obliczonej potrzebnej dawki insuliny z poprzednio
podaną.
Poziomy akceptowalności
zagrożenia
• Nie do przyjęcia. System musi być zaprojektowany
tak, że to zagrożenie nie może wystąpić, a nawet
jeśli wystąpi, nie może doprowadzić do wypadku.
• Tak małe, jak to jest tylko możliwe (ALARP- as
low as reasonably practical). System musi być
zaprojektowany tak, aby biorąc pod uwagę koszty,
czas dostawy, itd., zmniejszyć prawdopodobieństwo
wystąpienia wypadku z powodu tego zagrożenia.
• Akceptowalne. Projektanci powinni przedsięwziąć
wszystkie kroki w celu zmniejszenia
prawdopodobieństwa powstania zagrożenia, jednak
tylko pod warunkiem, że nie zwiększą one kosztu, nie
opóźnią czasu dostawy, ani nie pogorszą atrybutów
niefunkcjonalnych.
Proces szacowania ryzyka
• Obejmuje
kalkulacje
prawdopodobieństwa
i
dotkliwości zagrożenia.
• Zwykle osiągnięcie dokładnych wyników tej
czynności jest bardzo trudne i najczęściej zależy od
inżynierskiego rozsądku.
• Prawdopodobieństwo i dotkliwość są oceniane za
pomocą
wartości
względnych,
takich
jak
„prawdopodobne”, „niemożliwe”, „rzadkie”, „duża”,
„średnia” i „mała”.
• Doświadczenia zdobyte przy pracy nad poprzednimi
systemami umożliwiają skojarzenie z tymi pojęciami
pewnych wartości liczbowych.
• Wypadki są jednak dość rzadkie, zwykle więc trudno
jest zweryfikować dokładność takiej wartości.
Analiza ryzyka
związanego z zagrożeniami
Rozpoznane zagrożenie Prawdo- Dotkliwość
Oszacowanie
Akcepto-
podobieństwo zagrożenia ryzyka walność
Przedawkowanie insuliny
Średnie Duża Wysokie Nie do przyjęcia
Niedostateczna dawka insuliny
Średnie Mała Niskie Akceptowalne
Zanik zasilania
Duże Mała Niskie Akceptowalne
Maszyna podłączona niewłaściwie Duże Duża Wysokie Nie do przyjęcia
Maszyna rani pacjenta Małe Duża Średnie ALARP
Maszyna powoduje infekcję Średnie
Średnia Średnie ALARP
Zakłócenia elektryczne
Małe Duża Średnie ALARP
Reakcja alergiczna Małe Mała Małe Akceptowalne
Specyfikowanie
wymagań zabezpieczenia
• Identyfikacja i wycena. Rozpoznaje się składniki systemu (dane i
programy) i ich oczekiwany stopień ochrony. Stopień pożądanej
ochrony zależy zwykle od wartości składnika. Plik z hasłami ma
zatem zwykle większa wartość niż zbiór ogólnie dostępnych
witryn WWW, ponieważ potencjalny atak na plik z hasłami ma
poważne konsekwencje dla całego systemu.
• Analiza gróźb i oszacowanie ryzyka. Rozpoznaje się możliwe
groźby dla zabezpieczeń systemu i ocenia ryzyko związane z
każdą z tych gróźb.
• Przyporządkowanie gróźb. Rozpoznane groźby przyporządkowuje
się do składników. Dla każdego zidentyfikowanego składnika
powstaje lista związanych z nim gróźb.
• Analizowanie technologii. Ocenia się dostępne technologie
zabezpieczeń i ich skuteczność na rozpoznane groźby.
• Specyfikacja wymagań stawianych zabezpieczeniom. Specyfikuje
się wymagania stawiane zabezpieczeniom. Tam, gdzie ma to
sens, w specyfikacji wymagań wskazuje się technologie
zabezpieczeń, które można zastosować w celu ochrony systemu
przed groźbami.
Inżynieria
oprogramowania
Wykład 13 –
projektowanie z użyciem
wielokrotnym
.
Prezentacja częściowo oparta na prezentacji przygotowanej przez Prof. J.E. Sienkiewicza
(opartej z kolei na podręczniku Iana Sommerville’a Inżynieria oprogramowania, WNT 2003)
Powszechność i zalety
projektowania opartego na
wielokrotnym użyciu
komponentów
• W większości dyscyplin inżynieryjnych
proces projektowania jest oparty na użyciu
wielokrotnym komponentów.
• Podstawą projektów są komponenty, które
wypróbowano i przetestowano w innych
systemach.
• Obecnie powszechnie uważa się, że w
wypadku
tworzenia
oprogramowania
potrzebne
jest
podobne
podejście.
Oprogramowanie powinno być uważane za
składnik majątku. Użycie wielokrotne tego
składnika
majątku
jest
zasadniczym
warunkiem zwiększenia stopy zwrotu z
inwestycji w jego tworzenie.
Wielokrotnie używane elementy
oprogramowania
• Użycie
wielokrotne
systemów
programów
użytkowych
Można ponownie użyć cały system programów
użytkowych przez włączenie go w niezmienionej
postaci do innych systemów.
• Użycie wielokrotne komponentów
Można
wielokrotnie
używać
komponentów
programu użytkowego mających różne rozmiary,
od podsystemów do pojedynczych obiektów.
• Użycie wielokrotne funkcji
Można
wielokrotnie
użyć
komponenty
programowe, takie jak pojedyncze funkcje
matematyczne.
Praktyka
• Użycie wielokrotne systemów programów
użytkowych praktykuje się już od wielu lat –
firmy
budujące
oprogramowanie
implementują swoje systemy na wielu
maszynach i dostosowują je do rozmaitych
środowisk.
• Użycie wielokrotne funkcji również jest
uznane i występuje w postaci standardowych
bibliotek funkcji użycia wielokrotnego, takich
jak biblioteki matematyczne i graficzne.
Zalety użycia wielokrotnego
• Zwiększona niezawodność
• Zmniejszone zagrożenie procesu
• Efektywne wykorzystanie
specjalistów
• Zgodność ze standardami
• Przyspieszone tworzenie
Wymagania stawiane
projektowaniu i budowaniu
oprogramowania z użyciem
wielokrotnym
• Musi
istnieć
możliwość
znalezienia
odpowiedniego
komponentu
użycia
wielokrotnego.
• Osoba ponownie używająca komponent musi
być przekonana, że będzie on działał zgodnie
ze specyfikacją i będzie niezawodny.
• Komponenty muszą mieć dokumentację,
która
pomoże
osobie
pragnącej
je
wykorzystać
w
zrozumieniu
ich
i
zaadaptowaniu do nowych zastosowań.
• Zwiększone koszty pielęgnacji
• Brak wspomagania narzędziowego
• Syndrom „nie wymyślono tutaj”
• Prowadzenie biblioteki komponentów
• Znajdowanie i adaptowanie
komponentów użycia wielokrotnego
Problemy z użyciem
wielokrotnym
• Polega ono na umieszczaniu wielokrotnie
używanej wiedzy w systemie generowania
programów, który może posługiwać się
językiem
specyficznym
dla
dziedziny
zastosowania.
• W opisie programu użytkowego w abstrakcyjny
sposób określa się, które komponenty użycia
wielokrotnego mają być wykorzystane.
• Na
podstawie
tej
informacji
można
wygenerować
działający
system
oprogramowania.
Generowanie jako podejście do
tworzenia komponentowego z
użyciem wielokrotnym
Użycie wielokrotne oparte na
generatorze
Typy generatorów:
• Generatory programów użytkowych do przetwarzania danych
gospodarczych
• Generatory analizatorów składniowych do przetwarzania
języków
• Generatory kodu w narzędziach CASE
Generator programów
Generator programów
Wygenerowany program
Wygenerowany program
Wiedza o dziedzinie
zastosowania
Wiedza o dziedzinie
zastosowania
Baza danych
Baza danych
Opis
programu
użytkowego
Tworzenie komponentowe
• Tworzenie
komponentowe
albo
komponentowa
inżynieria
oprogramowania
pojawiła
się
we
wczesnych
latach
dziewięćdziesiątych XX wieku w postaci podejścia do budowania
systemów oprogramowania z użyciem wielokrotnym.
• Przyczyną jej powstania było rozczarowanie faktem, że tworzenie
obiektowe nie doprowadziło do szerokiego stosowania użycia
wielokrotnego, jak się wcześniej spodziewano.
• Poszczególne klasy obiektów były zbyt szczegółowe i specyficzne.
• Musiały być dowiązane do programu użytkowego w czasie
kompilacji lub konsolidacji systemu.
• Do ich wykorzystania była potrzebna szczegółowa wiedza, co
zwykle oznaczało konieczność udostępnienia kodu źródłowego.
Powodowało to trudne problemy ze sprzedażą komponentów na
rynku.
• Wbrew wczesnym optymistycznym przewidywaniom nigdy nie
powstał znaczący rynek pojedynczych obiektów.
Tworzenie komponentowe c.d.
• Postrzeganie komponentu jako dostawcy usług
dotyczy
dwóch
istotnych
charakterystyk
komponentu użycia wielokrotnego.
• Komponent jest niezależnym wykonywalnym
bytem. Kod źródłowy nie jest dostępny, a zatem
komponentu nie kompiluje się z innymi
komponentami systemu.
• Komponenty publikują swój interfejs. Wszystkie
interakcje odbywają się przez ten interfejs.
Interfejs komponentu jest zapisywany w
kategoriach parametryzowanych operacji. Jego
wewnętrzny stan nigdy nie jest ujawniany.
Interfejsy komponentów
• Interfejs oferowany
– Definiuje się usługi oferowane przez ten
komponent.
• Interfejs wymagany
– Określa się, jakie usługi muszą być dostępne w
systemie używającym tego komponentu. Jeśli nie
są one oferowane, to komponent nie będzie działał.
Komponent
Interfejs wymagany Interfejs oferowany
Komponent usług drukarskich
Komponent usług
drukarskich
PodajPlikOpisu
Interfejsdrukarki
Drukuj
PodajStanKolejki
Usuń
Przekaż
Rejestruj
Wyrejestruj
Interfejs wymagany Interfejs oferowany
Poziomy abstrakcji
komponentów
• Abstrakcja funkcyjna.
– Komponent jest implementacją jednej funkcji,
np. matematycznej.
• Przypadkowe grupowanie.
– Komponent jest grupa luźno powiązanych bytów.
• Abstrakcja danych
– Komponent jest abstrakcją danych lub klasą
obiektowego języka programowania.
• Abstrakcja grupowa.
– Komponent jest grupą powiązanych klas, które
działają razem.
• Abstrakcja systemowa.
– Komponent jest całym samodzielnym systemem.
Tworzenie z wielokrotnym
użyciem
Projektowanie
architektoniczne
Projektowanie
architektoniczne
Poszukaj
komponentów użycia
wielokrotnego
Poszukaj
komponentów użycia
wielokrotnego
Zaprojektuj system
korzystając
z komponentów
użycia wielokrotnego
Zaprojektuj system
korzystając
z komponentów
użycia wielokrotnego
Naszkicuj
wymagania
systemowe
Naszkicuj
wymagania
systemowe
Poszukaj
komponentów użycia
wielokrotnego
Poszukaj
komponentów użycia
wielokrotnego
Na podstawie wyników
poszukiwań zmień
wymagania
Na podstawie wyników
poszukiwań zmień
wymagania
Trudności przy tworzeniu
komponentowym
• Kod źródłowy komponentów jest zwykle
niedostępny. W takiej sytuacji, gdy
program użytkowy wymaga modyfikacji,
nie ma możliwości zmiany komponentu
mającej na celu odzwierciedlenie tych
wymagań.
• Zmiana wymagań tak, by pasowały do
istniejących komponentów, może być
niemożliwa.
Użycie wielokrotne produktów
COTS
• Pojęcie produktów COTS (Commercial-Off-
The-Shelf – komercyjne z półki) może być
zastosowane do każdego komponentu
oferowanego przez zewnętrznego dostawcę.
• Zwykle używa się go jednak tylko w
wypadku produktów będących systemami
oprogramowania.
• Od
wielu
lat
wielokrotnie
używano
niektórych rodzajów systemów COTS.
Systemy baz danych są chyba najlepszym
tego przykładem.
Tworzenie komponentów użycia
wielokrotnego
• Komponenty użycia wielokrotnego są specjalnie
budowane z istniejących komponentów.
• Cechy komponentu świadczące o jego zdatności
do użycia wielokrotnego:
– komponent powinien odzwierciedlać stabilną
abstrakcję dziedzinową,
– komponent musi ukrywać sposób reprezentacji
swoich danych i oferować operacje
umożliwiające odczyt i aktualizację jego stanu,
– komponent powinien być tak niezależny, jak to
tylko jest możliwe,
– wszystkie wyjątki powinny być częścią
interfejsu komponentu.
Problemy
• W wielu obecnie dostępnych systemach
istnieją
duże
fragmenty
kodu,
które
implementują abstrakcje dziedzinowe, ale nie
mogą być wykorzystane jako komponenty.
• Przyczyna leży w tym, że nie opakowano ich
zgodnie z modelem z jasno określonymi
interfejsami wymaganym i oferowanym.
• Uczynienie z nich komponentów użycia
wielokrotnego zwykle wymaga zbudowania
osłony.
• Osłona ukrywa złożoność schowanego kodu i
oferuje zewnętrzne
Uzdatnianie komponentów
• Między zdatnością do użycia wielokrotnego a użytecznością
komponentu występuje nieuchronny konflikt.
• Uzdatnienie komponentu do użycia wielokrotnego pociąga
za sobą zaoferowanie bardzo ogólnego interfejsu z
operacjami obsługującymi rozmaite sposoby użycia tego
komponentu.
• Budowa użytecznego komponentu obejmuje zaoferowanie
prostego, minimalnego interfejsu, który jest łatwy do
zrozumienia.
• Zdatność do użycia wielokrotnego zwiększa złożoność, a
zatem zmniejsza zrozumiałość komponentu.
• Inżynierom jest więc trudno zdecydować, kiedy i jak
wielokrotnie używać komponentu.
• Projektanci komponentów użycia wielokrotnego muszą
zatem wypracować kompromis między ogólnością a
zrozumiałością.
Architektura
• Osiągnięcie
znaczącej
zdatności
do
użycia
wielokrotnego
wymaga
zaprojektowania
architektury, w której zasadnicze udogodnienia
systemowe będą oddzielone od szczegółowej
informacji
o
zasobach,
które
mają
być
inwentaryzowane i od dostępu użytkownika do tych
informacji.
• Architektura może spełniać te wymagania dzięki
zastosowaniu architektury warstwowej, w której
warstwa szczegółów zawiera opisy zasobów,
wyświetlane ekrany i tworzone raporty.
• Wyższe warstwy systemu korzystają z tych opisów i
nie obejmują wpisanej na sztywno informacji o
zasobach. Różne systemy inwentaryzacyjne powstają
przez modyfikację tej warstwy opisowej.
Zręby programów użytkowych
•
Zręby (lub zręby programów użytkowych) są projektami
podsystemów składających się z kolekcji klas
abstrakcyjnych i klas konkretnych oraz interfejsu
między nimi.
•
Poszczególne części systemu programów użytkowych
implementuje się przez dodanie komponentów i
opracowanie
konkretnych
implementacji
klas
abstrakcyjnych zrębu.
•
Zręby rzadko są programami użytkowymi.
•
Zrąb jest uniwersalną strukturą, którą można
rozszerzyć w celu stworzenia bardziej specyficznego
programu użytkowego. Ma on zastosowanie w procesie
tworzenia
obiektowego,
gdzie
można
się
nim
posługiwać zamiast pojedynczymi obiektami.
•
Rozszerzenie zrębu może polegać na dodaniu
konkretnych klas, które dziedziczą operacje po klasach
abstrakcyjnych zrębu.
Klasy zrębów
• Zręby infrastruktury systemów
– Wspomagają
tworzenie
infrastruktury
systemów,
takiej
jak
komunikacja,
interfejsy użytkownika i kompilatory.
• Zręby integracji śródprogramów
– Składają się ze zbioru standardów i
związanych z nimi klas obiektów, które
wspomagają komunikację komponentów i
wymianę informacji.
• Zręby zastosowań przemysłowych
– Dotyczą
specyficznych
dziedzin
zastosowań, takich jak telekomunikacja
lub finanse.
Przykład:
zrąb Model-Widok-Koordynator
• Po raz pierwszy przedstawiono go w latach
osiemdziesiątych XX wieku jako podejście
do projektowania graficznego interfejsu
użytkownika.
• Zrąb MVC pomaga w prezentacji danych
na różne sposoby i odrębne oddziaływanie
z każdą z nich.
• Gdy dane są modyfikowane przez jedna
prezentację,
wszystkie
inne
są
aktualizowane.
Zrąb Model-Widok-Koordynator
Stan widoku
Metody widoku
Stan modelu
Metody modelu
Stan koordynatora
Metody koordynatora
Zapytania
i
aktualizacj
e
modelu
Modyfikacje
modelu
Komunikaty o
modyfikacji
widoku
Inżynieria
oprogramowania
Wykład 14 –
wzorce projektowe.
Prezentacja częściowo oparta na prezentacji przygotowanej przez Bartosza Waltera (UW)
Idea
• Dążenie do jednolitości rozwiązań,
ich klasyfikacji i uproszczenia.
• Czy można zapisać rozwiązanie
jakiegoś problemu w sposób ogólny,
abstrahując od szczegółowych
rozwiązań? Pozwoliłoby to ująć tzw.
dobre praktyki w postaci szablonów,
które można stosować wielokrotnie,
unikając typowych błędów.
Geneza
• Wzorce projektowe wywodzą się z architektury. Twórcą
tego pojęcia jest amerykański architekt, Christopher
Alexander, który postawił tezę, że piękno,
funkcjonalność oraz inne cechy użytkowe lub
konstrukcyjne można zapisać właśnie w postaci
uogólnionych rozwiązań.
• Zdaniem Aleksandra, każdy wzorzec powinien być
opisany przez następujące atrybuty:
- układ sił działających na niego: czyli środowisko i jego
wpływ
- rozwiązanie: schemat konstrukcji, która uwzględnia
działające siły, równoważy je i oferuje najlepsze
osiągnięcie celu przy założonych czynnikach
- kontekst: opis warunków, w których rozwiązanie
można zastosować
• Taki wzorzec jest gotowym schematem postępowania,
który można zastosować w wielu sytuacjach, łącząc go
także z innymi wzorcami.
Wzorce projektowe w
informatyce
• E. Gamma, R. Helm, R.Johnson i J. Vlissides, znani jako
Banda Czterech (Gang of Four) - Design Patterns (Wzorce
projektowe) -1995
• W swojej książce opisali 24 wzorce projektowe dotyczące
konstrukcji, struktury i zachowania obiektów w systemach
informatycznych. Ich zdaniem, poziom abstrakcji wzorca
projektowego powinien znajdować się powyżej poziomu
pojedynczej klasy.
• Od tego czasu wzorce projektowe stały się jednym z
podstawowych narzędzi projektowania systemów.
• Powstały nowe, specjalizowane wzorce poświęcone
rozwiązaniom dla konkretnych technologii czy platform (np.
wzorce dla J2EE).
Klasyfikacja wzorców w
inżynierii oprogramowania
• wzorce architektoniczne – poziom
integracji komponentów.
• wzorce projektowe – poziom interakcji
między klasami.
• wzorce analityczne – poziom opisu
rzeczywistości.
• wzorce implementacyjne – poziom języka
programowania.
Klasyfikacja wzorców
projektowych
• Kreacyjne (konstrukcyjne)
-opisują elastyczne sposoby tworzenia obiektów
-uniezależniają system od sposobu tworzenia obiektów
-wykorzystywane do pozyskiwania obiektów zamiast
bezpośredniego tworzenia instancji klas
• Strukturalne
-pomagają łączyć obiekty w większe struktury
-opisują sposób konstrukcji struktur obiektowych
-korzystają z dziedziczenia i delegacji
• Czynnościowe (behawioralne)
-opisują algorytmy i przydział odpowiedzialności
-służą do zdefiniowania komunikacji pomiędzy obiektami
oraz kontrolowania przepływu danych w złożonej aplikacji
• nazwa – lakoniczny opis istoty wzorca
• klasyfikacja – kategoria, do której
wzorzec należy
• cel – przeznaczenie wzorca
• aliasy – alternatywne nazwy wzorca
• motywacja – scenariusz opisujący
problem i jego rozwiązanie
• zastosowania – sytuacje, w których
wzorzec jest stosowany
• struktura – graficzna reprezentacja klas
składowych wzorca
Szablon wzorca projektowego
• uczestnicy – nazwy i zakres
odpowiedzialności uczestników wzorca
• współdziałanie – opis współpracy między
uczestnikami
• konsekwencje – efekty zastosowania wzorca
• implementacja – opis implementacji wzorca
w danym języku
• przykład – kod stosujący wzorzec
• pokrewne wzorce – wzorce używane w
podobnym kontekście
Szablon wzorca projektowego
(c.d.)
Moduły w systemie bibliotecznym:
• katalogi, przechowujące informacje o zbiorach
biblioteki, i porządkujące je według wybranego
kryterium
• karty książek, które reprezentują poszczególne
egzemplarze książki i które są przechowywane
w katalogach
• karty czytelników, służące do przechowywania
danych o czytelnikach: ich danych osobowych,
historii rezerwacji, wypożyczeń etc.
• mechanizm kontaktu z czytelnikiem,
pozwalający dowiadywać się o stanie
rezerwacji, nowościach w bibliotece etc.
Przykład - biblioteka
Katalog rzeczowy
Wymagania:
• struktura hierarchiczna kategorii oznaczonych
cyframi
• nieograniczone możliwości rozwoju
• łatwość wyszukiwania
• możliwość zmiany położenia książki
(Struktura katalogów: autorskiego i alfabetycznego jest intuicyjnie zrozumiała)
Rozwiązanie: Drzewo
• Interfejs Przeszukiwalny posiada dwie implementacje: Kategorię
(która jest związana relacją agregacji z dowolną liczbą obiektów
zależnych typu Przeszukiwalny, a zatem zarówno innych Kategorii,
jak i Książek) oraz Książkę (reprezentującą element struktury, który
nie posiada obiektów zależnych).
• Obiekt klasy Katalog rzeczowy, który wywoła metodę szukaj() w
kategorii
znajdującej się w korzeniu drzewa katalogu, nie musi znać struktury
tego drzewa, jego głębokości ani innych własności.
• Każda Kategoria, po wywołaniu jej metody szukaj(), realizuje ten
sam algorytm: wykonuje wyszukiwanie na własnym obiekcie, a
następnie wywołuje tę samą metodę na każdym jej obiekcie
zależnym, co powoduje rekurencyjne przeszukanie drzewa w głąb.
Wspólny interfejs o nazwie
Przeszukiwalny jest
implementowany
we wszystkich obiektach, które
są
częścią struktury i w których
można
szukać książek.
Wzorzec Composite (Kompozyt)
• Komponent
– deklaruje wspólny interfejs dla obiektów znajdujących się w strukturze
– implementuje wspólną funkcjonalność wszystkich obiektów
• Liść
– reprezentuje węzeł bez potomków
• Kompozyt
– reprezentuje węzeł z potomkami
– przechowuje referencje do potomków
– deleguje otrzymane polecenia do potomków
Wzorzec Composite –
podsumowanie
• Określa metodę konstrukcji hierarchicznych struktur,
którymi można zarządzać poprzez jeden węzeł – korzeń.
Dzięki temu podstawowe operacje, takie jak
wyszukiwanie elementów, nie wymagają żadnej wiedzy o
strukturze drzewa.
• Popularność tego wzorca wynika z oferowanej przez
niego możliwości elastycznego zarządzania złożonymi
strukturami. Ponadto wszystkie elementy struktury
realizują ten sam algorytm, co ułatwia ich testowanie.
• Mechanizm ten jest jednym z najczęściej
wykorzystywanych wzorców projektowych, np. w
systemach okienkowych. Strukturę drzewiastą tworzą
wówczas składowe okienek: przyciski, etykiety, listy etc.
Przesunięcie okienka na ekranie powoduje automatyczne
przesunięcie wszystkich jego elementów.
• Zalety: elastyczna definicja struktur drzewiastych, proste
dodawanie nowych komponentów, proste i spójne
zarządzanie strukturą o dowolnej liczbie elementów
Karty czytelników
Wymagania:
• istnieją trzy rodzaje kart czytelnika: Standard,
Junior i Senior
• karta może zmieniać swój typ
• typ karty określa zachowanie karty czytelnika (np.
wysokość opłaty za korzystanie z biblioteki i
wysokości kar za nieterminowy zwrot książek.
• istnieją trzy typy kart, lecz liczba ta może ulec
zmianie w przyszłości
Rozwiązanie 1: podklasy
Wady i zalety rozwiązania:
(+) pozwala na dziedziczenie metod i ich pokrywanie.
(–) uniemożliwia dodanie nowego typu karty bez
rekompilacji kodu.
(–) uniemożliwia prostą zmianę typu karty (trzeba by
usuwać obiekt z jednoczesnym utworzeniem
nowego przy przepisaniu atrybutów).
Rozwiązanie 2: delegacja
• Rozdzielenie odpowiedzialności Karty Czytelnika na
część przechowującą dane i część reprezentującą
stan.
• Część przechowująca dane, nadal nazywana Kartą
Czytelnika, posiada referencję do obiektu
reprezentującego aktualny typ, dziedziczącego po
klasie abstrakcyjnej lub implementującej interfejs.
• Dzięki temu zmiana typu karty wymaga jedynie
utworzenia instancji innej klasy Typ Karty i
przypisanie jej do Karty Czytelnika.
Wzorzec State (Stan)
• Kontekst
– posiada referencję do obiektu reprezentującego bieżący stan
• Stan abstrakcyjny
– definiuje interfejs pozwalający hermetyzować zachowanie
związane z każdym stanem
• Stan konkretny
– definiuje własne metody implementujące zachowanie
specyficzne dla tego stanu
Wzorzec State: podsumowanie
• Podział zachowania obiektu wg stanów
– kod związany z jednym stanem jest zapisany w
jednym obiekcie
• Zmiana stanu jest realizowana przez zmianę
obiektu stanu na inny
• Zastosowanie wzorca pozwala modyfikować
zachowanie obiektów tak, jakby zmieniała się ich
klasa – i to jest najważniejszy cel i skutek
• Ochrona przed stanem niespójnym
• Możliwość współdzielenia obiektów
– obiekty zwykle definiują tylko zachowanie
– obiekty zwykle są bezstanowe
Książki
Wymagania
• Docelowa liczba książek jest nieograniczona
• Każda książka posiada swoją kartę
• Książka może składać się z wielu tomów, które mogą być
wypożyczane pojedynczo, niezależnie od innych tomów
• możliwe jest wykonywanie zapytań na liście książek
• umiarkowana złożoność pamięciowa
Rozwiązanie 1: 1 książka = 1
obiekt
Wady i zalety:
(+) intuicyjne i łatwe przetwarzanie
(–) gigantyczne zapotrzebowanie na pamięć
(–) ograniczenia wydajnościowe
(–) nieracjonalne wykorzystanie zasobów
Rozwiązanie 2: anonimowe książki
Przechowujemy obiekty nieaktywne, wymagające inicjacji
przed przekazaniem Klientowi. Dane charakteryzujące obiekt
są w razie potrzeby odczytywane z bazy danych. Klient
otrzymuje więc obiekt dokładnie taki, jakiego oczekuje, bez
niepotrzebnego zużycia zasobów.
Wady i zalety:
(+) ograniczone użycie pamięci z racjonalnym zarządzaniem
(+) niejawne konfigurowanie obiektów danymi instancji
(+) ograniczona liczba jednocześnie wykorzystywanych obiektów
Wzorzec Flyweight (Waga piórkowa)
• Obiekt
– podlega
współdzieleniu między
klientów
– definiuje interfejs do
przyjmowania i
odtwarzania stanu
zewnętrznego obiektu
– przechowuje stan
wewnętrzny
(współdzielony)
– jest niezależny od
kontekstu (z wyjątkiem
stanu zewnętrznego)
• Fabryka obiektów
– tworzy i przechowuje
obiekty
Wzorzec Flyweight:
podsumowanie
• Zmniejszenie wymagań pamięciowych programu
– zmniejszenie ogólnej liczby obiektów
– stan zewnętrzny może być przechowywany lub
wyliczany
• Wzrost złożoności obliczeniowej
– dodatkowy nakład mocy na zarządzanie stanem
zewnętrznym
Rozwiązanie 3: wzorzec Pool of Objects (pula obiektów)
- pula aktywnych obiektów, które definiują swój czas
życia
- klient otrzymuje obiekt za pośrednictwem puli obiektów
- posiada dużą wadę: jest stosowalny do obiektów
nierozróżnialnych
Kontakt z czytelnikiem
Wymagania
• powiadamianie o stanie rezerwacji
• powiadamianie o nowych książkach
• Czytelnik może zarezerwować książkę, która aktualnie jest
niedostępna. Informacja o dostępności książki zostanie
wysłana do czytelnika natychmiast po jej zwrocie przez
poprzedniego czytelnika
Rozwiązanie 1: okresowe
odpytywanie
Wady i zalety:
(+) intuicyjna metoda uzyskiwania informacji
(–) wymaga ciągłej aktywności czytelnika
(–) absorbuje zasoby po stronie Biblioteki
Rozwiązanie 2: powiadamianie
Wady i zalety:
(+) Biblioteka powiadamia tylko gdy nastąpiła zmiana stanu
rezerwacji
(+) brak obciążenia czytelnika
(zasoby po stronie Biblioteki są angażowane jedynie w
momencie rzeczywistej zmiany stanu, a Czytelnik nie jest
przez tę operację absorbowany w żaden sposób)
Wzorzec Observer (Obserwator)
• Podmiot
– utrzymuje rejestr
Obserwatorów
– umożliwia dołączanie i
odłączanie Obserwatorów
– powiadamia Obserwatorów o
zmianie swojego stanu
• Obserwator
– posiada interfejs służący do
powiadamiania o zmianach
– aktualizuje swój stan na
podstawie powiadomienia
Wzorzec Observer: podsumowanie
• Luźniejsze powiązania pomiędzy
obiektami:
– Podmiot komunikuje się z innymi
obiektami przez interfejs Obserwatora
– Podmiot i Obserwatorzy mogą należeć do
różnych warstw abstrakcji
• Programowe rozgłaszanie komunikatów
• Spójność stanu Podmiotu i Obserwatorów
• Czasem używa się nazwy wzorca: Listener
Dostęp do bazy danych
• Każde łączenie się z bazą jest dla aplikacji
kosztowne, bo wymaga czasochłonnego
uwierzytelnienia i autoryzacji.
• W tym przypadku sensowniej jest stworzyć
jeden obiekt przechowujący sesję
połączenia i wykorzystać go do przesłania
wielu zapytań.
• Istnieje zatem potrzeba stworzenia klasy,
która posiadałaby wyłącznie jedną
instancję
Rozwiązanie: Wzorzec Singleton
• Tworzymy klasę, która posiada statyczną metodę, która najpierw
sprawdza, czy istnieje już instancja tej klasy - jeśli nie istnieje to
tworzy ją - i następnie zwraca ją przez referencję. Instancja klasy
jest przechowywana w prywatnym lub chronionym, statycznym
polu, do którego dostęp ma tylko opisana wyżej metoda. Owa
metoda dostępowa jest jedyną drogą pozyskania instancji obiektu
singletonu - aby uniemożliwić tworzenie dodatkowych instancji w
zwykły sposób, czyli przez wywołanie konstruktora, deklaruje się
go jako prywatny lub chroniony.
• Dodatkową korzyścią z zastosowania takiego rozwiązania jest to,
że cały proces jest niewidoczny dla użytkownika i nie musi on
wiedzieć, czy instancja istnieje czy też nie.
Wzorce projektowe –
podsumowanie
• Wzorce projektowe są abstrakcyjnymi rozwiązaniami
powtarzających się problemów
• Każdy wzorzec posiada określony zbiór atrybutów
• Wzorce pozwalają efektywnie rozwiązywać problemy
projektowe
• Są jednym z podstawowych narzędzi projektowania systemów
• Nie należy ich jednak traktować jako gotowe recepty do
bezpośredniego wykorzystania w dowolnym problemie – często
wymagają dostosowania do konkretnego problemu
• Antywzorce – przykłady wzorców postępowania lub
projektowania, których należy unikać
• Krytyka wzorców projektowych:
- Wzorzec musi zostać zaimplementowany dla każdego nowego
zastosowania. Krok wstecz w stosunku do stosowania
komponentów?
-Podejście nie różni się zbytnio od innych form abstrakcji, np.
od paradygmatu Model-Widok-Sterownik, który istniał
wcześniej
Zestawienie podstawowych wzorców
projektowych (polskie nazewnictwo)
Wzorce konstrukcyjne
* Fabryka abstrakcyjna
* Budowniczy
* Metoda fabrykująca
* Prototyp
* Singleton
Wzorce strukturalne
* Adapter
* Most
* Kompozyt
* Dekorator
* Fasada
* Pośrednik
* Waga piórkowa
Wzorce czynnościowe
* Łańcuch odpowiedzialności
* Polecenie
* Interpretator
* Iterator
* Mediator
* Obserwator (Słuchacz)
* Stan
* Strategia
* Metoda szablonu
* Wizytator (Odwiedzający)
Przykład wzorca projektowego: XMLPatterns.com Flyweight
Abstract: If the same information is included at many different points in a document the information can be placed in just one place,
and shared from each place in the document that needs to refer to it.
Problem: Placing the same information in many different place can cause several problems: a) Mistakes can be made in copying the
information. b) If the data changes, all occurrences of the information must be located and changed. This makes maintenance of
the document difficult. c) Documents can become quite large if the same information is repeated over and over again.
Context: This is a very general pattern, almost any document type can make use of it. This pattern can be used anywhere where the
same information must be repeated more than once in a document. The repeated data can occur in the document declaration, or
in the document instance itself.
Forces: This pattern can effect the length of the document, maintainability, and readability of the document.
Solution: Place the shared information in just one place, and make references to it from every place in the document that needs to
include this information. There are several ways to do this: a) Use XML Entity Declarations. These provide a way to do text
substitutions inside of a document. The XML Specification Section 4.2 Entity Declarations (http://www.w3.org/TR/REC-xml#sec-
entity-decl) b) Use the XLink attribute xlink:show="embed". This technique has the advantage of using a standard, so some tools
may be available to do the processing. This is defined in The W3C's XML Linking Language Specification
(http://www.w3.org/TR/xlink/#link-behaviors) c) Use ID and IDREF attributes. A reference can be made to an entity via an IDREF
attribute. Applications processing this will need to do the processing to do this type of Flyweight. See the Examples section for an
example of each of the above techniques.
Examples
XML Entities: This example shows how XML Entities can be used to put a piece of information in just one place, and then have it
appear in multiple places in the document. <!DOCTYPE Doc[ <!ENTITY TITLE "My Document"> ]> <Document>
<title>&TITLE;</title> <H1>&TITLE;</H1> This is my paragraph. </Document>
XLink: This document shows the use of XLink attributes to include the contents of a document in two different places. Since XLink is
a standard it is possible that existing tools could be used to do the substitution. <Document> <title> <include
xlink:show="embed" xlink:href="titledoc.txt"/> </title> <h1> <include xlink:show="embed" xlink:href="titledoc.txt"/> </h1>
This is my paragraph. </Document>
ID and IDREF: This shows how ID and IDREF attributes can be used as a Flyweight. Note thats this would require some extra work on
the part of the processing software to do the substitution. <Document> <text id="title">My Document</text> <title
IDREF="title"/> <h1 IDREF="title"/> </Document>
Discussion: This pattern can greatly enhance the maintainability of a document, if the same data is repeated several times, and that
data changes, every occurrence of that data must be found and updated. This can be a tedious and error prone task. Having the
data in only one place allows all occurrences of it to be changed at once. The Flyweight pattern should not be used if the shared
information can vary over time. This would increase the maintenance burden of the document. Readability of the document can
suffer if the Flyweight pattern is used, readers are forced to reference a different section of the document when looking at the
contents.
Related Patterns: See Declare Before First Use for suggestions on where to place the shared information.
Known Uses: a)XHTML uses a a common attributes parameter entity that is a Flyweight. b) The XML & SGML Cookbook page 1-126
mentions the Flyweight pattern.