Document 7850717

Download Report

Transcript Document 7850717

HMMY

Τεχνολογία Λογισμικού

Διδάσκων Κώστας Κοντογιάννης Αναπλ. Καθηγητής, Ε.Μ.Π

Τι Πραγματεύεται η Σχεδίαση Λογισμικού

Η ενότητα που ήταν σχετική με τις απαιτήσεις (requirements) μιας εφαρμογής λογισμικού, εστίασε σε τεχνικές και μεθοδολογίες που προδιαγράφουν ΤΙ πρόκειται να κάνει το σύστημα που θα υλοποιήσουμε. Η προδιαγραφή των απαιτήσεων δεν έχει να κάνει με τον τρόπο που θα υλοποιήσουμε το σύστημα, ούτε με την τεχνολογία / γλώσσα προγραμματισμού που μπορούμε να χρησιμοποιήσουμε.

 Αντίθετα, η ενότητα που είναι σχετική με τη σχεδίαση μιας εφαρμογής λογισμικού, εστιάζει σε τεχνικές και μεθοδολογίες που προδιαγράφουν ΠΩΣ το σύστημα θα εκτελέσει και διεκπεραιώσει τις προδιαγραμμένες λειτουργίες του. Κατά τη σχεδίαση λαμβάνουμε υπ’ όψη σχετικές τεχνολογίες, προγραμματιστικές τεχνικές, και γλώσσες προγραμματισμού. Η σχεδίαση περιγράφει και επιτρέπει:    

Την ανάλυση της στατικής δομής του συστήματος σε υπο-συστήματα, υπο-μονάδες (ψηφίδες) και τέλος, κλάσεις.

Η ανάλυση του συστήματος σε υπο-συστήματα και υπο-μονάδες ονομάζεται αρχιτεκτονική σχεδίαση.

Η ανάλυση υπο-μονάδων σε κλάσεις ονομάζεται λεπτομερής σχεδίαση. Την κατανομή και διαχείριση των εργασιών υλοποίησης, ελέγχου κλπ.

Την σύνδεση συγκεκριμένων υποσυστημάτων, ψηφίδων και, κλάσεων με συγκεκριμένες λειτουργικές και απαιτήσεις Την επίτευξη μη-λειτουργικών απαιτήσεων

Επίπεδα Σχεδίασης

• Αρχιτεκτονική Σχεδίαση (Architectural design, high-level design) •

Αρχιτεκτονική – Εστιάζει στην γενική δομή του συστήματος (υποσυστήματα – ψηφίδες και τις σχέσεις ανάμεσά τους)

• • •

Σχετίζεται και καλύπτει όλες τις βασικές περιπτώσεις χρήσης Σχετίζεται και καλύπτει τις βασικές μη-λειτουργικές απαιτήσεις Δεν αλλάζει (και δεν πρέπει να αλλάζει) εύκολα

• Λεπτομερής Σχεδίαση (Detailed design, low-level design) • • •

Περιγράφει την εσωτερική δομή κάθε ψηφίδας / κλάσης Λαμβάνει υπ’ όψη τα τη γλώσσα προγραμματισμού που θα χρησιμοποιηθεί Είναι αρκετά λεπτομερής για να υλοποιηθεί άμεσα στην κατάλληλη γλώσσα προγραμματισμού

Σχέση Ανάμεσα Σχεδιαστικούς Στόχους

Χαμηλό κόστος Αυξημένη παραγωγικότητα Συμβατότητα (backward) Ανιχνευσιμότητα απαιτήσεων Ταχεία υλοποίηση Ευελιξία του συστήματος Λειτουργι κότητα

Τελικός Χρήστης

Λειτουργικότητα Ευκολία χρήσης Ευκολία κατανόησης Σταθερότητα

Αξιοπιστία

Μεταφερσιμότητα Καλή τεκμηρίωση

Πελάτης (Customer, Sponsor)

Ελαχιστοποίηση σφαλμάτων Ευκολία αλλαγής κα επαναχρη σιμοποίηση Σαφείς διαπροσωπείες

Προγραμμα τιστής

Απόκρυψη Πληροφορίας – Information Hiding (Parnas)

 Ποιες πληροφορίες αποκρύπτουμε:    

