Metryki logicznej struktury programu, czyli przepływu sterowania Liczby cyklomatyczne McCabe V LI (G) = e n +p+1, V(G) = e n + 2*p

Podobne dokumenty
Te atrybuty wewnętrzne są wyrażane za pomocą tzw. metryk, czyli prostych wyrażeń, wiążących pewne elementy programu (projektu, kodu źródłowego itp.).

Metryki. Przykłady pomiaru złożoności modułowej i międzymodułowej oprogramowania. autor: Zofia Kruczkiewicz

Te atrybuty wewnętrzne są wyraŝane za pomocą tzw. metryk, czyli prostych wyraŝeń, wiąŝących pewne elementy programu (projektu, kodu źródłowego itp.).

Złożoność strukturalna programów, metryki złożoności modułowej

Wykład 6. Charakterystyki zewnętrzne a wewnętrzne oprogramowania (2) Narzędzia do pomiaru programowania. autor: Zofia Kruczkiewicz

Iteracyjno-rozwojowy cykl oprogramowania cykl 2. Java Zofia Kruczkiewicz 1

Metryki. Pomiar złożoności modułowej i międzymodułowej oprogramowania. autor: Zofia Kruczkiewicz

Metryki. Narzędzia do pomiaru złożoności modułowej i międzymodułowej oprogramowania. autor: Zofia Kruczkiewicz 1

Instrukcja 3 Laboratorium z Podstaw Inżynierii Oprogramowania

Wykład 5. Charakterystyki zewnętrzne a wewnętrzne oprogramowania (1) - definicje metryk międzymodułowych i modułowych autor: Zofia Kruczkiewicz

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Modele struktur zarządzania Wykład 4

Wykład 4_2 część druga. Iteracyjno-rozwojowy cykl oprogramowania 4

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Instrukcja 4 Laboratorium z Podstaw Inżynierii Oprogramowania. Warstwa klienta: Interfejs graficzny użytkownika

Instrukcja 1 Laboratorium z Podstaw Inżynierii Oprogramowania. Relacja 1 do 1..0 instrukcja z lab1

Jakość oprogramowania. Część 1

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

Metody Metody, parametry, zwracanie wartości

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

Reprezentacje grafów nieskierowanych Reprezentacje grafów skierowanych. Wykład 2. Reprezentacja komputerowa grafów

Modelowanie obiektowe

Laboratorium 8 Diagramy aktywności

Diagram stanów Laboratorium 9

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 5

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Diagramy czynności Na podstawie UML 2.0 Tutorial

Grafem nazywamy strukturę G = (V, E): V zbiór węzłów lub wierzchołków, Grafy dzielimy na grafy skierowane i nieskierowane:

Podstawowe własności grafów. Wykład 3. Własności grafów

MATEMATYKA DYSKRETNA - MATERIAŁY DO WYKŁADU GRAFY

Matematyczne Podstawy Informatyki

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

Ogólne wiadomości o grafach

Programowanie obiektowe

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

Klasy i obiekty cz II

Programowanie, algorytmy i struktury danych

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Diagramy stanów tworzenie modeli analizy i projektowania Na podstawie UML 2.0 Tutorial

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Wykład 4: Klasy i Metody

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

{ Dane1 d=(dane1)o; return nazwisko.equals(d.nazwisko) && srednia==d.srednia && uwagi.equals(d.uwagi); }

Języki i metody programowania Java. Wykład 2 (część 2)

2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych

Podstawy Programowania C++

Języki i metody programowania Java Lab2 podejście obiektowe

Rysunek 1: Przykłady graficznej prezentacji klas.

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

KURS MATEMATYKA DYSKRETNA

Instrukcja Wprowadzenie do tworzenia oprogramowania. Relacja 1 do 1..0 instrukcja z lab1

Instrukcja 1 Laboratorium z Podstaw Inżynierii Oprogramowania. Relacja 1 do 1..0 instrukcja z lab1

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

Data Mining Wykład 9. Analiza skupień (grupowanie) Grupowanie hierarchiczne O-Cluster. Plan wykładu. Sformułowanie problemu

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

Programowanie - instrukcje sterujące

Szablony klas, zastosowanie szablonów w programach

Rozdział 4 KLASY, OBIEKTY, METODY

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Zarządzanie jakością oprogramowania

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Dokumentacja do API Javy.

Przykłady grafów. Graf prosty, to graf bez pętli i bez krawędzi wielokrotnych.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Wykład 7: Pakiety i Interfejsy

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 5

