Ενότητα 6 Μοτίβα Σχεδίασης (Design Patterns) Ορισµοί βασικές έννοιες. Σηµαντικά µοτίβα σχεδίασης: Παρατηρητής (Observer). Πρόσοψη (Façade). Προσαρµογέας (Adapter). Πληρεξούσιος (Proxy). Μοναχοπαίδι (Singleton). ιακοσµητής (Decorator). Παρατηρήσεις. Άσκηση. Περισσότερες πληροφορίες. Βιβλιογραφία. Ορισµοί Βασικές Έννοιες (1) Τί είναι τα µοτίβα σχεδίασης; Είναι λύσεις σε συνηθισµένα προβλήµατα που παρουσιάζονται κατά τη σχεδίαση υπολογιστικών συστηµάτων, οι οποίες έχει αξιολογηθεί ότι αξίζει να τεκµηριωθούν, έτσι ώστε όσοι ασχολούνται µε την ανάπτυξη νέων συστηµάτων να µπορούν να τις εφαρµόζουν για την επίλυση των ίδιων προβληµάτων όταν καλούνται να τα αντιµετωπίσουν. Είναι σύνολα από κλάσεις (ή από αντικείµενα) που αλληλεπιδρούν µεταξύ τους, έτσι ώστε να χαρακτηρίζονται από µια συγκεκριµένη συµπεριφορά. Αποτελούν τρόπους για την περιγραφή άριστων πρακτικών και καλών προσεγγίσεων σχεδίασης, και ενσωµατώνουν (σχεδιαστική) πείρα µε τέτοιο τρόπο, ώστε αυτή να είναι δυνατό να επαναχρησιµοποιηθεί από άλλους.
Ορισµοί Βασικές Έννοιες (2) Πρώτος πραγµατικός κατάλογος από 23 µοτίβα σχεδίασης: Design Patterns Elements of Reusable Object-Oriented Software, Gamma, Helm, Johnson, Vlissides (Gang of Four, GoF). Κατηγορίες µοτίβων σχεδίασης: Σχετικές µε δηµιουργία (creational): ιαφορετικοί τρόποι για τη δηµιουργία αντικειµένων µε συγκεκριµένες ιδιότητες. Σχετικές µε δοµή (structural): Επιτρέπουν την αποσύνδεση (decoupling) της διεπαφής από την υλοποίηση. Σχετικές µε συµπεριφορά (behavioural): Επιτρέπουν την παροχή συγκεκριµένων τύπων συµπεριφοράς µε προτυποποιηµένο τρόπο. Τα µοτίβα σχεδίασης αποσπούνται από καλές προσεγγίσεις σχεδίασης από έµπειρους µηχανικούς λογισµικού. Σηµαντικά Μοτίβα Σχεδίασης Παρατηρητής (Observer). Πρόσοψη (Façade). Προσαρµογέας (Adapter). Πληρεξούσιος (Proxy). Μοναχοπαίδι (Singleton). ιακοσµητής (Decorator).
Μοτίβο Σχεδίασης Παρατηρητής (1) Να ορίσετε µια εξάρτηση ένα-προς-πολλά (one-to-many) ανάµεσα σε αντικείµενα, έτσι ώστε όταν αλλάζει η κατάσταση ενός αντικειµένου, όλα τα αντικείµενα που εξαρτώνται από αυτό να το µαθαίνουν και να ενηµερώνονται αυτόµατα. Για το λόγο αυτό: Γίνεται χρήση ενός συνόλου από συνεργαζόµενες κλάσεις. Είναι ανάγκη να διατηρείται η συνέπεια ανάµεσα σε σχετιζόµενα αντικείµενα. Αυτό δεν µπορεί να επιτευχθεί όταν τα αντικείµενα είναι στενά συνδεδεµένα µεταξύ τους (tightly coupled) πρόβληµα επαναχρησιµοποίησης (reusability). Παράδειγµα Οι διεπαφές χρήστη (GUIs) που διαχωρίζουν τις σχετικές κλάσεις (visual) από τα δεδοµένα. Μοτίβο Σχεδίασης Παρατηρητής (2) Παρατηρητές a b c x 10 20 30 b y 50 30 20 z 80 30 50 a b c a c Υποκείµενο a = 50 b = 30 c = 20 Γνωστοποίηση αλλαγής Αιτήσεις, Τροποποιήσεις Παρατήρηση: Οι πιο πάνω κλάσεις µπορούν να επαναχρησιµοποιηθούν ανεξάρτητα η µία από την άλλη δε γνωρίζει η µία για την άλλη.
Μοτίβο Σχεδίασης Παρατηρητής (3) Οι κλάσεις εµφάνισης και διαχείρισης των δεδοµένων εξαρτώνται από τα δεδοµένα του αντικειµένου στο κάτω µέρος και πρέπει να ενηµερώνονται όταν αλλάζει η κατάστασή του. εν υπάρχουν περιορισµοί στον αριθµό των εξαρτώµενων αντικειµένων. Το µοτίβο σχεδίασης Παρατηρητής περιγράφει πώς να δηµιουργηθούν και να διατηρηθούν τέτοιες σχέσεις. Όλοι οι παρατηρητές ενηµερώνονται όποτε το υποκείµενο αλλάξει κατάσταση. Μοτίβο Σχεδίασης Παρατηρητής (4) Πότε χρησιµοποιείται αυτό το µοτίβο σχεδίασης; Όταν ένα αφηρηµένο σενάριο έχει δύο τµήµατα, το ένα εξαρτώµενο από το άλλο, και είναι επιθυµητό να επαναχρησιµοποιηθούν τα τµήµατα αυτά ανεξάρτητα. Όταν µια αλλαγή σε ένα αντικείµενο απαιτεί την αλλαγή και άλλων αντικειµένων και δεν είναι γνωστό πόσα ακριβώς αντικείµενα χρειάζεται να αλλάξουν. Όταν ένα αντικείµενο είναι επιθυµητό να µπορεί να ενηµερώνει άλλα αντικείµενα, χωρίς να χρειάζεται να κάνει υποθέσεις για το ποιά ακριβώς είναι αυτά τα αντικείµενα.
Μοτίβο Σχεδίασης Πρόσοψη (1) Είναι επιθυµητή η παροχή µιας ενιαίας διεπαφής σε ένα σύνολο από διεπαφές ενός υποσυστήµατος. Το συγκεκριµένο µοτίβο σχεδίασης ορίζει µια υψηλού επιπέδου διεπαφή που κάνει το υποσύστηµα ευκολότερο στη χρήση. Για το λόγο αυτό: Γίνεται χρήση πολλών κλάσεων που επικοινωνούν µεταξύ τους. Είναι επιθυµητή η ελάττωση της πολυπλοκότητας. εν είναι αναγκαία η γνώση όλων των διαφορετικών τρόπων αλληλεπίδρασης και των αναγκαίων µορφών επικοινωνίας. Μοτίβο Σχεδίασης Πρόσοψη (2) Κλάσεις Πελάτες Facade Κλάσεις Υποσυστήµατος Object-Oriented Modeling
Μοτίβο Σχεδίασης Πρόσοψη (3) Πότε χρησιµοποιείται αυτό το µοτίβο σχεδίασης; Όταν είναι επιθυµητή η παροχή µιας απλής διεπαφής σε ένα πολύπλοκο υποσύστηµα. Όταν υπάρχουν πολλές εξαρτήσεις ανάµεσα στους πελάτες και στις κλάσεις υλοποίησης και είναι επιθυµητή η αποσύνδεση (decoupling) του υποσυστήµατος από τους πελάτες και άλλα υποσυστήµατα ενίσχυση της ανεξαρτησίας των κλάσεων και της φορητότητας. Όταν είναι επιθυµητή η διαστρωµάτωση των υποσυστηµάτων το συγκεκριµένο µοτίβο σχεδίασης προσδιορίζει σηµεία εισόδου σε κάθε στρώµα / υποσύστηµα. Μοτίβο Σχεδίασης Προσαρµογέας (1) Είναι επιθυµητή η µετατροπή της διεπαφής µιας κλάσης σε κάποια άλλη διεπαφή που περιµένει ένας πελάτης. Το συγκεκριµένο µοτίβο σχεδίασης επιτρέπει τη συνεργασία ανάµεσα σε κλάσεις που σε αντίθετη περίπτωση θα ήταν αδύνατο να συνεργαστούν λόγω ασυµβατότητας των διεπαφών τους. Χρήση του συγκεκριµένου µοτίβου σχεδίασης: Έστω ένα εργαλείο του οποίου η λειτουργικότητα περικλείεται σε µια καλά ορισµένη κλάση. Είναι επιθυµητή η επέκταση της λειτουργικότητας του εργαλείου προσθέτοντας σε αυτό ένα έτοιµο προϊόν (off-the-shelf). Οι διεπαφές είναι ασύµβατες. Παράδειγµα Χρήση έτοιµων συνιστωσών λογισµικού (components) για τον εµπλουτισµό ενός προγράµµατος.
Μοτίβο Σχεδίασης Προσαρµογέας (2) Drawing Tool Shape LineShape TextView TextShape Μοτίβο Σχεδίασης Προσαρµογέας (3) Drawing Tool Shape TextShape LineShape PolygonShape TextView
Μοτίβο Σχεδίασης Προσαρµογέας (4) Μερικές φορέας ο προσαρµογέας είναι υπεύθυνος για την προσφορά λειτουργικότητας που η υπό προσαρµογή κλάση δεν προσφέρει. Πότε χρησιµοποιείται αυτό το µοτίβο σχεδίασης; Όταν είναι επιθυµητή η χρήση µιας υπάρχουσας κλάσης, αλλά η διεπαφή της δεν ταιριάζει µε αυτή που απαιτείται. Όταν είναι επιθυµητή η δηµιουργία µιας επαναχρησιµοποιήσιµης κλάσης που να είναι δυνατό να συνεργαστεί µε οποιαδήποτε άλλη κλάση (τελείως άγνωστη ή που να µην έχει συσχέτιση µε αυτή) αντιµετώπιση ασυµβατότητας στις διεπαφές. Όταν είναι επιθυµητή η χρήση πολλών διαφορετικών υποκλάσεων, αλλά δεν είναι πρακτική η δηµιουργία κατάλληλης υποκλάσης για κάθε µία από αυτές. Μοτίβο Σχεδίασης Πληρεξούσιος (1) Παρέχει έναν αναπληρωτή ή έναν αντικαταστάτη ενός άλλου αντικειµένου, στο οποίο δεν είναι δυνατή η πρόσβαση υπό κανονικές συνθήκες. Το αντικείµενο που συνήθως είναι µη προσβάσιµο ή µη διαθέσιµο, είναι επιθυµητό να εµφανίζεται ως ένα συνηθισµένο αντικείµενο. Για παράδειγµα, το αντικείµενο µπορεί να είναι: Σε µια διαφορετική διεργασία. Αποθηκευµένο ως αρχείο σε ένα δίσκο. Συµπιεσµένο. Μη δηµιουργηµένο ακόµη.
Μοτίβο Σχεδίασης Πληρεξούσιος (2) Το πληρεξούσιο αντικείµενο (proxy object) έχει την ίδια διεπαφή µε το υποκείµενο και διαθέτει µια αναφορά στο υποκείµενο. Το πληρεξούσιο αντικείµενο προωθεί τις αναφορές στο υποκείµενο ή απλώς υποκαθίσταται από το υποκείµενο (ανάλογα µε το σκοπό του). Μοτίβο Σχεδίασης Μοναχοπαίδι Επιτρέπει τη δηµιουργία µόνο ενός στιγµιοτύπου από µια κλάση. Λόγοι ασφαλείας. Σε κατανεµηµένα συστήµατα.
Μοτίβο Σχεδίασης ιακοσµητής Χρήση όταν είναι επιθυµητή η προσθήκη ευθυνών σε ένα µόνο αντικείµενο και όχι σε ολόκληρη την κλάση στην οποία ανήκει γίνεται µε τρόπο δυναµικό. Χρήση στην προσθήκη οπτικών χαρακτηριστικών σε αντικείµενα στα πλαίσια διεπαφών χρήστη (π.χ. scroll bars, frames, κ.λπ.). Παρατηρήσεις (1) Τα µοτίβα σχεδίασης οµαδοποιούνται σε καταλόγους µοτίβων σχεδίασης (pattern catalogues) και σε γλώσσες µοτίβων σχεδίασης (pattern languages). Κατάλογος ένα σύνολο από µοτίβα σχεδίασης που είναι δυνατό να χρησιµοποιηθούν όλα µαζί ή και ξεχωριστά. Γλώσσα Τεκµηριώνει µοτίβα σχεδίασης που εργάζονται µαζί και µπορούν να εφαρµοστούν στην επίλυση προβληµάτων σε ένα συγκεκριµένο πεδίο. Για την τεκµηρίωση των µοτίβων σχεδίασης χρησιµοποιούνται ειδικά περιγράµµατα (templates).
Παρατηρήσεις (2) Παράδειγµα περιγράµµατος (template): Όνοµα (Name) Το όνοµα του µοτίβου σχεδίασης / προτιµούνται περιγραφικά ονόµατα. Πρόβληµα (Problem) Αυτό που επιλύει το µοτίβο σχεδίασης. Πλαίσιο (Context) Το πλαίσιο της εφαρµογής του µοτίβου σχεδίασης (αρχιτεκτονικό ή επιχειρηµατικό). υνάµεις (Forces) Θέµατα που πρέπει να επιλυθούν. Λύση (Solution) Η λύση που εξισορροπεί τις δυνάµεις και ταιριάζει στο πλαίσιο. Σχεδιάγραµµα (Sketch) Συµβολικό σχεδιάγραµµα των δυνάµεων. Τελικό πλαίσιο (Resulting context) το πλαίσιο µετά την αλλαγή του από τη λύση. Ορθολογική βάση (Rationale) Ο λόγος και το κίνητρο δηµιουργίας του µοτίβου σχεδίασης. Άσκηση (1) Ένα πανεπιστήµιο υλοποιεί ένα ηλεκτρονικό σύστηµα ανακοινώσεων (blackboard system), ώστε οι φοιτητές να έχουν πρόσβαση σε πληροφορίες σχετικές µε τα µαθήµατά τους. Το τελικό σύστηµα δεν είναι ακόµη έτοιµο, αλλά η σχετική ιστοσελίδα (HTML + java applet) πρέπει να ελεγχθεί άµεσα. Ποιό µοτίβο σχεδίασης µπορεί να εφαρµοστεί στην περίπτωση αυτή; Υπάρχει πιο απλή λύση; Καθώς κάθε φοιτητής εγγράφεται ή αποχωρεί από ένα µάθηµα, κάθε σελίδα του συστήµατος που καταγράφει τα αποτελέσµατα του µαθήµατος αυτού πρέπει να ενηµερώνεται. Ποιό µοτίβο σχεδίασης µπορεί να υποστηρίξει µια κατάλληλη αρχιτεκτονική για την επίτευξη του σκοπού αυτού;
Άσκηση (2) Λόγω της µεγάλης ποικιλίας µορφών εξέτασης ενός µαθήµατος (γραπτές εξετάσεις, εργασίες, οµαδικές ασκήσεις, παρουσιάσεις, κ.λπ.) είναι επιθυµητή η παροχή µιας ενιαίας διεπαφής για την πρόσβαση στα αποτελέσµατα εξέτασης ενός µαθήµατος. Θα διατηρηθεί η απευθείας πρόσβαση στα δεδοµένα µε χρήση ιδιαίτερων κάθε φορά πρωτοκόλλων. Ποιό µοτίβο σχεδίασης είναι κατάλληλο για την περίπτωση αυτή; Περισσότερες Πληροφορίες http://hillside.net/ - Patterns tab http://web.media.mit.edu/~tpminka/patterns/ http://c2.com/cgi/wiki Βασικό βιβλίο - Design Patterns: Elements of Reusable Object- Oriented Software, Gamma, Helm, Johnson, Vlissides.
Βιβλιογραφία Bennett, Skelton, Lunn, UML, Schaum s Outline Series, 2001. Rumbaugh, Jacobson, Booch, The Unified Modeling Language Reference Manual, Addison Wesley, 1999. Pooley, Stevens, Using UML: Software Engineering with Objects and Components Addison-Wesley, 1999. T. Quatrani, Visual Modeling with Rational Rose 2000 and UML, Addison-Wesley, 2000.