Σχεδίαση Κλάσεων Γρηγόρης Τσουµάκας Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης Έκδοση: 2010.11.19
Εισαγωγή 2 ιαρκής συντήρηση και επέκταση λογισµικού Οι εταιρίες συνήθως συντηρούν, επεκτείνουν και πωλούν µια εφαρµογή για πολλά χρόνια Καλή σχεδίαση κλάσεων Κώδικας που διευκολύνει τις αλλαγές, όπως η διόρθωση ενός σφάλµατος και ή προσθήκη λειτουργικότητας Βραχυπρόθεσµα απαιτεί περισσότερη προσπάθεια Μακροπρόθεσµα µας σώζει από πολύ κόπο εν έχει να κάνει µε την ορθή Λειτουργία της εφαρµογής Τεκµηρίωση των κλάσεων
Σύζευξη 3 Η έννοια της σύζευξης (coupling) Αφορά το βαθµό σύνδεσης των κλάσεων Καλή σχεδίαση = χαλαρή σύζευξη (loose coupling) Κάθε κλάση είναι ανεξάρτητη και επικοινωνεί µέσω µιας µικρής και καλά καθορισµένης διασύνδεσης Η αλλαγή της υλοποίησης µιας κλάσης δεν απαιτεί την πραγµατοποίηση αλλαγών σε άλλες κλάσεις Πλεονεκτήµατα Αναγνωσιµότητα (readability) Επαναχρησιµοποίηση (reuse) Ευκολία συντήρησης και επέκτασης
Συνοχή 4 Η έννοιας της συνοχής (cohesion) Αφορά τον αριθµό και την ποικιλία των εργασιών µιας µονάδας κώδικα (µέθοδος, κλάση, πακέτο) Καλή σχεδίαση = υψηλή συνοχή Κάθε µονάδα κώδικα (µέθοδος, κλάση, πακέτο) είναι υπεύθυνη για µια καλώς ορισµένη εργασία ή οντότητα Μονάδες κώδικα που ασχολούνται µε πολλές και διαφορετικές εργασίες δεν είναι συνεκτικές Πλεονεκτήµατα Αναγνωσιµότητα (readability) Επαναχρησιµοποίηση (reuse) Ευκολία συντήρησης και επέκτασης
Άλλες Έννοιες Σχεδίασης Κλάσεων 5 Τοπικότητα των αλλαγών Η πραγµατοποίηση αλλαγών σε µια κλάση πρέπει να έχει ελάχιστες συνέπειες σε άλλες Από τους κύριους στόχους της καλής σχεδίασης Έµµεση σύζευξη Μια κλάση βασίζεται σε εσωτερικές πληροφορίες µιας άλλης κλάσης χωρίς αυτό να είναι προφανές Σύζευξη και διάγραµµα κλάσεων Όσο περισσότερα βέλη, τόσο µεγαλύτερη σύζευξη
Αρχές Καλής Σχεδίασης 6 Αποφυγή πανοµοιότυπων τµηµάτων κώδικα Ενθυλάκωση / απόκρυψη πληροφοριών Σχεδίαση καθοδηγούµενη από αρµοδιότητες (responsibility-driven design) Κάθε κλάση πρέπει να είναι αρµόδια για τη διαχείριση των δικών της δεδοµένων Χαλάρωση της σύζευξης κλάσεων Πρόβλεψη πιθανών αλλαγών Ένας καλός σχεδιαστής λογισµικού πρέπει να µπορεί να προβλέπει τι θα µπορούσε να αλλάξει σε µια εφαρµογή και να προνοεί για τη διευκόλυνση των αλλαγών
Ένα Παιχνίδι Περιπέτειας 7 Μελέτη των κλάσεων Parser, Command, CommandWords, Room, Game ιάγραµµα κλάσεων Game Parser Room Command CommandWords
Πανοµοιότυπα Τµήµατα Κώδικα 8 Πανοµοιότυπα τµήµατα κώδικα Η ύπαρξη του ίδιου ακριβώς τµήµατος κώδικα πολλές φορές µέσα στην ίδια εφαρµογή Είναι ένδειξη κακής σχεδίασης Οι όποιες αλλαγές θα πρέπει να γίνονται σε πολλά σηµεία, γεγονός που είναι δύσκολο να αντιληφθεί ένας προγραµµατιστής που συντηρεί το πρόγραµµα Είναι σύµπτωµα κακής συνοχής Ξεχωριστή µέθοδος για το τµήµα κώδικα που επαναλαµβάνεται (µεγαλύτερη συνοχή)
Απόκρυψη Πληροφοριών 9 Απόκρυψη πληροφοριών (information hiding) Οι εσωτερικές λεπτοµέρειες υλοποίησης µιας κλάσης πρέπει να κρύβονται από άλλες κλάσεις Γνωστή και ως αρχή της ενθυλάκωσης Ο προγραµµατιστής δεν χρειάζεται να τις γνωρίζει οµοστοιχειοποίηση και αφαίρεση Ο προγραµµατιστής δεν πρέπει να τις γνωρίζει Οι κλάσεις δεν πρέπει να βασίζονται στο πως ακριβώς υλοποιούνται άλλες κλάσεις
Public και Private 10 Τροποποιητές πρόσβασης (access modifiers) public, private, Καθορίζουν την ορατότητα ενός πεδίου, µεθόδου, ή κατασκευαστή public Πρόσβαση µέσα από την ίδια την κλάση, αλλά και από οποιαδήποτε άλλη κλάση Αφορά τη διασύνδεση της κλάσης private Πρόσβαση µόνο µέσα από την ίδια την κλάση Αφορά τον πηγαίο κώδικα της κλάσης
Ιδιωτικές Μέθοδοι & ηµόσια Πεδία 11 Ιδιωτικές µέθοδοι Ένα µεγάλο τµήµα κώδικα χωρίζεται σε πολλά µικρότερα για λόγους αναγνωσιµότητας εν απαιτείται δηµόσια πρόσβαση στα επί µέρους τµήµατα Ένα τµήµα κώδικα που επαναλαµβάνεται ηµόσια πεδία Επιτρέπονται, αλλά Παραβιάζεται η αρχή της απόκρυψης πληροφοριών Χάνεται ο έλεγχος (πρόσβαση και µετάλλαξη) της κατάστασης των αντικειµένων από την ίδια την κλάση Ελλοχεύει ο κίνδυνος στενής σύζευξης Εποµένως: Τα πεδία πρέπει πάντα να είναι ιδιωτικά!
Παραδείγµατα (1/4) 12 Πανοµοιότυπα τµήµατα κώδικα Αφαιρέστε τις δύο εµφανίσεις πανοµοιότυπου τµήµατος κώδικα από την κλάση Game [better] Επεκτείνετε το παιχνίδι µε δύο επιπλέον κατευθύνσεις (πάνω και κάτω) Χρήση ενθυλάκωσης για χαλάρωση της σύζευξης της κλάσης Room µε την κλάση Game [better2] Χρήση HashMap για αποθήκευση εξόδων [better3] Αφαίρεση παρόµοιων τµηµάτων κώδικα Πρόβλεψη πιθανών αλλαγών
Παραδείγµατα (2/4) 13 Καθοδήγηση από Αρµοδιότητες 1 Η µέθοδος printlocationinfo της Game ασχολείται µε τις εξόδους, οι οποίες όµως ανήκουν στην κλάση Room Γι' αυτό και ξεχάσαµε να την ενηµερώσουµε Παράδειγµα έµµεσης σύζευξης Κατασκευή µεθόδου String getexitstring() στη Room και αντίστοιχη αλλαγή της Game [better4] Κατασκευή µεθόδου String getlongdescription() στη Room και αντίστοιχη αλλαγή της Game [better5] Καθοδήγηση από Αρµοδιότητες 2 Προσθήκη διαταγής look που εµφανίζει την περιγραφή του δωµατίου [better6] Τι θα συµβεί αν δώσουµε τη διαταγή help; [better7]
Παραδείγµατα (3/4) 14 Πρόβλεψη πιθανών αλλαγών Ο τρόπος αλληλεπίδραση µε το χρήστη (κείµενο, GUI) να είναι αποκλειστική ευθύνη της Game Επιστροφή συµβολοσειράς µε τις διαθέσιµες εντολές και εµφάνιση τους από τη Game [better8] Συνοχή µεθόδων είτε τις µεθόδους play, printwelcome και processcommand της κλάσης Game Αναγνωσιµότητα είτε τη µέθοδο getlongdescription της κλάσης Room Επαναχρησιµοποίηση
Παραδείγµατα (4/4) 15 Συνοχή κλάσεων Επέκταση του παιχνιδιού περιπέτειας ώστε σε κάθε δωµάτιο να υπάρχει ένα αντικείµενο (περιγραφή και βάρος αντικειµένου) α) Προσθήκη αντίστοιχων ιδιοτήτων στην κλάση Room Κακή συνοχή, αφού πλέον η Room αφορά και αντικείµενα Προβλήµατα σε επεκτάσεις όπως µεταφορά αντικειµένων από δωµάτιο σε δωµάτιο, πολλαπλά αντικείµενα σε κάθε δωµάτιο β) ηµιουργία νέας κλάσης Item [better9]
Αναπαραγοντοθέτηση 16 Αναπαραγοντοθέτηση (refactoring) Αναδιάρθρωση µιας υπάρχουσας σχεδίασης για τη διατήρηση µιας καλής σχεδίασης κλάσεων όταν η εφαρµογή τροποποιείται η επεκτείνεται Η επέκταση γίνεται ιδανικά σε δύο βήµατα Αναπαραγοντοθέτηση του κώδικα µε στόχο την προετοιµασία των αλλαγών Αυξάνεται η ποιότητα του κώδικα εν αλλάζουµε ή επεκτείνουµε τη λειτουργικότητα Βελτίωση της λειτουργικότητας της εφαρµογής
Παράδειγµα 17 Επέκταση της εφαρµογής Ο παίκτης µπορεί να σηκώνει και να αφήνει µικροαντικείµενα στο τρέχον δωµάτιο Ο παίκτης µπορεί να κουβαλάει οποιονδήποτε αριθµό µικροαντικειµένων, αλλά µόνο µέχρι ένα µέγιστο βάρος Ορισµένα µικροαντικείµενα δεν µπορούν να µετακινηθούν Πως και που θα υλοποιηθούν όλα αυτά; Τι πεδία χρειάζονται και σε ποιες κλάσεις θα προστεθούν; Τι αλλαγές χρειάζονται στην εφαρµογή; [good]