110 likes | 259 Views
Μεθοδολογίες Προγραμματισμού ΙΙ Μ Ε Τ Ρ Ι Κ Ε Σ ΑΝΤΚΕΙΜΕΝΟΣΤΡΕΦΟΥΣ ΣΧΕΔΙΑΣΗΣ Ποιότητα Λογισμικού. Παναγιώτης Σφέτσος , PhD http://aetos.it.teithe.gr/~sfetsos/ sfetsos@it.teithe.gr. Cyclomatic Complexity ( CC). :: Κυκλωματική Πολυπλοκότητα (1/ 2 ). if ( V == 0 && V1 == 0 || C() )
E N D
Μεθοδολογίες Προγραμματισμού ΙΙ Μ Ε Τ Ρ Ι Κ Ε Σ ΑΝΤΚΕΙΜΕΝΟΣΤΡΕΦΟΥΣ ΣΧΕΔΙΑΣΗΣ Ποιότητα Λογισμικού Παναγιώτης Σφέτσος, PhD http://aetos.it.teithe.gr/~sfetsos/ sfetsos@it.teithe.gr
Cyclomatic Complexity (CC) ::Κυκλωματική Πολυπλοκότητα (1/2) if ( V == 0 && V1 == 0 || C() ) {…. ……. } entoli; ... entoli; CC = 3, (3 – συνθήκες) entoli; ……… switch( V) case 1: .... case 2: .... default: .... ... entoli; entoli; ... switch( someVariable ) case 1: .... case 2: .... case 3: .... case 4: .... ... entoli; CC = 4, (4 – cases) CC = 2, (2 – cases) Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Cyclomatic Complexity (CC) ::Κυκλωματική Πολυπλοκότητα (2/3) public void one(){ if(true) { while(false) { two(); } } else { for(int i=0;i<10;i++) { two(); } } } Στη μέθοδο υπάρχει μια if – εντολή που περιλαμβάνει μια while, ενώ το τμήμα elseπεριλαμβάνει μια for – εντολή. Ποια θα είναι η CC; Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Cyclomatic Complexity (CC) ::Κυκλωματική Πολυπλοκότητα (3/3) CC = 8 – 6 + 2(1) = 4 CC = V(G) = e – n +2p Στη μέθοδο υπάρχουν 4-διακριτά μονοπάτια . public void one(){ if(true) { while(false) {two();} } else { for(int i=0;i<10;i++) {two();} }} Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Weighted Methods per Class (WMC) ::Σταθμισμένες Μέθοδοι ανά Κλάση (1/2) • Η WMPC1 αθροίζει τις τιμές της CC σε όλες τις μεθόδους της κλάσης. • Όπου: • n, ο αριθμός των μεθόδων ανά κλάση και • ci,η πολυπλοκότητα κάθε μεθόδου • Η WMPC2 αθροίζει το πλήθος των μεθόδων και το πλήθος των παραμέτρων. Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Weighted Methods per Class (WMC) ::Σταθμισμένες Μέθοδοι ανά Κλάση (2/2) cc 3 2 1 6 mc 1 1 2 4 public class WMPC { public void one(){ if(true) { two(); } else {} if(true && !false){} } public void two(){ if(true){} } public void three(int i){} } <= 1 - μέθοδος <= 1 - μέθοδος <= 1 – μέθοδος και 1-παράμετρος Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Lack of Cohesion of Methods (1/5) Παράδειγμα - 1: Mία κλάση έχει τις μεθόδους m1, m2, m3, και m4 και τα πεδία f1, f2, f3, και f4. Τα πεδία που χρησιμοποιεί κάθε μέθοδος είναι: m1 f1, f2m2 f3m3 f2, f4m4 f1 Υπολογίζουμε του όρους P και Q. Παίρνουμε όλα τα ζεύγη των μεθόδων και εξετάζουμε εάν έχουν κοινά πεδία. Το P = 4, επειδή τα ζεύγη m1-m2, m2-m3, m2-m4, m3-m4 δεν έχουν κάποιο κοινό πεδίο. Το Q = 2, επειδή τα ζεύγη m1-m3 και m1-m4 χρησιμοποιούν κοινά πεδία.Άρα η LCOM1 = 2. Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Lack of Cohesion of Methods (2/5) Παράδειγμα - 2: Έστω μία κλάση με τις μεθόδους: M1, M2, M3 και τα πεδία που περιέχουν αντίστοιχα είναι: I1 = {a, b, c, d, e} I2 = {a, b, e} I3 = {x, y, z} τότε: P = {(I1, I3), (I2, I3)} Q = {(I1, I2)} Έτσι η LCOM = 1 Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Lack of Cohesion of Methods (3/5) Παράδειγμα υπολογισμού LCOM: Επτά ζευγάρια: (m1, m3), (m1, m4), (m2, m4), (m5, m1), (m5, m2), (m5, m3), (m5, m4), δεν έχουν κοινές μεταβλητές. Άρα LCOM = 10 – 3 = 7. Fig. mi- μέθοδοι που έχουν πρόσβαση σε ajμεταβλητές Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Lack of Cohesion of Methods (4/5) Παράδειγμα: public PersonDetails{Το LCOM; private String firstname; private String surname; private String street; private String city; public PersonDetails() {}//I1 = { } public setName(String f, String s){//I2 = { firstname, surname } firstname= f; surname = s;} public setAddress(String st, String c){// I3 = { street, city } street = st; city = c;} public void printAddress() {//I4 = { street, city } System.out.println( street); System.out.println( city);} public void printName() {// I5 = { firstname, surname } System.out.println( firstname + " " + surname);}} Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Lack of Cohesion of Methods (5/5) Pair (mi, mj) Ii ∩ Ij PersonDetails, setName 0 PersonDetails, setAddress 0 PersonDetails, printAddress 0 PersonDetails, printName 0 setName, setAddress 0 setName, printAddress 0 setName, printName {_firstname, _surname} setAddress, printAddress {_street, _city} setAddress, printName 0 printAddress, printName 0 LCOM8 Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