Matematyka dyskretna. Andrzej Łachwa, UJ, /15

1 Podstawy c++ w pigułce.

Diagramy czynności tworzenie modelu przypadków użycia Wykład 2

Laboratorium 2_3_4 Wzorce oprogramowania zastosowane w modelu obiektowym (wg Alan Shalloway, James R.Trott)

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Podstawy programowania obiektowego

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Technologie i usługi internetowe cz. 2

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Digraf. 13 maja 2017

a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Przykład 1 Iteracja 2 tworzenia oprogramowania Diagramy klas i sekwencji:

Model przypadków użycia - rola diagramów aktywności Część 2 Wykładowca Dr inż. Zofia Kruczkiewicz

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie obiektowe

Wykład 5: Więcej o Klasach i Metodach

Teoria grafów podstawy. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Przypomnienie o klasach i obiektach

TEORIA GRAFÓW I SIECI

Programowanie obiektowe

Transkrypt:

Wykład 14 Złożoność strukturalna programów, metryki złożoności modułowej Wzmocnienie powiązań wewnątrz-modułowych prowadzi do zmniejszenia oddziaływań między modułami oraz poprawy struktury oprogramowania. Metryki rozmiaru [12] SLOC Jest to liczba wierszy kodu źródłowego programu liczona niezależnie od liczby instrukcji lub fragmentów instrukcji znajdujących się w każdym wierszu. Nie wlicza się wierszy z komentarzami lub pustych wierszy. SLOC jest powszechnie używaną metryką do szacowania nakładów pracy nad programem oraz jest mocno skorelowana z testowalnością, konserwowalnością i zrozumiałością. S/C Metryka ta jest liczbą wszystkich elementów programu należących do bloków logicznych: inicjowanie zmiennych sterujących int i=0 porównanie i <10 zwiększanie zmiennej sterującej i++ liczba instrukcji w każdym bloku for (;;) {... Żetony Jest to zbiór metryk, które określają liczbę: η 1 - liczbę typów operatorów(słownik typów operatorów), czyli liczbę: operatorów predefiniowanych (logicznych, arytmetycznych, przypisania, relacyjnych itp.), słowa kluczowe instrukcji (while, if, else, do), nazwy funkcji η 2 - liczbę typów argumentów(słownik typów argumentów), czyli liczbę: wszystkich symboli reprezentujących dane przy deklaracji i definicji η 3 - liczbę wszystkich wystąpień operatorów η 4 - liczbę wszystkich wystąpień argumentów Metryki logicznej struktury programu, czyli przepływu sterowania Liczby cyklomatyczne McCabe V LI (G) = e n +p+1, V(G) = e n + 2*p Liczba ta jest wyznaczana na podstawie grafu przedstawiającego drogi sterowania w programie, gdzie n jest liczbą wierzchołków grafu reprezentujących poszczególne instrukcje, w tym wywołania funkcji, e jest liczbą krawędzi grafu reprezentujących połączenia poszczególnych realizacji instrukcji, p jest liczbą podgrafów rozłącznych, a każda funkcja stanowi niezależny podgraf, którego wywołanie jako wierzchołek jest umieszczony w innym podgrafie. Metryka V(G) uwypukla istnienie funkcji za pomocą składnika 2*p, V LI (G) natomiast wywołanie funkcji traktuje na równi z innymi instrukcjami. Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 1

Przykład 8.1 a) call a1 call a2 a1 a2 Cała aplikacja a) e=20, n=19, p=3 V(G) = e-n+2*p =20 19 + 2*3=7 V LI (G) = e n+p+1= =20-19+3+1=5 b) e=23, n=20, p=1 V(G) = V LI (G) = =e n + 2 = e n + 2*p =23-20+2=5 b) a1 Metody a1 i a2 (przypadki a i b): e=8, n=7, p=1 V(G)= V LI (G) = = e n + 2 = e n + 2*p = 8-7+2=3 a2 Metoda a1 Metoda a2 Całość a V(G) 3 3 7 V LI (G) 3 3 5 b V(G) 3 3 5 V LI (G) 3 3 5 Uwaga: Dla programów sekwencyjnych (bez instrukcji if, if else oraz pętli) obie liczby cyklomatyczne są równe 1, ponieważ zawsze e=n-1. Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 2