Απεικόνιση / παράσταση δεδομένων Ιδιότητες μιας οντότητας (εκτός από τις απολύτως απαραίτητες που χρειάζονται οι χρήστες της οντότητας) Υλοποίηση μοντέλων Μηχανισμούς που υλοποιούν πρωτόκολλα και πολιτικές

 Μελλοντικές αλλαγές του συστήματος   

Αποκρύπτουμε λεπτομέρειες του συστήματος που πιθανόν να αλλάξουν στη διάρκεια της λειτουργίας του Δομικά στοιχεία του συστήματος (π.χ. Ψηφίδες) που είναι πιθανόν να να αλλάζουν με διαφορετικούς ρυθμούς Εκθέτουμε μόνο διαπροσωπείες που δεν πρόκειται να αλλάξουν

Άλλες Αρχές

 Σαφείς Διαπροσωπείες 

Ορίζουμε την εξάρτηση ανάμεσα σε υποσυστήματα ή ψηφίδες με σαφήνεια μέσω διαπροσωπειών (χωρίς άλλες κρυμμένες εξαρτήσεις)

 Χαμηλή Σύζευξη – Ελαχιστοποίηση των διαπροσωπειών 

Ελαχιστοποιούμε τις αλληλο-εξαρτήσεις ανάμεσα σε υποσυστήματα ή ψηφίδες

 Απλές διαπροσωπείες  

Συνδυάζουμε πολλές (και συναφείς) παραμέτρους σε δομές δεδομένων ή αντικείμενα Χωρίζουμε μεγάλες διαπροσωπείες σε μικρότερες

 Υψηλή συνεκτικότητα 

Μια ψηφίδα θα πρέπει να σχετίζεται με μια σαφή και καλώς ορισμένη λειτουργία. Ένα υποσύστημα θα πρέπει να αποτελείται από συναφείς ψηφίδες

Στοιχεία Διαπροσωπείας

 Οι λεπτομέρειες κλήσης των υπηρεσιών μιας ψηφίδας / υποσυστήματος από εξωτερικούς χρήστες / διαδικασίες  Συντακτικές λεπτομέρειες διαπροσωπείας 

Πληροφορίες σχετικές με το πως καλούμε μια υπηρεσία

  

Όνομα υπηρεσίας (μεθόδου) Τύπος επιστροφής Παράμετροι και τύποι παραμέτρων

 Σημασιολογικές λεπτομέρειες διαπροσωπείας   

Τι κάνει μια υπηρεσία που καλείται από τη διαπροσωπεία

  

Προαπαιτήσεις Αποτελέσματα Περιγραφή του αντικειμένου της λειτουργίας της υπηρεσίας Προδιαγραφές ποιοτικών χαρακτηριστικών της υπηρεσίας ...

Συνεκτικότητα και Σύζευξη

   Η Συνεκτικότητα είναι ένα μέτρο της εξάρτησης ανάμεσα στα στοιχεία μιας κλάσης / ψηφίδας  

Υψηλή συνεκτικότητα (High cohesion): Οι κλάσεις σε μια ψηφίδα (οι μέθοδοι σε μια κλάση) προσφέρουν συναφείς υπηρεσίες και, έχουν σχέσεις εταιρικότητας Χαμηλή συνεκτικότητα (Low cohesion): Οι κλάσεις σε μια ψηφίδα προσφέρουν άσχετες μεταξύ τους υπηρεσίες. Οι κλάσεις δεν έχουν σχέσεις εταιρικότητας

Η Σύζευξη είναι ένα μέτρο της εξάρτησης ανάμεσα σε υπο-συστήματα  

Υψηλή σύζευξη (High coupling): Αλλαγές σε ένα υποσύστημα προκαλούν αλλαγές σε κάποιο άλλο υπο-σύστημα (ανάγκη για αλλαγή στη παρουσίαση των δεδομένων, νέα συμβολομετάφραση) Χαμηλή σύζευξη (Low coupling): Αλλαγές σε ένα υποσύστημα δεν προκαλούν αλλαγές σε άλλα υποσυστήματα

Μια εφαρμογή θα πρέπει να παρουσιάζει υψηλή συνεκτικότητα στις ψηφίδες του και χαμηλή σύζευξη ανάμεσα στα υποσυστήματα

Βαθμοί Συνεκτικότητας

