Μεθοδολογίες Προγραμματισμού ΙΙ Μ Ε Τ Ρ Ι Κ Ε Σ ΑΝΤΚΕΙΜΕΝΟΣΤΡΕΦΟΥΣ ΣΧΕΔΙΑΣΗΣ Ποιότητα Λογισμικού Παναγιώτης Σφέτσος, PhD
if ( V == 0 && V1 == 0 || C() ) {…. ……. } entoli;... entoli; CC = 3, (3 – συνθήκες) if ( V == 0 && V1 == 0 || C() ) {…. ……. } entoli;... entoli; CC = 3, (3 – συνθήκες) Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ 2 Cyclomatic Complexity (CC) :: Κυκλωματική Πολυπλοκότητα (1/2) entoli; ……… switch( V) case 1:.... case 2:.... default: entoli;... switch( someVariable ) case 1:.... case 2:.... case 3:.... case 4: entoli; CC = 2, (2 – cases) CC = 4, (4 – cases)
Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ 3 Cyclomatic Complexity (CC) public void one(){ if(true) { while(false) { two(); } } else { for(int i=0;i<10;i++) { two(); } :: Κυκλωματική Πολυπλοκότητα (2/3) Στη μέθοδο υπάρχει μια if – εντολή που περιλαμβάνει μια while, ενώ το τμήμα else περιλαμβάνει μια for – εντολή. Ποια θα είναι η CC;
Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ 4 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();} }}
Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ 5 Weighted Methods per Class (WMC) :: Σταθμισμένες Μέθοδοι ανά Κλάση (1/2) Η WMPC1 αθροίζει τις τιμές της CC σε όλες τις μεθόδους της κλάσης. Όπου: n, ο αριθμός των μεθόδων ανά κλάση και ci, η πολυπλοκότητα κάθε μεθόδου Η WMPC2 αθροίζει το πλήθος των μεθόδων και το πλήθος των παραμέτρων.
Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ 6 Weighted Methods per Class (WMC) :: Σταθμισμένες Μέθοδοι ανά Κλάση (2/2) public class WMPC { public void one(){ if(true) { two(); } else { } if(true && !false){ } } public void two(){ if(true){} } public void three(int i){} } cc mc <= 1 - μέθοδος <= 1 – μέθοδος και 1-παράμετρος
Παράδειγμα - 1: Mία κλάση έχει τις μεθόδους m1, m2, m3, και m4 και τα πεδία f1, f2, f3, και f4. Τα πεδία που χρησιμοποιεί κάθε μέθοδος είναι: m1f1, f2 m2f3 m3f2, f4 m4f1 Υπολογίζουμε του όρους P και Q. Παίρνουμε όλα τα ζεύγη των μεθόδων και εξετάζουμε εάν έχουν κοινά πεδία. Το P = 4, επειδή τα ζεύγη m1-m2, m2-m3, m2-m4, m3-m4 δεν έχουν κάποιο κοινό πεδίο. Το Q = 2, επειδή τα ζεύγη m1-m3 και m1-m4 χρησιμοποιούν κοινά πεδία. Άρα η LCOM1 = 2. Παράδειγμα - 1: Mία κλάση έχει τις μεθόδους m1, m2, m3, και m4 και τα πεδία f1, f2, f3, και f4. Τα πεδία που χρησιμοποιεί κάθε μέθοδος είναι: m1f1, f2 m2f3 m3f2, f4 m4f1 Υπολογίζουμε του όρους P και Q. Παίρνουμε όλα τα ζεύγη των μεθόδων και εξετάζουμε εάν έχουν κοινά πεδία. Το P = 4, επειδή τα ζεύγη m1-m2, m2-m3, m2-m4, m3-m4 δεν έχουν κάποιο κοινό πεδίο. Το Q = 2, επειδή τα ζεύγη m1-m3 και m1-m4 χρησιμοποιούν κοινά πεδία. Άρα η LCOM1 = 2. Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ 7 Lack of Cohesion of Methods (1/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 Παράδειγμα - 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 Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ 8 Lack of Cohesion of Methods (2/5)
Παράδειγμα υπολογισμού LCOM: Επτά ζευγάρια: (m1, m3), (m1, m4), (m2, m4), (m5, m1), (m5, m2), (m5, m3), (m5, m4), δεν έχουν κοινές μεταβλητές. Άρα LCOM = 10 – 3 = 7. Παράδειγμα υπολογισμού LCOM: Επτά ζευγάρια: (m1, m3), (m1, m4), (m2, m4), (m5, m1), (m5, m2), (m5, m3), (m5, m4), δεν έχουν κοινές μεταβλητές. Άρα LCOM = 10 – 3 = 7. Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ 9 Lack of Cohesion of Methods (3/5) Fig. mi- μέθοδοι που έχουν πρόσβαση σε aj μεταβλητές
Παράδειγμα: 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); }} Παράδειγμα: 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); }} Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ 10 Lack of Cohesion of Methods (4/5)
Pair (mi, mj) Ii ∩ Ij PersonDetails, setName0 PersonDetails, setAddress 0 PersonDetails, printAddress0 PersonDetails, printName 0 setName, setAddress 0 setName, printAddress 0 setName, printName {_firstname, _surname} setAddress, printAddress {_street, _city} setAddress, printName 0 printAddress, printName 0 LCOM 8 Pair (mi, mj) Ii ∩ Ij PersonDetails, setName0 PersonDetails, setAddress 0 PersonDetails, printAddress0 PersonDetails, printName 0 setName, setAddress 0 setName, printAddress 0 setName, printName {_firstname, _surname} setAddress, printAddress {_street, _city} setAddress, printName 0 printAddress, printName 0 LCOM 8 Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ 11 Lack of Cohesion of Methods (5/5)