package mm1; public class M1 { double x1,x2; public void setx1(double x1_) { x1=x1_; public void setx2(double x2_) { x2 = x2_; package mm2; import java.lang.math; import mm1.m1; public class M2 { private double a, b, c; private M1 pierw = new M1();; public M2(double a_, double b_, double c_) { a=a_; b=b_; c=c_; public int a1 () { int B; double pom=2*a, d=b*b-4*a*c; if (a==0) B=0; else if (d<0) B=1; else { B=2; d=math.sqrt(d); pierw.setx1((-b-d)/pom); pierw.setx2((-b+d)/pom); return B; Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 3

package mm3; import mm2.m2; public class M3 { M2 B; public M3 (M2 B_) { B=B_; public void a2( ) { int b=b.a1(); if (b<1) System.out.println("Brak równania kwadratowego\n"); else if (b==1) System.out.println("Brak pierwiastków rzeczywistych\n"); else System.out.println("Rownanie ma pierwiastki rzeczywiste\n"); package pprogram1; import mm3.m3; import mm2.m2; public class Program1 { public static void main(string arg[]) { M2 rownanie=new M2(1,2,3); M3 info= new M3(rownanie); info.a2(); Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 4

Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 5

Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 6

Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 7

Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 8

Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 9

Przykład 8.2 Problem pętli a) dwie pętle sekwencyjne a:while (x>= 0) c: {x=x-y; (gdy a==true) b: (gdy a==false) d:while (y>= 10) (koniec a) f: { x=x+1; (gdy d==true) y=y-1; e: (gdy d==false) g: (koniec d, koniec programu) V(G)=e-n+2*p=3 V LI (G)=e-n+p+1=8-7+2=3 SLOC=7 S/C=7 b) podwójna pętla zagnieżdżona a:while (x>= 0) {x=x-y; (gdy a==true) c: while (y>= 10)(gdy a==true) e: {x=x+1;(gdy c==true i a==true) y=y-1; d: (gdy c==false i a==true) f: (koniec c i a==true) b: (gdy a==false) g: (koniec a, koniec programu) V(G)=e-n+2*p=3 V LI (G)=e-n+p+1=8-7+2=3 SLOC=7 S/C=9 Zgodnie z aksjomatem 7 (wykład 7) pętla zagnieżdżona powinna mieć złożoność różną od programu z dwiema sekwencyjnie wykonywanymi pętlami. Jednak zarówno SLOC, V(G), V LI (G) są identyczne w obu rozwiązaniach, natomiast różne są wartości metryki S/C. Wg metryki S/C bardziej złożony jest program z zagnieżdżoną pętlą. b b e a g a g d d c f c f e Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 10

Dodatek* Metryki P 1, P 2 (Henderson-Sellers) P 1 = a 1 V(G) + a 2 N* + a 3 (v e 1) P 2 = [a 1 V(G) + a 2 N*] a 3 v e - wersja addytywna - wersja multiplikatywna gdzie: a 1, a 2, a 3 są współczynnikami, które dla uproszczenia mają wartość 1 N* = i P(i), gdzie p(i) jest długością ścieżki zagnieżdżenia i-tego predykatu w instrukcjach decyzyjnych v e liczba cyklomatyczna wyznaczana dla programów niestrukturalnych v e = d+1, gdzie d jest liczbą niestrukturalnych rozgałęzień w programie ( ) Przykład 8.3 g1) g2) g3) g4) g5) g6) g7) Przykłady grafów przepływu sterowania Tabela z wartościami obliczonych metryk złożoności przepływu sterowania g1 g2 g3 g4 g5 g6 g7 V(G) 4 4 4 4 4 4 4 v e 1 4 4 1 1 1 1 P1 4 7 7 6 5 6 7 P2 4 16 16 6 5 6 7 Metryki P 1, P 2 najlepiej odzwierciedlają złożoność przepływu sterowania w przedstawionych przykładowych grafach struktury logicznej przykładowych programów g1-g7. Małą złożoność mają grafy g1 i g5. Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 11

Metryki struktur danych Liczba zmiennych, które istnieją we wskazanym fragmencie lub całym programie. METRYKI SPÓJNOŚCI Metryki spójności określają stopień powiązania między metodami klas występujących w oprogramowaniu i atrybutami klas. Oznacza to, że im więcej metod przetwarza te same atrybuty (np. zbiór metod przetwarzający tablicę), tym wyższa spójność oprogramowania. Typy spójności wewnątrz modułu: przypadkowe oznacza łączenie klas, które podczas projektowania nie były traktowane jako całość logiczne operacje tworzące logiczną całość np. rodzina klas dziedziczących po klasie io dla operacji we/wy (moduł iostream.h w programach C++) czasowe inicjowanie np. grafiki, a dopiero potem rysowanie figur sekwencyjne wykonywanie ustalonych sekwencji instrukcji np. operacje na plikach fizycznych wymagają zachowania kolejności działań: otwieranie pliku wraz z kojarzeniem z plikiem fizycznym, następnie przetwarzanie (zapis, odczyt) pliku i na koniec zamykanie pliku, funkcjonalne najbardziej zalecany stopień osiągniętej spójności. Dotyczy on powiązanych ze sobą metod przetwarzających te same atrybuty. Przy wyznaczaniu spójności funkcjonalnej rozważa się zależności między metodami i atrybutami, przetwarzanymi przez te metody. W przypadku, gdy dowolna metoda wywołuje inną metodę, należy przypisać tej metodzie wszystkie atrybuty, z którymi jest związana metoda wywoływana. Wyznaczenie spójności funkcjonalnej oparto się na multigrafie dwudzielnym. Multigrafem dwudzielnym G(N1, N2, E) nazywamy taki graf, w którym wierzchołki można podzielić na dwa podzbiory N1 i N2 w taki sposób, że każda krawędź ze zbioru E grafu G łączy dowolny wierzchołek zbioru N1 z dowolnym wierzchołkiem zbioru N2. Każda para wierzchołków może być połączona wieloma krawędziami równoległymi Zbiór E jest zbiorem krawędzi. Krawędź jest parą nieuporządkowaną, z których każdy zawiera wierzchołek z N1 i wierzchołek z N2, wyznaczające krawędź. Definicja ta dopuszcza istnienie krawędzi równoległych. Pełnym multigrafem dwudzielnym nazywamy taki graf dwudzielny, w którym wszystkie wierzchołki z N1 są połączone krawędziami ze zbioru E ze wszystkimi wierzchołkami N2. Składowa spójna multigrafu niespójnego G(N1,N2,E) jest jego multipodpodgrafem dwudzielnym G (N1,N2,E ), takim że zbiór N1 jego wierzchołków jest zawarty w zbiorze wierzchołków N1, zbiór wierzchołków N2 w zbiorze N2, zbiór krawędzi E w zbiorze krawędzi E, jednak nie istnieje taka krawędź ze zbioru E, która łączy dowolny wierzchołek z N1 z dowolnym wierzchołkiem z N2-N2 lub dowolny wierzchołek z N1-N1 z dowolnym wierzchołkiem z N2. Graf lub podgraf spójny zawiera tylko jedną składową spójności. Przy wyznaczaniu spójności modułu wierzchołki ze zbioru N1 reprezentują metody, wierzchołki ze zbioru N2 przetwarzane dane, natomiast krawędzie ze zbioru E- związki pojedyncze i wielokrotne między danymi i metodami. W pracy spójność oprogramowania obiektowego jest określana na etapie modelowania na podstawie diagramu klas UML. Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 12

W celu określenia i oceny spójności oprogramowania wyznacza się model spójności oprogramowania SP, zwany dalej grafem funkcjonalnym. Jest to multigraf dwudzielny, zdefiniowany jako trójka SP= (M, A, R) Zbiór M reprezentuje zbiór metod należących do wszystkich klas, zbiór A reprezentuje zbiór atrybutów wszystkich klas, natomiast R jest zbiorem krawędzi, które reprezentują pojedyncze i wielokrotne powiązania między atrybutami ze zbioru A z tymi metodami ze zbioru M, które je przetwarzają. W przypadku polimorfizmu do zbioru metod M wstawia się tylko ich implementacje. Atrybuty obiektowe są powiązane ze wszystkimi metodami klasy, z której pochodzą, uwzględniając również metody dziedziczone. Metryka Spójność_M określa spójność grafu funkcjonalnego SP na podstawie zależności wiążącej liczbę krawędzi całego modelu ze zbioru R z liczbą wierzchołków ze zbioru M i powiązanych wierzchołków ze zbioru A, występujących w tym modelu. Jest to zależność Spójność_M = ϕ(m, A, R). Metrykę Spójność_M wyznacza się przy założeniu, że graf funkcjonalny SP zawiera: albo jedną składową spójności, albo wiele składowych spójności. Stąd w pracy zdefiniowano metrykę Spójność_M jako Spójność_M= LW 1 = 1 + r m a m a m LW1, gdy graf funkcjonalny jest spójny LW2, gdy graf funkcjonalny jest niespójny z a + 1 + 1 LW 2 = ( m r k z 1) ( a 1) 1 Jeżeli dwa wierzchołki są połączone krawędziami równoległymi, to liczba tych krawędzi wyłączając jedną z nich, jest dodawana do liczby z. Przyjęto m= M, a= A, r jest liczbą wszystkich krawędzi r= R (pojedynczych i równoległych), k liczbą składowych spójności. Dla grafów zawierających jeden typ danej (a=1) i jedną metodę (m=1), lub m=1 i a>1 lub a=1 i m>1, przy założeniu spójności grafu (k=1) przyjęto LW1=1, natomiast dla grafów niespójnych przyjęto LW2=0 dla a=2, m=2, k=2. W literaturze znana jest metryka spójności LCOM zdefiniowana jako a 1 ( r µ ( A j )) m a m j = 1 LCOM = = a 1 m 1 m, gdzie m jest liczbą wierzchołków zbioru M, a jest liczbą wierzchołków A, natomiast wyrażenie µ(a j ) liczbą krawędzi grafu wiążącą atrybut A j z określoną liczbą metod (elementy zbioru R). Maksymalna wartość spójności oznacza wartość 0 metryki, co uzyskuje się przy grafie pełnym ( M * A krawędzi). W tabeli 1 podano wyrażenia na wartości metryk LCOM, LW1 dla grafów spójnych oraz LW2 dla grafów niespójnych wraz z warunkami granicznymi, wynikającymi ze specyfiki grafów funkcjonalnych (wykluczono wielokrotnie powiązane atrybuty i metody, stąd z jest równe 0). Wartość metryki LCOM równa 0 określa maksymalną spójność klasy, a wartość 1 określa minimalną spójność klasy. Zakres wartości dla poszczególnych metryk Zakres spójności LW1 LW2 LCOM Max 2 (r=m*a) 1 (r=(m-1)*(a-1)+1, k=2) 0 ( µ(a j )=r=m*a) Min 1 (r=m+a-1) 0 (r=k=m=a) 1 ( µ(a j )=r=m=a) Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 13

1) 2) m1 m2 m3 m1 m2 m3 Przykłady grafów funkcjonalnych o różnej spójności a1 a2 a3 a4 a1 a2 a3 a4 3) m1 a1 4) m2 m3 m4 m5 Lp M A R 1 {m1,m2,m3 {a1,a2,a3,a4 {{m1,a1,{m1,a2,{m2,a2, {m2,a3,{m3,a2,{m3,a4 2 {m1,m2,m3 {a1,a2,a3,a4 {{m1,a1,{m1,a2,{m2,a1, {m2,a2,{m2,a3,{m3,a4 3 {m1,m2,m3,m4,m5 {a1,a2,a3,a4,a5 {{m1,a1,{m2,a2,{m3,a3, {m4,a4,{m5,a4,{m5,a4 4 {m1,m2,m3,m4,m5, m6,m7,m8 {a1,a2,a3,a4,a5, a6,a7,a8 5 {m1,m2,m3,m4 {a1,a2,a3,a4.a5, a6,a7,a8 a2 a3 a4 a5 Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 14 m1 m2 m3 m4 m5 m6 m7 m8 a1 a2 a3 a4 a5 a6 a7 a8 m1 m2 m3 m4 {{m1,a1,{m1,a3,{m1,a5,{m2,a2, {m3,a2,{m3,a3,{m4,a3,{m4,a4, {m5,a4, {m5,a5,{m6,a5,{m6,a6, {m7,a6,{m7,a7,{m8,a1,{m8,a8 {{m1,a1,{m1,a2,{m1,a3,{m1,a4, {m1,a5,{m2,a1,{m2,a2,{m2,a5, {m3,a6,{m3,a7,{m3,a8,{m4,a4, {m4,a6,{m4,a7,{m4,a8 Przykłady tabeli przyległości dla grafów funkcjonalnych 1) i 2) x\y a1 a2 a3 a4 x\y a1 a2 a3 a4 m1 1 1 m1 1 1 m2 1 1 m2 1 1 1 m3 1 1 m3 1 Metryki grafów spójnych LW1 oraz niespójnych LW2 oraz LC OM r (LW1) r (LW2) Lp m a r k LW1 LW2 LCOM Min r Max r Min r Max r 1 3 4 6 1 1-0.75 6 12 2 3 4 6 2-0.8 0.75 5 7 3 5 5 6 4-0.1333 0.95 - - 6 7 4 8 8 16 1 1.0204-0.8571 15 64 5 4 8 15 1 1.1905-0.7083 11 32 5) a1 a2 a3 a4 a5 a6 a7 a8

Metoda wyznaczania spójności modułu Do reprezentowania grafu funkcjonalnego SP wybrano macierz przyległości o wymiarach M A, zdefiniowaną jako A=[a ij ], gdzie element macierzy a ij jest równy 0, gdy nie istnieje połączenie a ij R między wierzchołkiem n 1i M i n 2j A, oraz równy liczbie połączeń między nimi w przeciwnym wypadku. Macierz przyległości reprezentuje tabela przyległości, w której kolumny odpowiadają elementom ze zbioru A, a wiersze elementom ze zbioru M. (1) Metoda wyznaczenia tabeli przyległości 1. W tabeli przyległości kolejnym wierszom przyporządkowano metody wszystkich klas, natomiast kolumnom odpowiednio rozpatrywane atrybuty wszystkich klas. 2. W przypadku, gdy metoda przetwarza dany atrybut, należy do zawartości komórki leżącej na przecięciu określonego wiersza z określoną kolumną dodać wartość oznaczającą liczbę powiązań. W przypadku wywołania innej metody przez rozpatrywaną metodę, należy przepisać wszystkie wartości większe od 0 do odpowiadających kolumn w wierszu przyporządkowanym rozpatrywanej metodzie. 3. W przypadku atrybutów obiektowych dodaje się wartość oznaczającą liczbę powiązań do zawartości komórek na przecięciu kolumny tego obiektu z wierszami zawierającymi metody klasy obiektu. Umożliwia to utworzenie reprezentacji grafu funkcjonalnego całego oprogramowania. (2) Metoda wyznaczenia składowych spójności grafu funkcjonalnego 1. Ustal licznik składowych k =1 i wybierz pierwszy wiersz w tabeli przyległości. 2. Wybierz kolejny wiersz i 2.1. Przepisz wszystkie wartości większe od 0 z pozostałych wierszy, które mają przynajmniej jedną wartość większą od 0 w danej kolumnie wiersza i. 2.2. Sprawdź, czy zmieniła się liczba wartości większych od 0 w wierszu i. Jeśli tak, przejdź do kroku 2.1, w przeciwnym wypadku wykonaj krok 2..3. 2.3. Usuń wiersz i oraz wszystkie wiersze wykryte w punkcie 2.1. 2. Sprawdź, czy pozostał jakiś wiersz. Jeśli tak, wykonaj k=k+1, gdyż wyodrębniono kolejną składową spójności, i przejdź do kroku 2. W przeciwnym wypadku zakończ algorytm, gdyż wyodrębniono już wszystkie składowe spójności w liczbie k. (3) Metoda obliczenia wartości metryk 3. Należy wypełnić tabelę przyległości multigrafu dwudzielnego (metoda (1)) 4. Wyznaczyć liczbę składowych spójności k (metoda (2)) 5. Wyznaczyć sumę wartości większych od zera równą r oraz liczbę z jako różnicę liczby r i liczby wartości większych od 0. Są to: liczba krawędzi multigrafu dwudzielnego r= R oraz liczba powiązań wielokrotnych z. 6. Podstawić do wyrażenia LCOM: µ(a j )=r, m= M, a= A i obliczyć wartość metryki 7. Podstawić do wyrażenia LW1: r, z, m= M, a= A i obliczyć wartość metryki, jeśli k=1, w przeciwnym wypadku należy wyznaczyć LW2 Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 15

Przykład 8.3. Obliczanie metryki spójności - dotyczy programu z przykładu 8.1. M2) a M2 b a1 c M1) setx1 setx2 x1 x2 pierw M3 1) Spójność klasy M1 a=2, m=2, r=2 r m LCOM = a = 1 1 m 2) Spójność klasy M2 a=4, m=2, r=7 r 7 m 2 LCOM = a = 4 = 0.25 1 m 1 2 3) Spójność klasy M3 a=1, m=2, r=2 r 2 m 2 LCOM = a = 1 = 0 1 m 1 2 Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 16

Przykład 8.4. package ksiazka1; import tytul1.tytul_ksiazki; public class Ksiazka { private int numer; /** @poseidon-generated */ public Tytul_ksiazki tytul_ksiazki; /** @poseidon-generated */ public int getnumer() { return numer; /** @poseidon-generated */ public void setnumer(int _numer) { numer = _numer; public Ksiazka() { /** @poseidon-generated */ public boolean equals(object _ksiazka) // your code here { return numer==((ksiazka)_ksiazka).getnumer(); public Tytul_ksiazki gettytul_ksiazki() /** @poseidon-generated */ { return tytul_ksiazki; public void settytul_ksiazki(tytul_ksiazki tytul_ksiazki) { if (this.tytul_ksiazki!= tytul_ksiazki) /** @poseidon-generated */ { if (this.tytul_ksiazki!= null) this.tytul_ksiazki.removeksiazka(this); this.tytul_ksiazki = tytul_ksiazki; if (tytul_ksiazki!= null) tytul_ksiazki.addksiazka(this); public String tostring() { String pom=tytul_ksiazki.tostring(); pom+=" Numer: "+getnumer(); return pom; // your code here Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 17

package tytul1; import ksiazka1.ksiazka; public class Tytul_ksiazki { private String wydawnictwo; /** @poseidon-generated */ private String ISBN; /** @poseidon-generated */ private String tytul; /** @poseidon-generated */ private String nazwisko; /** @poseidon-generated */ private String imie; /** @poseidon-generated */ public java.util.collection ksiazka = new java.util.arraylist(); /** @poseidon-generated */ public Tytul_ksiazki() { /** @poseidon-generated */ public String getwydawnictwo() { return wydawnictwo; /** @poseidon-generated */ public void setwydawnictwo(string _wydawnictwo) { wydawnictwo = _wydawnictwo; /** @poseidon-generated */ public String getisbn() { return ISBN; /** @poseidon-generated */ public void setisbn(string _ISBN) { ISBN = _ISBN; /** @poseidon-generated*/ public String gettytul() { return tytul; /** @poseidon-generated */ public void settytul(string _tytul) { tytul = _tytul; /** @poseidon-generated */ public String getnazwisko() { return nazwisko; /** @poseidon-generated */ public void setnazwisko(string _nazwisko) { nazwisko = _nazwisko; /** @poseidon-generated */ public String getimie() { return imie; /** @poseidon-generated */ public void setimie(string _imie) { imie = _imie; public boolean equals(object tytul_ksiazki) //kod uzupełniony { boolean a; a=isbn.equals(((tytul_ksiazki)tytul_ksiazki).getisbn()); //System.out.println(a); return a; Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 18

public String tostring() { String pom="tytul: "+gettytul(); pom+=" Autor:"+getNazwisko() +" "+getimie(); pom+=" ISBN: "+getisbn(); pom+=" Wydawnictwo:"+getWydawnictwo(); return pom; //kod uzupełniony public void Dodaj_ksiazke(int _numer) { Ksiazka nowa= new Ksiazka(); if (nowa!= null) { nowa.setnumer(_numer); addksiazka(nowa); // your code here public java.util.collection getksiazkas() { return ksiazka; /** @poseidon-generated */ public void addksiazka(ksiazka ksiazka) /** @poseidon-generated */ { if (!this.ksiazka.contains(ksiazka)) {this.ksiazka.add(ksiazka); ksiazka.settytul_ksiazki(this); public void removeksiazka(ksiazka ksiazka) /** @poseidon-generated */ { boolean removed = this.ksiazka.remove(ksiazka); if (removed) ksiazka.settytul_ksiazki((tytul_ksiazki)null); Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 19

package uchwyt1; import ksiazka1.ksiazka; import tytul1.tytul_ksiazki; import java.util.*; public class Uchwyt { public java.util.collection tytul_ksiazki= new java.util.arraylist(); public void Dodaj_tytul (String _nazwisko, String _imie,string _tytul,string _wydawnictwo,string _ISBN) { Tytul_ksiazki nowy=new Tytul_ksiazki(); //kod uzupełniony nowy.settytul(_tytul); nowy.setnazwisko(_nazwisko); nowy.setimie(_imie); nowy.setisbn(_isbn); nowy.setwydawnictwo(_wydawnictwo); addtytul_ksiazki(nowy); public java.util.collection gettytul_ksiazkis() /** @poseidon-generated */ { return tytul_ksiazki; public void addtytul_ksiazki(tytul_ksiazki tytul_ksiazki) {if(! this.tytul_ksiazki.contains(tytul_ksiazki)) /** @poseidon-generated */ this.tytul_ksiazki.add(tytul_ksiazki); public void removetytul_ksiazki(tytul_ksiazki tytul_ksiazki) { this.tytul_ksiazki.remove(tytul_ksiazki); /** @poseidon-generated */ Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 20

public void Dodaj_ksiazke(String _ISBN, int _numer) // your code here { Tytul_ksiazki pom=new Tytul_ksiazki(); pom.setisbn(_isbn); int idx=((java.util.arraylist)tytul_ksiazki).indexof(pom); if (idx!=-1) { Tytul_ksiazki pom1= (Tytul_ksiazki)((java.util.ArrayList)tytul_ksiazki).get(idx); pom1.dodaj_ksiazke(_numer); System.out.println(pom1.ksiazka.toString());//linia tymczasowa public static void main(string t[]) { Uchwyt ap=new Uchwyt(); ap.dodaj_tytul("1","1","1","1","1"); ap.dodaj_tytul("2","2","2","2","2"); ap.dodaj_tytul("2","2","2","2","2"); String lan=ap.tytul_ksiazki.tostring(); System.out.println(lan); //kod dodany ap.dodaj_ksiazke("1",1); ap.dodaj_ksiazke("1",2); ap.dodaj_ksiazke("1",2); ap.dodaj_ksiazke("2",1); Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 21

Rys.8.4.1. Diagram połączeń obiektów klasy Uchwyt z obiektami klas Tytul_ksiazki oraz Ksiazka (import pakietu ksiazka1)-połączenia wychodzące, oraz wzajemnych połączeń między obiektami klas Tytul_ksiazki oraz Ksiazka połączenia wychodzące Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 22

Rys.8.4.2. Diagram połączeń obiektów klasy Uchwyt z obiektami klasy Tytul_ksiazki połączenia wychodzące, oraz wzajemnych połączeń między obiektami klas Tytul_ksiazki oraz Ksiazka połączenia wychodzące Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 23

Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 24

Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 25

Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 26

Dodatek Wpływ spójności na odporność na błędy R b na przykładzie trzech modeli UML grafy funkcjonalne całego programu przydatne do wyznaczania metryk spójności Model 1 Model 2 Model 3 m=20, a=13, z=3, r=46 x=20, y=16, z=6, r=64 x=25, y=21, z=6, r=46 LW1=1.039 LW1=1.081 LW1=1.060 Λ Rb Λ Rb Λ Rb 0,0546 0,9469 0,0520 0,9493 0,0677 0,9345 0,3086 0,7345 0,3185 0,7273 0,4149 0,6604 0,0773 0,9256 0,0708 0,9317 0,0921 0,9120 0,2368 0,7891 0,2019 0,8172 0,2625 0,7691 0,5455 0,5796 0,5204 0,5943 0,6774 0,5079 3,0864 0,0457 3,1846 0,0414 4,1491 0,0158 2,3683 0,0936 2,0190 0,1328 2,6249 0,0724 Dalej przedstawiono modele klas UML dla przykładowych modeli oprogramowania, oraz podano grafy spójne funkcjonalne tych modeli, umożliwiające wyznaczenie metryk spójności LW1 oraz określenie odporności oprogramowania R b na błędy, wynikającej ze spójności tych modeli oraz średniej liczby błędów Λ metod, atrybutów i powiązań (tabela powyżej). Oznaczenia w grafach funkcjonalnych zawierają przedrostki poszczególnych nazw z diagramów klas UML Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 27

Rys. 1 Model klas UML pierwszego rozwiązania - M_1 f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 N_P C G P P_1 Z Nr Il e Z-y f18 f13 f14 f15 f16 f17 Itm [] P_ł N_R R_1 Z-y Idx Rys. 2 Graf funkcjonalny modelu M_1 Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 28

Rys. 3 Model klas UML drugiego rozwiązania - M_2 f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 N_P C G P P_2 P_3 P_1 Z Nr Il f18 f13 f14 f15 f16 f17 Itm [] P_ł N_R R_1 R_2 Z-y Idx Rys. 4 Graf funkcjonalny modelu M_2 Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 29

Rys.5 Model klas UML trzeciego rozwiązania - M_3 f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 N_P C G P P_2 P_3 P_1 Z_P Z Z_N Nr Il f21 f16 f17 f18 f19 f20 Itm [] Itm [] P_ł N_R R_1 R_2 Z-y Zy_P Idx Rys. 6 Graf funkcjonalny modelu M_3 Zy_N Idx Zofia Kruczkiewicz, Projektowanie oprogramowania 1, Wykład 14 30