1. Τυχαία Συνεκτικότητα (Coincidental Cohesion) 2. Λογική Συνεκτικότητα (Logical cohesion) 3. Χρονική Συνεκτικότητα (Temporal cohesion) 4. Διαδικαστική Συνεκτικότητα (Procedural cohesion) 5. Επικοινωνιακή Συνεκτικότητα (Communicational cohesion) 6. Λειτουργική Συνεκτικότητα (Functional cohesion) 7. Πληροφοριακή Συνεκτικότητα (Informational cohesion) Χαμηλή Συνεκτικότητα - κακή Υψηλή Συνεκτικότητα - καλή

Τυχαία Συνεκτικότητα (Coincidental Cohesion)

 Έχουμε τυχαία συνεκτικότητα όταν το σύστημα έχει δομηθεί από ψηφίδες που έχουν τυχαίο τρόπο συγκρότησης δηλαδή, οι ψηφίδες και τα υποσυστήματα έχουν δομηθεί με τρόπο που δεν ακολουθεί κανόνες και αρχές της τεχνολογίας λογισμικού, αλλά άλλους «τυχαίους» κανόνες π.χ. Όλες οι ψηφίδες θα πρέπει να έχουν μέγεθος από 200 – 300 γραμμές πηγαίου κώδικα.

 Η τυχαία συνεκτικότητα είναι η χειρότερη μορφή συνεκτικότητας και σχεδιαστικής δομής

Λογική Συνεκτικότητα (Logical Cohesion)

 Ένα υποσύστημα / ψηφίδα / κλάση έχει λογική συνεκτικότητα εάν οι λειτουργίες του υποσυστήματος / ψηφίδας / κλάσης έχουν μια γενικά κοινή ροή ελέγχου. Οι διαφορές σε κάθε λειτουργία είναι αποτέλεσμα παραμετροποίησης. Η «λογική» έχει να κάνει με τον γενικά κοινή ροή ελέγχου σε κάθε λειτουργία της ψηφίδας  Τα υποσυστήματα / ψηφίδες / κλάσεις που έχουν λογική συνεκτικότητα έχουν σαν αποτέλεσμα συστήματα που είναι δύσκολο να κατανοηθούν και έχουν υψηλή σύζευξη  Η λύση είναι να αναλύσουμε και να μετατρέψουμε (refactor) τα υποσυστήματα / ψηφίδες / κλάσεις που έχουν λογική συνεκτικότητα σε νέα υποσυστήματα / ψηφίδες / κλάσεις ανάλογα με τις συγκεκριμένες λειτουργίες του κάθε υποσυστήματος / ψηφίδας / κλάσης, και όχι σε σχέση με κάποια κοινά στοιχεία ελέγχου που μπορεί λειτουργίες να μοιράζονται

Παράδειγμα Λογικής Συνεκτικότητας

void method(param1, param2, param3, ..., paramN) { variable declarations....

code common to all cases... [A]

if ( param1 == 1 )

[B]

...

else if ( param1 == 2 ) ...

else if ( param1 == n ) ...

end if

code common to all cases... [C]

if ( param2 == 1)

[D]

...

else if ( param2 == 5 ) ...

end if

code common to all cases... [E]

if ( param3 == 7 ) ...

}

Χρονική Συνεκτικότητα

 Ένα υποσύστημα / ψηφίδα / κλάση έχει λογική συνεκτικότητα εάν έχει δομηθεί με το κριτήριο ότι οι λειτουργίες του υποσυστήματος / ψηφίδας / κλάσης θα πρέπει να συμβαίνουν σε κάποιο κοινό χρονικό σημείο  Για παράδειγμα εάν θεωρήσουμε μια εφαρμογή να έχει τα παρακάτω βήματα: 

Τοποθέτηση αρχικών τιμών, εισαγωγή στοιχείων από το χρήστη, επεξεργασία στοιχείων, παραγωγή αποτελεσμάτων, έξοδος στοιχείων

 Τότε, εάν το σύστημα δομηθεί με κριτήριο τη χρονική συνεκτικότητα τότε θα έχει πέντε υποσυστήματα / ψηφίδες. Κάθε υποσύστημα / ψηφίδα θα έχει οργανωθεί με λειτουργίες με βάση το γεγονός ότι αυτές συμβαίνουν στην ίδια χρονική στιγμή.  Ένα σύστημα που έχει δομηθεί με κριτήριο τη λογική συνεκτικότητα πιθανόν να έχει αρκετά πανομοιότυπα τμήματα πηγαίου κώδικα (π.χ. Κάθε ψηφίδα θα έχει πανομοιότυπα τμήματα πηγαίου κώδικα που διαχειρίζεται βασικές δομές δεδομένων του συστήματος

Διαδικαστική Συνεκτικότητα

 Ένα υποσύστημα / ψηφίδα / κλάση έχει διαδικαστική συνεκτικότητα εάν έχει δομηθεί με το κριτήριο ότι οι λειτουργίες του υποσυστήματος / ψηφίδας / κλάσης σχετίζονται με κάποια ακολουθία βημάτων που θα πρέπει να ακολουθηθούν για την εκτέλεση κάποιας εργασίας  Για παράδειγμα, εάν ένα υποσύστημα / ψηφίδα / κλάση έχει δομηθεί έτσι ώστε οι λειτουργίες να σχετίζονται με συγκεκριμένα βήματα μιας διαδικασίας όπως “εισαγωγή δεδομένων από το πληκτρολόγιο”, “επιβεβαίωση δεδομένων”, “αποθήκευση δεδομένων σε μεταβλητές” τότε, το υποσύστημα / ψηφίδα / κλάση θα έχει διαδικαστική συνεκτικότητα  Η διαδικαστική συνεκτικότητα είναι πρακτικά χρονική συνεκτικότητα με τον επιπρόσθετο περιορισμό ότι οι λειτουργίες θα πρέπει να σχετίζονται και σαν βήματα κάποιας συγκεκριμένης διαδικασίας / εργασίας  Ένα σύστημα που έχει δομηθεί με κριτήριο τη διαδικαστική συνεκτικότητα πιθανόν να έχει αρκετά πανομοιότυπα τμήματα πηγαίου κώδικα

Παράδειγμα Διαδικαστικής Συνεκτικότητας

Module A operationA() { readΑData(data,filename1); processAData(data); storeΑData(data,filename2); } readΑData(data,filename) { f := openfile(filename); readrecords(f, data); closefile(f); } storeΑData(data,filename) {...} processAData(data) {...} Module B operationB() { readΒData(data,filename1); processBData(data); storeΒData(data,filename2); } readΒData(data,filename) { f := openfile(filename); readrecords(f, data); closefile(f); } storeΒData(data,filename) {...} processBData(data) {...}

Επικοινωνιακή Συνεκτικότητα

 Ένα υποσύστημα / ψηφίδα / κλάση έχει διαδικαστική συνεκτικότητα εάν έχει δομηθεί με το κριτήριο ότι οι λειτουργίες του υποσυστήματος / ψηφίδας / κλάσης σχετίζονται με κάποια ακολουθία βημάτων που θα πρέπει να ακολουθηθούν για την εκτέλεση κάποιας εργασίας ΚΑΙ όλες οι λειτουργίες διαχειρίζονται τα ίδια δεδομένα  Η επικοινωνιακή συνεκτικότητα είναι μια βελτίωση της διαδικαστικής συνεκτικότητας διότι όλες οι λειτουργίες διαχειρίζονται τα ίδια δεδομένα του συστήματος. Με άλλα λόγια έχουμε λειτουργίες που σχετίζονται και διαδικαστικά και σε σχέση με τα δεδομένα του συστήματος

Λειτουργική Συνεκτικότητα

 Ένα υποσύστημα / ψηφίδα / κλάση έχει λειτουργική συνεκτικότητα εάν έχει δομηθεί με το κριτήριο ότι οι λειτουργίες του υποσυστήματος / ψηφίδας / κλάσης σχετίζονται διότι υλοποιούν κάποια συγκεκριμένη λειτουργία ή επιτυγχάνουν κάποιο συγκεκριμένο στόχο του συστήματος  Υποσυστήματα / ψηφίδες / κλάσεις που διεκπεραιώνουν μια συγκεκριμένη λειτουργία είναι πιο επαναχρησιμοποιήσιμα. Παραδείγματα τέτοιων ψηφίδων είναι: “διάβασμα αρχείου”, “εκτύπωση γράφου”  Ένα άλλο πλεονέκτημα της λειτουργικής συνεκτικότητας είναι ότι επιτρέπει την απομόνωση και αναγνώριση υποσυστημάτων / ψηφίδων / κλάσεων που σχετίζονται με συγκεκριμένα σφάλματα

Πληροφοριακή Συνεκτικότητα

 Ένα υποσύστημα / ψηφίδα / κλάση έχει λειτουργική συνεκτικότητα εάν έχει δομηθεί με το κριτήριο ότι οι λειτουργίες του υποσυστήματος / ψηφίδας / κλάσης έχουν ξεχωριστά σημεία εισόδου δεδομένων, ανεξάρτητο κώδικα για κάθε υπηρεσία και όλες οι λειτουργίες διαχειρίζονται τα ίδια δεδομένα.  Στην πληροφοριακή συνεκτικότητα κάθε δομικό στοιχείο (π.χ. Συνάρτηση, μέθοδος) ενός υποσυστήματος / ψηφίδας / κλάσης υλοποιεί ή επιτυγχάνει κάποια συγκεκριμένη λειτουργία ή στόχο του συστήματος  Η πληροφοριακή συνεκτικότητα σε μια ψηφίδα / κλάση αντιστοιχεί με την ιδέα του αφηρημένου τύπου δεδομένων  Συνεπώς, μια καλοσχεδιασμένη κλάση επιδεικνύει πληροφοριακή συνεκτικότητα

Βαθμοί Σύζευξης

5. Σύζευξη Περιεχομένου (Content Coupling) (Υψηλή Σύζευξη - κακή) 4. Κοινή Σύζευξη (Common Coupling) 3. Σύζευξη Ελέγχου (Control Coupling) 2. Σύζευξη Αποτύπωσης 1. Σύζευξη Δεδομένων (Χαμηλή Σύζευξη - καλή)

Σύζευξη Περιεχομένου

 Δύο υποσυστήματα / ψηφίδες ή κλάσεις έχουν σύζευξη περιεχομένου (content coupling) εάν κώδικας στο ένα υποσύστημα / ψηφίδα / κλάση επηρεάζει και τροποποιεί άμεσα κώδικα στο άλλο υποσύστημα / ψηφίδα / κλάση. Παραδείγματα περιλαμβάνουν 

Κώδικας σε ένα υποσύστημα / ψηφίδα / κλάση αλλάζει κώδικα σε κάποιο άλλο υποσύστημα / ψηφίδα / κλάση

Κώδικας σε ένα υποσύστημα / ψηφίδα / κλάση καλεί κώδικα σε κάποιο άλλο υποσύστημα / ψηφίδα / κλάση με βάση κάποιο offset σε σχέση με την αρχή του δεύτερου υποσυστήματος / ψηφίδας / κλάσης

Κώδικας σε ένα υποσύστημα / ψηφίδα / κλάση καλεί κώδικα σε κάποιο άλλο υποσύστημα / ψηφίδα / κλάση με βάση κάποιο label του δεύτερου υποσυστήματος / ψηφίδας / κλάσης

Κοινή Σύζευξη

 Δύο υποσυστήματα / ψηφίδες ή κλάσεις έχουν κοινή σύζευξη (common coupling) εάν κώδικας στο ένα υποσύστημα / ψηφίδα / κλάση έχει προσπέλαση (read AND write) σε κοινές μεταβλητές με το άλλο υποσύστημα / ψηφίδα / κλάση. Ένα τυπικό παράδειγμα είναι όταν δυο υποσυστήματα / ψηφίδες / κλάσεις διαβάσουν και ενημερώνουν κοινές γενικές μεταβλητές (global variables).  Είναι αποδεκτό όμως ένα υποσύστημα / ψηφίδα / κλάση να ενημερώνει μια κοινή (γενική) μεταβλητή και τα άλλα υποσυστήματα / ψηφίδες / κλάσεις να διαβάζουν μόνο αυτή τη μεταβλητή  Η κοινή σύζευξη δημιουργεί αρκετά προβλήματα κατά τη συντήρηση και αναβάθμιση συστημάτων λογισμικού (δύσκολος να κατανοηθεί κώδικας, μικρές δυνατότητες επαναχρησιμοποίησης, πιθανά προβλήματα σχετικά με την ασφάλεια του συστήματος.

Παράδειγμα Κοινής Σύζευξης

 Consider the following code fragment: while( global_variable > 0 ) { switch( global_variable ) { case 1: function_a(); break; // function_a(), function_b() … αλλάζουν την // case 2: function_b(); break; // μεταβλητή global_variable // ...

case n: ...

} global_variable++; }

Σύζευξη Ελέγχου

 Δύο υποσυστήματα / ψηφίδες ή κλάσεις έχουν σύζευξη ελέγχου (control coupling) εάν κώδικας στο ένα υποσύστημα / ψηφίδα / κλάση μπορεί να μεταβάλλει (π.χ. με την τιμή μιας μεταβλητής) την ροή ελέγχου στο άλλο υποσύστημα / ψηφίδα / κλάση. Τυπικά παραδείγματα περιλαμβάνουν  

όταν ένα υποσύστημα / ψηφίδα / κλάση περνάει στο άλλο υποσύστημα / ψηφίδα / κλάση μια παράμετρο που χρησιμοποιείται από κάποια έκφραση συνθήκης που επηρεάζει τη ροή ελέγχου στο δεύτερο υποσύστημα / ψηφίδα / κλάση όταν υποσύστημα / ψηφίδα / κλάση (Α) επιστρέφει στο άλλο υποσύστημα / ψηφίδα / κλάση (Β) ένα αποτέλεσμα που χρησιμοποιείται όχι μόνο για να δηλώσει το αποτέλεσμα ενός υπολογισμού του (Α) αλλά και να ορίσει ποια δράση θα πρέπει το δεύτερο υποσύστημα (Β) πρέπει να καλέσει (π.χ. Να τυπώσει ένα μήνυμα λάθους στον χρήστη)

 Το μεγαλύτερο πρόβλημα με τη σύζευξη ελέγχου είναι ότι τα συζευγμένα υποσυστήματα δεν είναι εύκολο να επαναχρησιμοποιηθούν

Σύζευξη Αποτύπωσης

 Δύο υποσυστήματα / ψηφίδες ή κλάσεις έχουν σύζευξη αποτύπωσης (stamp coupling) εάν το ένα υποσύστημα / ψηφίδα / κλάση περνάει σαν παραμέτρους στο άλλο υποσύστημα / ψηφίδα / κλάση περισσότερα δεδομένα απ’ ότι χρειάζεται. Τυπικό παράδειγμα είναι όταν περνάμε μια κλάση ή μια δομή σαν παράμετρο, αλλά μόνο τα συγκεκριμένα στοιχεία της κλάσης / δομής που χρειάζονται  Ουσιαστικά θα πρέπει να προσέχουμε να μην έχουμε τον κώδικα πελάτη να εξαρτάται από ονόματα πεδίων έτσι ώστε να μπορούμε να επαναχρησιμοποιήσουμε αυτόν τον κώδικα  Η γενική ιδέα είναι να μεταφέρουμε από ένα υποσύστημα / ψηφίδα / κλάση μόνο τα απαραίτητα δεδομένα και τίποτε περισσότερο

Σύζευξη Δεδομένων

 Δύο υποσυστήματα / ψηφίδες ή κλάσεις έχουν σύζευξη δεδομένων (data coupling) εάν το ένα υποσύστημα / ψηφίδα / κλάση περνάει σαν παραμέτρους στο άλλο υποσύστημα / ψηφίδα / κλάση είτε απλούς τύπους δεδομένων είτε τιμές από συγκεκριμένα πεδία κλάσεων / δομών που είναι απολύτως απαραίτητα για τη λειτουργία του δεύτερου υποσυστήματος / ψηφίδας / κλάσης

Σχετικές Αναφορές

   

Lecture slides on Architecture by David Garlan, see http://www-2.cs.cmu.edu/afs/cs/academic/class/17655-s02/www/ Lecture slides on Architecture by Marc Roper and Murray Wood, see https://www.cis.strath.ac.uk/teaching/ug/classes/52.440/ M. Shaw and D. Garlan.

Software Architecture: Perspectives on a Emerging Discipline

. Prentice Hall, Englewood Cliffs, NJ, 1996 F. Buschmann, R. Meunier, H. Rohnert, P. Sommerlad, and M. Stal.

Pattern-Oriented Software Architecture. A System of Patterns

. John Wiley & Sons Ltd., Chichester, UK, 1996