Ε ΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ



Σχετικά έγγραφα
ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ Αξιολόγηση των Σχεδιαστικών Προτύπων και της Ποιότητας του Λογισμικού μέσω Μετρικών, στις Περιπτώσεις Προσθήκης Λειτουργικότητας και

Μοτίβα Σχεδίασης (Design Patterns)

Ελληνικό Ανοικτό Πανεπιστήµιο. Βασικές έννοιες αντικειµενοστρεφούς τεχνολογίας. ρ. Πάνος Φιτσιλής

Εισαγωγή στην αντικειµενοστρεφή τεχνολογία

2.1 Αντικειµενοστρεφής προγραµµατισµός

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΑΝΑΛΥΣΗ Πρότυπα Σχεδίασης. Ιωάννης Σταμέλος Βάιος Κολοφωτιάς Πληροφορική

Η στοίβα (stack) H στοίβα είναι ένας αποθηκευτικός χώρος οργανωµένος κατά τέτοιο τρόπο ώστε να υποστηρίζει δύο βασικές λειτουργίες:

Κανόνες για ανάπτυξη διαγραµµάτων κλάσεων

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού

Διαγράμματα Κλάσεων στη Σχεδίαση

ΣΧΕ ΙΑΣΗ ΑΝΤΙΚΕΙΜΕΝΩΝ ΜΕ ΑΡΜΟ ΙΟΤΗΤΕΣ. Ορισµός σχεδιαστικών προτύπων Εφαρµογή των 9 GRASP προτύπων

Σχεδιασµός βασισµένος σε συνιστώσες

Α. Ερωτήσεις Ανάπτυξης

Εισαγωγή στη Σχεδίαση Λογισμικού

Οι περιπτώσεις χρήσης

. Μεθοδολογία Προγραμματισμού. Μοτίβα σχεδίασης (Design Patterns) Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

Τα διαγράµµατα πακέτων

14 Πρότυπα Σχεδίασης συνέχεια

Κεφάλαιο 10 ο Υποπρογράµµατα

J-GANNO. Σύντοµη αναφορά στους κύριους στόχους σχεδίασης και τα βασικά χαρακτηριστικά του πακέτου (προέκδοση 0.9Β, Φεβ.1998) Χάρης Γεωργίου

Αντικειμενοστρεφής Προγραμματισμός

Ελληνικό Ανοικτό Πανεπιστήµιο. Η ιαχείριση Απαιτήσεων στην Ενοποιηµένη ιαδικασία. ρ. Πάνος Φιτσιλής

Κλάσεις και Αντικείµενα

Αρχιτεκτονική του πληροφοριακού συστήµατος Cardisoft Γραµµατεία 2003 ιαχείριση Προσωπικού

Στόχοι της Πτυχιακής

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τ Μ Η Μ Α Π Λ Η Ρ Ο Φ Ο Ρ Ι Κ Η Σ

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

ΗΥ 252: Αντικειµενοστρεφής Προγραµµατισµός

Επαναληπτικό ιαγώνισµα Πληροφορικής Γ Γυµνασίου Γιώργος Λιακέας Σχολικός Σύµβουλος Πληροφορικής Ερωτήσεις

ΚΕΦΑΛΑΙΟ 5. Κύκλος Ζωής Εφαρμογών ΕΝΟΤΗΤΑ 2. Εφαρμογές Πληροφορικής. Διδακτικές ενότητες 5.1 Πρόβλημα και υπολογιστής 5.2 Ανάπτυξη εφαρμογών

ΗΥ 252: Αντικειµενοστρεφής Προγραµµατισµός

Ειδικά θέματα τεχνολογίας λογισμικού

Ανάπτυξη Plugins για το AgentSheets

Αρχιτεκτονική Λογισμικού

Ανάπτυξη & Σχεδίαση Λογισμικού (ΗΥ420)

Μοντελοποίηση Πεδίου

επιµέλεια Θοδωρής Πιερράτος

Περιεχόμενο του μαθήματος

Σχεδίαση Κλάσεων. Γρηγόρης Τσουµάκας. Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης. Έκδοση:

Βάσεις Δεδομένων. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

Μοντελοποίηση δεδομένων με UML Χρήση σε πολυμεσικές εφαρμογές

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ

Ελληνικό Ανοικτό Πανεπιστήµιο. Η Ανάλυση και ο Σχεδιασµός στην Ενοποιηµένη ιαδικασία. ρ. Πάνος Φιτσιλής

Προγραµµατισµός Ι (ΗΥ120)

4.3. Γραµµικοί ταξινοµητές

Ελληνικό Ανοικτό Πανεπιστήµιο Εισαγωγή στη Ενοποιηµένη Προσέγγιση Unified Process (UP) ρ. Πάνος Φιτσιλής

14η ιάλεξη. Προχωρημένα θέματα σχεδίασης

Τι είναι η λογική αρχιτεκτονική

08 Η γλώσσα UML I. Τεχνολογία Λογισμικού. Σχολή Hλεκτρολόγων Mηχανικών & Mηχανικών Yπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο. Χειμερινό εξάμηνο

Εισαγωγή στους Αλγόριθµους. Αλγόριθµοι. Ιστορικά Στοιχεία. Ο πρώτος Αλγόριθµος. Παραδείγµατα Αλγορίθµων. Τι είναι Αλγόριθµος

06 Αντικειμενοστρεφής ανάλυση και σχεδιασμός

Περιεχόμενο του μαθήματος

Τεχνολογίες Υλοποίησης Αλγορίθµων

ΛΟΓΙΣΜΙΚΟ (software)

Μοντέλα. χαρακτηριστικά χωρίς να συνοδεύεται από λεπτοµέρειες.

Εισαγωγή στη γλώσσα UML

Πληροφορική ΙΙ Εισαγωγή στις Βάσεις Δεδομένων. Τμήμα Λογιστικής

H ΓΛΩΣΣΑ C. Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C. ηµήτρης Ψούνης

ΚΕΦΑΛΑΙΟ 7 ο. Έτσι ο προγραµµατισµός µε τη ΓΛΩΣΣΑ εστιάζεται στην ανάπτυξη του αλγορίθµου και τη µετατροπή του σε σωστό πρόγραµµα.

Wrapper Classes, Abstract Classes and Interfaces

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

ΚΕΦΑΛΑΙΟ 7 ΕΙ Η, ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Άπληστοι Αλγόριθµοι (CLR, κεφάλαιο 17)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΚΕΝΤΡΟ ΙΑΧΕΙΡΙΣΗΣ ΙΚΤΥΩΝ. Εγχειρίδιο χρήσης των υπηρεσιών τηλεκπαίδευσης του Πανεπιστηµίου Ιωαννίνων. Ασύγχρονη τηλεκπαίδευση

Υποδείγματα Ανάπτυξης

Week. 6: Java Collections

Atlantis - Νέο user interface

Παιδαγωγική προσέγγιση: Πρόταση για την διδασκαλία της έννοιας αλγόριθµός στο περιβάλλον MicroWorlds Pro

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

Τεχνολογία Λογισμικού & Ανάλυση Συστημάτων 21/11/2016. Δρ. Ανδριάνα Πρέντζα Αναπληρώτρια Καθηγήτρια.

Διαδικασίες παραγωγής λογισμικού. Βασικές αρχές Τεχνολογίας Λογισμικού, 8η αγγ. έκδοση


ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal

Rational Unified Process:

Η Βίβλος σχετικά με το JDBC. Περιέχει τρία βασικά tutorials στα οποία θα βασιστεί το μάθημα και περιγράφει όλες τις τάξεις και τις μεθόδους που

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ. Ενότητα 1: Εισαγωγή στις Βάσεις Δεδομένων. Αθανάσιος Σπυριδάκος Διοίκηση Επιχειρήσεων


Λογισµικό (Software SW) Γλώσσες

scanf() scanf() stdin scanf() printf() int float double %lf float

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

UML. Γενικά χαρακτηριστικά Στοιχεία µοντέλων Συσχετίσεις. Παραδείγματα

ΤΜΗΜΑ ΕΠΙΧΕΙΡΗΜΑΤΙΚΟΥ ΣΧΕΔΙΑΣΜΟΥ & ΠΛΗΡΟΦΟΡΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΤΕΙ ΠΑΤΡΑΣ ΤΕΙ ΠΑΤΡΑΣ ΣΗΜΕΙΩΣΕΙΣ ΜΑΘΗΜΑΤΟΣ ΕΠΙΧΕΙΡΗΣΙΑΚΏΝ ΠΑΙΓΝΙΩΝ- ΠΡΟΓΡΑΜΜΑ GAMBIT

Διαχείριση Πληροφοριακών Συστημάτων

3 Αλληλεπίδραση Αντικειμένων

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

ΚΕΦΑΛΑΙΟ 3 ΑΡΧΙΤΕΚΤΟΝΙΚΕΣ ΔΙΑΤΑΞΕΙΣ ΛΟΓΙΣΜΙΚΟΥ. Έννοιες-κλειδιά. Σύνοψη

Επιχειρηµατικές ιαδικασίες: Εισαγωγικές Έννοιες & Αρχικά στάδια µοντελοποίησης

Βάσεις εδοµένων. Βασίλειος Βεσκούκης, Εµµ. Στεφανάκης ΣΥΣΤΗΜΑΤΑ ΙΑΧΕΙΡΙΣΗΣ ΒΑΣΕΩΝ Ε ΟΜΕΝΩΝ

Η ΜΕΤΑΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ ΕΞΕΙΔΙΚΕΥΣΗΣ. Υ7ΐοβάλλεται στην

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Ατοµική ιπλωµατική Εργασία

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΑΝΑΛΥΣΗ Διαγράμματα Συνεργασίας. Ιωάννης Σταμέλος Βάιος Κολοφωτιάς Πληροφορική

ΗΜΙΟΥΡΓΙΑ ΙΣΤΟΣΕΛΙ ΑΣ ΣΤΟ MICROSOFT WORD

Τ.Ε.Ι. ΚΡΗΤΗΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΙΑΣ. Ασκήσεις 1-2 Εισαγωγή

ΚΕΦΑΛΑΙΟ 4 ΤΟ ΕΡΓΑΛΕΙΟ SOLVER

Τεχνολογία Λογισμικού. Ενότητα 1: Εισαγωγή στην UML Καθηγητής Εφαρμογών Ηλίας Γουνόπουλος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

Κλάσεις. Κατηγορίες Αντικειµένων. Κλάσεις. Φυσικά Αντικείµενα. Χώρος = Οµάδα Φυσικών Αντικειµένων. Πρόγραµµα = Οµάδα

Transcript:

Ε ΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΣΧΕ ΙΑΣΜΟΣ ΛΟΓΙΣΜΙΚΟΥ ΠΛΗ24 ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ ΙΙ Πρότυπα Σχεδίασης Πάνος Φιτσιλής 2004

We should forget about small efficiencies, say about 97% of the time: Premature optimization is the root of all evil. Donald Knuth 2

Πίνακας Περιεχοµένων 1 ΕΙΣΑΓΩΓΗ... 4 2 Η ΤΑΞΙΝΟΜΗΣΗ ΤΩΝ ΠΡΟΤΥΠΩΝ... 8 3 ΤΑ ΠΡΟΤΥΠΑ GOF... 12 3.1 ΗΜΙΟΥΡΓΙΚΑ ΠΡΟΤΥΠΑ... 12 3.2 ΟΜΙΚΑ ΠΡΟΤΥΠΑ... 16 3.3 ΠΡΟΤΥΠΑ ΣΥΜΠΕΡΙΦΟΡΑΣ... 20 4 Η ΠΕΡΙΓΡΑΦΗ ΕΝΟΣ ΠΡΟΤΥΠΟΥ... 27 5 ΤΑ ΠΟΙΟΤΙΚΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΑ ΕΝΟΣ ΠΡΟΤΥΠΟΥ... 29 6 ΣΥΜΠΕΡΑΣΜΑΤΑ... 31 7 ΒΙΒΛΙΟΓΡΑΦΙΑ... 32 Πίνακας Εικόνων Εικόνα 1: Το πρότυπο Factory...12 Εικόνα 2: Το πρότυπο Factory Method...13 Εικόνα 3: Το πρότυπο Singleton...16 Εικόνα 4: Το πρότυπο Adapter...16 Εικόνα 5: Το πρότυπο Façade...19 Εικόνα 6: Το πρότυπο Proxy...20 Εικόνα 7: Chain of Responsibility...21 Εικόνα 8: Το πρότυπο Command...22 Εικόνα 9: Το πρότυπο Iterator...22 Εικόνα 10: Το πρότυπο memento...24 Εικόνα 11: Το πρότυπο Template Method....26 3

1 Εισαγωγή Η λειτουργία του λογισµικού σε αντικειµενοστρεφή περιβάλλοντα βασίζεται στη συνεργασία των αντικειµένων. Από αυτή την συνεργασία προκύπτει η λειτουργία του συστήµατος. Καθώς αναπτύσσουµε συστήµατα συχνά βρισκόµαστε αντιµέτωποι µε προβλήµατα που έχουµε ήδη συναντήσει και που έχουµε ήδη δει (déjà vu). Αυτά τα επαναλαµβανόµενα προβλήµατα µαζί µε τις επαναχρησιµοποιούµενες λύσεις τους ονοµάζονται πρότυπα σχεδίασης (design patterns). Στο άρθρο αυτό, παρουσιάζουµε τα βασικά στοιχεία που είναι απαραίτητα να γνωρίζουµε για την κατανόηση και χρήση των προτύπων σχεδίασης. Σκοπός του άρθρου δεν είναι να εξαντλήσει το θέµα των προτύπων σχεδίασης αλλά να παρουσιάσει τις βασικές έννοιες που χρησιµοποιούνται στην περιοχή αυτή, δίνοντας ερεθίσµατα για παραπέρα µελέτη. Μπορούµε να πούµε ότι ένα πρότυπο σχεδίασης είναι ένας έξυπνος και οξυδερκής τρόπος επίλυσης µιας ειδικής κατηγορίας προβληµάτων. Η λύση αυτή προκύπτει από την επίλυση του προβλήµατος από ένα αριθµό διαφορετικών ατόµων οι οποίοι και έχουν αντιµετωπίσει το ίδιο πρόβληµα από διάφορες οπτικές γωνίες και σε διάφορες περιπτώσεις. Το πρότυπο σχεδίασης είναι ανάµεσα στο σύνολο των υπαρχόντων λύσεων, η γενικότερη, η πληρέστερη και η πιο εύκαµπτη λύση. Η βασική ιδέα των προτύπων σχεδίασης ανήκει στον αρχιτέκτονα Christopher Alexander, ο οποίος στο τέλος της δεκαετίας του 70 έγραψε δύο βιβλία µε τίτλο «Α Pattern Language» και «Α timeless way of building» όπου περιγράφεται η ιδέα των προτύπων σχεδίασης και δίνονται παραδείγµατα. Ο Alexander χρησιµοποίησε πρότυπα για να σχεδιάσει κτήρια και πόλεις. Τα πρότυπά του έχουν να κάνουν µε κήπους, δρόµους, εισόδους κτηρίων κ.λπ. Η ιδέα των προτύπων σχεδίασης για την κατασκευή λογισµικού άρχισε να χρησιµοποιείται προς το τέλος της δεκαετίας του 80 και πιο συγκεκριµένα στο διεθνές συνέδριο OOPSLA (Object Oriented Programming, Systems & Applications) του 1987 ο W. Cunningham και ο Κ. Beck παρουσίασαν ένα άρθρο µε τίτλο «Using Pattern Languages for Object-Oriented Programs» στο οποίο περιέγραψαν 5 πρότυπα που µπορούσαν να χρησιµοποιηθούν για το σχεδιασµό ενός παραθύρου στη γλώσσα Smalltalk. 4

Η επιστηµονική κοινότητα πολύ γρήγορα αναγνώρισε την αξία της ιδέας και πολλοί άρχισαν να προτείνουν αλλά και να γράφουν νάα πρότυπα. Το σηµείο σταθµός αυτής της διαδικασίας αποτέλεσε η έκδοση του βιβλίου «Design Paterns» των Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides το 1994. Η αποδοχή του βιβλίου υπήρξε καθολική αποδεικνύοντας τη βασική ανάγκη για αλλαγή του παραδοσιακού τρόπου κατασκευής συστηµάτων και κατασκευή λογισµικού βασισµένη σε πρότυπα και από επαναχρησιµοποιούµενα συστατικά. Η οµάδα συγγραφής ονοµάστηκε «συµµορία των τεσσάρων» (Gang of Four - GoF) και τα πρότυπα τα οποία πρότειναν αναφέρονται σαν πρότυπα GoF. Έχουν δοθεί πολλοί ορισµοί για το τι είναι πρότυπο. Ένας γενικός και γενικά αποδεκτός ορισµός είναι: Ένα πρότυπο είναι µια αφαίρεση µιας συγκεκριµένης µορφής η οποία επαναλαµβάνεται σε συγκεκριµένες µη τυχαίες καταστάσεις. Από τον παραπάνω ορισµό προκύπτει ότι τα πρότυπα προσανατολίζονται στην επίλυση προβληµάτων σχεδιασµού, της συγκεκριµένης µορφής που επαναλαµβάνεται. Η συγκεκριµένη µορφή που επαναλαµβάνεται δεν επαναλαµβάνεται µε ένα τυχαίο τρόπο αλλά αντίθετα σε ένα συγκεκριµένο περιβάλλον, σε µια συγκεκριµένη κατάσταση και κάτω από τις ίδιες συνθήκες. Έτσι το πρότυπο, η αφαίρεση της συγκεκριµένης µορφής, δεν προτείνει απλά και µόνο µια λύση αλλά ταυτόχρονα ισορροπεί ανάµεσα στους συγκρουόµενους περιορισµούς της δεδοµένης κατάστασης. Το κάθε πρότυπο έχει ένα όνοµα, το οποίο εξυπηρετεί ως εννοιολογική λαβή για να διευκολύνει τη συζήτηση τη σχετική µε το πρότυπο και τη γνώση που αυτό αντιπροσωπεύει. Ένας πιο χρηστικός ορισµός του προτύπου είναι ο παρακάτω: Πρότυπο είναι ένα ονοµασµένο ψήγµα διδακτικής πληροφορίας που κελυφοποιεί τη βασική δοµή και την αναγκαία γνώση-εµπειρία µιας επιτυχηµένης οικογένειας δοκιµασµένων λύσεων σε επαναλαµβανόµενα προβλήµατα του ιδίου τύπου, που προκύπτουν σε ένα συγκεκριµένο χώρο που υπόκειται σε γνωστούς περιορισµούς και αλληλοσυγκρουόµενες δυνάµεις. Το πρότυπο είναι ένας τρι-µερής κανόνας που εκφράζει τη σχέση µεταξύ του χώρου αναφοράς, τις αλληλεπιδρούσες δυνάµεις και το σχηµατισµό λογισµικού που επιτρέπει 5

στις δυνάµεις να εκφρασθούν σε αποτέλεσµα. Με πιο απλά λόγια, το πρότυπο είναι η τριµερής σχέση µεταξύ του χώρου αναφοράς, του προβλήµατος και της λύσης. Από τα παραπάνω προκύπτει ότι το πρότυπο περιέχει τόσο τον τρόπο λύσης, όσο και τη λύση του προβλήµατος. Έτσι ένα πρότυπο έχει δυική υπόσταση µια και είναι ταυτόχρονα η διαδικασία λύσης του προβλήµατος αλλά και το αποτέλεσµα της διαδικασίας. Η βασική ιδέα ενός πρότυπου είναι παρόµοια µε αυτή του σχεδιασµού των προγραµµάτων: να εισάγουµε ένα επίπεδο αφαίρεσης το οποίο θα µας επιτρέψει να δώσουµε µια καλύτερη λύση στο πρόβληµα. Όταν εισάγουµε µια αφαίρεση, ο βασικός µας στόχος είναι να εστιάσουµε την προσοχή µας στις βασικές παραµέτρους του προβλήµατος και να αποκρύψουµε τις άχρηστες λεπτοµέρειες. Επιπλέον, η εισαγωγή µιας αφαίρεσης µας επιτρέπει να διαχωρίσουµε τις παραµέτρους του προβλήµατος που αλλάζουν και προκαλούν αλλαγές από αυτές που δεν προκαλούν αλλαγές. Η αποµόνωση των αλλαγών στο εσωτερικό του προτύπου µειώνει σηµαντικά την πιθανότητα διάδοσης των αλλαγών, σε άλλα τµήµατα του συστήµατος, όταν το πρότυπο χρειάζεται να αλλάξει. Αυτό το χαρακτηριστικό κάνει την συντήρηση του συστήµατος πολύ εύκολη και µειώνει το κόστος. Αν και καλούνται πρότυπα σχεδίασης, όλα τα πρότυπα δεν αναφέρονται µόνο στη σχεδίαση του συστήµατος. Πολλές φορές ένα πρότυπο συµπεριλαµβάνει µια πλήρη ιδέα για την επίλυση ενός προβλήµατος και συνεπώς µπορεί να συµπεριλαµβάνει στοιχεία της ανάλυσης, του σχεδιασµού και της υλοποίησης. Επιπλέον, ένα πρότυπο σχεδίασης µπορεί να έχει πολλές διαφορετικές µορφές και µπορεί να είναι: Μια δοµή, που περιέχει σχέσεις µεταξύ των κλάσεων Μια δοµή σχεδίασης Ένας τρόπος υλοποίησης ενός προβλήµατος Μια στάνταρτ λύση σε ένα κοινό πρόβληµα προγραµµατισµού Μια διεπαφή µεταξύ δύο συστατικών Είναι σηµαντικό να κατανοήσουµε ότι κάθε λύση, βέλτιστη πρακτική ή αλγόριθµος που χρησιµοποιούµε δεν αποτελεί και πρότυπο σχεδίασης. Ένα βασικό χαρακτηριστικό που πρέπει να έχει µια λύση για να αποτελέσει πρότυπο σχεδίασης είναι αυτό της επανάληψης, που σηµαίνει ότι πρέπει να εµφανίζεται µε τον ίδιο τρόπο σε περισσότερες από µια περιπτώσεις. Ο κανόνας που έχει επικρατήσει είναι ότι για να θεωρήσουµε ότι 6

µια λύση αποτελεί πρότυπο πρέπει να εµφανίζεται τουλάχιστον σε τρεις διαφορετικές περιπτώσεις συστηµάτων και να έχει επαληθευτεί από ανεξάρτητους παρατηρητές. Η τεκµηρίωση ενός προτύπου είναι εξαιρετικά δύσκολη και σηµαντική εργασία. Ένα καλό πρότυπο πρέπει να ικανοποιεί τα παρακάτω χαρακτηριστικά: Λύνει το πρόβληµα: Ένα πρότυπο οφείλει να παρουσιάζει τη λύση του προβλήµατος και όχι µια γενική προσέγγιση ή µια στρατηγική. Βασίζεται σε δοκιµασµένες έννοιες: Ένα πρότυπο πρέπει να βασίζεται σε δοκιµασµένες λύσεις και όχι σε νέες µη δοκιµασµένες θεωρίες. Η λύση δεν είναι προφανής: Μια τετριµµένη λύση σε ένα απλό πρόβληµα δεν έχει αξία µια και ο καθένας µπορεί να την παράγει εύκολα και γρήγορα. Αντίθετα µια σύνθετη λύση απαιτεί πολύ χρόνο και σκέψη και προφανώς έχει µεγάλη αξία. Περιγράφει σχέσεις: Τα πρότυπα δεν είναι απλές περιγραφές κοµµατιών κώδικα, αλλά αντίθετα περιγράφουν βαθύτερους µηχανισµούς και σχέσεις. Τα πρότυπα λαµβάνουν υπόψη την ανθρώπινη διάσταση: Στόχος ενός προτύπου είναι να βελτιώσει την ποιότητα του συστήµατος, που έχει ως συνέπεια τη βελτίωση της ποιότητας και της χρηστικότητας που απολαµβάνουν οι άνθρωποι. Προφανώς δεν ισχύει το αντίθετο, δηλαδή αν µια λύση δεν είναι πρότυπο δεν είναι απαραίτητα και κακή λύση. Υπάρχουν πολλές περιπτώσεις εξαιρετικών λύσεων οι οποίες δεν αποτελούν πρότυπα για το λόγο ότι δεν ισχύει ο κανόνας της επανάληψης. 7

2 Η ταξινόµηση των προτύπων Η εισαγωγή της ιδέας των προτύπων δηµιούργησε ένα κύµα παραγωγής ανοµοιογενών προτύπων, άλλα εκ των οποίων αναφέρονταν στην υλοποίηση ενώ άλλα αναφέρονταν στον σχεδιασµό. Έτσι πολύ γρήγορα δηµιουργήθηκε η ανάγκη της ταξινόµησης αυτών ανάλογα µε το είδος και το επίπεδο της λύσης που πρότειναν. Σύµφωνα µε την προσέγγιση των Buschmann και λοιπών στο βιβλίο Pattern-Oriented Software Architecture (POSA) ορίζονται τρία είδη προτύπων ως ακολούθως: Αρχιτεκτονικά Πρότυπα (Architectural Patterns). Ένα αρχιτεκτονικό πρότυπο εκφράζει τη δοµική οργάνωση ενός συστήµατος λογισµικού. Για παράδειγµα προσδιορίζει τα υποσυστήµατα, προδιαγράφει τις υπευθυνότητές τους, τους κανόνες που διέπουν την οργάνωσή τους και τις σχέσεις τους. Πρότυπα σχεδιασµού (Design Patterns). Ένα πρότυπο σχεδιασµού είναι ένας τρόπος περιγραφής ενός υποσυστήµατος ή των συστατικών ενός συστήµατος λογισµικού. Περιγράφουν συνηθισµένες επαναλαµβανόµενες δοµές επίλυσης γενικών προβληµάτων σχεδιασµού σε ένα συγκεκριµένο χώρο εφαρµογής. Ιδιωµατισµοί (Idioms). Ένας ιδιωµατισµός είναι ένα πρότυπο χαµηλού επιπέδου που εξειδικεύεται από µια γλώσσα προγραµµατισµού. Ένας ιδιωµατισµός περιγράφει την υλοποίηση µιας συγκεκριµένης λειτουργίας του συστατικού καθώς και τη σχέση του µε άλλες λειτουργίες του συστατικού σε µια γλώσσα προγραµµατισµού. Η διαφορά µεταξύ αυτών των τριών ειδών προτύπων είναι το επίπεδο αφαίρεσης που υλοποιούν και της λεπτοµέρειας που προδιαγράφουν. Τα αρχιτεκτονικά πρότυπα περιγράφουν υψηλού επιπέδου στρατηγικές που αφορούν τα µεγάλα συστατικά και τις γενικές ιδιότητες και µηχανισµούς ενός συστήµατος. Η εφαρµογή τους έχει µεγάλη επιρροή στη γενική µορφή και οργάνωση του συστήµατος. Τα πρότυπα σχεδιασµού είναι µεσαίου µεγέθους και προδιαγράφουν τη δοµή και τη συµπεριφορά των οντοτήτων του συστήµατος και των σχέσεών τους. εν επηρεάζουν τη γενική δοµή του συστήµατος, αλλά αντ' αυτού καθορίζουν τις µικρο-αρχιτεκτονικές των υποσυστηµάτων και των συστατικών. Τέλος οι ιδιωµατισµοί, είναι πρότυπα χαµηλού επιπέδου, δεµένα µε µια γλώσσα προγραµµατισµού που περιγράφουν τον τρόπο µε τον οποίο γράφουµε τον κώδικα ή τον τρόπο µε τον οποίο υλοποιούµε συγκεκριµένα προβλήµατα. 8

Ένας δεύτερος τρόπος ταξινόµησης που είναι και ο επικρατέστερος είναι ανάλογος του σκοπού του προτύπου, έχει περιγραφεί από τον Gamma και λοιπούς στο βιβλίο τους Design Patterns και είναι από τους επικρατέστερους. Στο βιβλίο του, ο Gamma και οι λοιποί, περιγράφουν 23 πρότυπα τα οποία ταξινοµούνται σε τρεις κατηγορίες οι οποίες και είναι: ηµιουργικά πρότυπα Τα δηµιουργικά (creational) πρότυπα περιγράφουν τη δηµιουργία αντικειµένων και βοηθούν στο να κάνουµε το σύστηµα ανεξάρτητο του τρόπου του οποίου τα αντικείµενα δηµιουργούνται, συνθέτονται και καταστρέφονται. Τα δηµιουργικά πρότυπα αποκτούν ιδιαίτερη σηµασία κατά την εξέλιξη του συστήµατος όταν οι περισσότερες σχέσεις είναι σχέσης συναρµολόγησης και όχι κληρονοµικότητας. Αυτό συµβαίνει γιατί σε µεγάλα συστήµατα αυτό που µας ενδιαφέρει περισσότερο είναι να ορίσουµε ένα σύνολο βασικών κλάσεων, οι οποίες µπορούν να συναρµολογηθούν µε πολλούς διαφορετικούς τρόπους για τη δηµιουργία σύνθετων συµπεριφορών αντί για τον ορισµό κλάσεων µε πολύ µεγάλη πολυπλοκότητα και σύνθετη συµπεριφορά. Στην περίπτωση αυτή η δηµιουργία ενός αντικειµένου δεν είναι απλά η αρχικοποίησή του. ύο είναι τα βασικά θέµατα γύρω από τα οποία περιστρέφονται τα πρότυπα αυτής της κατηγορίας. Το πρώτο είναι, η κελυφοποίηση της γνώσης για το πια κλάση χρησιµοποιείται από το σύστηµα και δεύτερον πως δηµιουργούνται στιγµιότυπα κλάσεων. Ως αποτέλεσµα τα δηµιουργικά πρότυπα µας δίνουν µεγάλη ευελιξία στο τι δηµιουργούµε, στο ποιος το δηµιουργεί, στο πως δηµιουργείται και στο πότε δηµιουργείται Τα πρότυπα αυτής της κατηγορίας σύµφωνα µε το Gamma είναι: Abstract Factory Builder Factory Method Prototype ηµιουργεί µια διεπαφή για τη δηµιουργία διάφορων οικογενειών κλάσεων Χωρίζει την κατασκευή του αντικειµένου από την αναπαράστασή του Ορίζει µια διεπαφή για τη δηµιουργία ενός αντικειµένου αλλά αφήνει την αρχικοποίηση στις υποκλάσεις ηµιουργεί ένα πλήρως αρχικοποιηµένο πρωτότυπο αντικείµενο 9

έτοιµο να αντιγραφεί. Singleton Μια κλάση της οποίας µπορεί να υπάρχει µόνο ένα στιγµιότυπο. οµικά πρότυπα Τα δοµικά (structural) πρότυπα προσδιορίζουν το πως οι κλάσεις και τα αντικείµενα συναρµολογούνται σε µεγαλύτερες δοµές. Τα δοµικά πρότυπα που εστιάζονται σε κλάσεις, περιγράφουν το πώς χρησιµοποιείται η σχέση κληρονοµικότητας για να παράγουµε χρήσιµες διεπαφές. Ένα απλό παράδειγµα είναι αυτό της πολλαπλής κληρονοµικότητας που δηµιουργεί µια καινούργια κλάση βασισµένη σε δύο ή περισσότερες άλλες κλάσεις. Η παραγόµενη κλάση έχει τις ιδιότητες όλων των κλάσεωνπατέρας. Το πρακτικό αποτέλεσµα ενός τέτοιου προτύπου είναι ότι µπορούµε να συνδιάζουµε µε εύκολο τρόπο API (Application Programming Interface). Τα δοµικά πρότυπα αντικειµένων, περιγράφουν το πως από αντικείµενα συναρµολογούµε µεγαλύτερες δοµές. Τα πρότυπα αυτής της κατηγορίας σύµφωνα µε το Gamma είναι: Adapter Bridge Composite Decorator Façade Flyweight Proxy ηµιουργία κοινής διεπαφής για διαφορετικές κλάσεις ιαχωρισµός της διεπαφής από την υλοποίηση του αντικειµένου Χειρισµός δενδρικών δοµών απλών ή σύνθετων αντικειµένων Προσθέτει υπευθυνότητες σε ένα αντικείµενο µε δυναµικό τρόπο Μια κλάση που αντιπροσωπεύει ένα υποσύστηµα Είναι ένα πρότυπο για να βελτιστοποιήσουµε το µοίρασµα των πόρων σε περιπτώσεις που χρειαζόµαστε µεγάλο αριθµό αντικειµένων Ένα αντικείµενο που αντιπροσωπεύει κάποιο άλλο Πρότυπα συµπεριφοράς 10

Τα πρότυπα συµπεριφοράς (Behavioral): Περιέχουν αντικείµενα που χειρίζονται συγκεκριµένες ενέργειες µέσα στο σύστηµα. Τα πρότυπα αυτά κελυφοποιούν διαδικασίες όπως µεταγλώττιση κειµένου, εκτέλεση µια αίτησης, µετακίνηση (iteration) µέσα σε µια ακολουθία (sequence), υλοποίηση ενός αλγορίθµου. Τα πρότυπα αυτής της κατηγορίας σύµφωνα µε το Gamma είναι: Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Method Visitor Πρότυπο για το πέρασµα µιας αίτησης από ένα αντικείµενο σε ένα σύνολο αντικειµένων Κελυφοποίηση µιας αίτησης εντολής σε ένα αντικείµενο Η αναπαράσταση µιας γλώσσας σε ένα πρόγραµµα Πρότυπο που διατρέχει και προσπελαύνει µια λίστα αντικειµένων Πρότυπο που απλοποιεί την επικοινωνία µεταξύ αντικειµένων Καταγράφει την εσωτερική κατάσταση ενός αντικειµένου και το ανακατασκευάζει Πρότυπο που ειδοποιεί ένα σύνολο αντικειµένων για µια αλλαγή Αλλάζει τη συµπεριφορά ενός αντικειµένου όταν αλλάξει η κατάσταση του αντικειµένου. Ουσιαστικά αλλάζει την κλάση του αντικειµένου. Ορίζει οικογένειες αλγορίθµων και τις κελυφοποιεί σε κλάσεις Ορίζει το σκελετό ενός αλγορίθµου αφήνοντας τον ορισµό ορισµένων βηµάτων στις υποκλάσεις. Επιτρέπει τον ορισµό καινούργιων µεθόδων σε µια κλάση χωρίς να αλλάξει την κλάση 11

3 Τα πρότυπα GoF 3.1 ηµιουργικά πρότυπα Το πρότυπο Abstract Factory. Το πρότυπο αυτό παρέχει µια διεπαφή για τη δηµιουργία διάφορων οικογενειών κλάσεων ή συσχετιζόµενων κλάσεων χωρίς να προσδιορίζουµε ποια κλάση ακριβώς. Ένα παράδειγµα για την κατανόηση του προτύπου είναι το ακόλουθο: σ ένα εργοστάσιο κατασκευής αυτοκινήτων υπάρχουν πρέσες, οι οποίες µε την κατάλληλη ρύθµιση µπορούν να παράγουν αριστερές και δεξιές πόρτες για διάφορους τύπους οχηµάτων. Η πρέσα ακολουθεί το πρότυπο abstract factory. Το πρότυπο αυτό είναι εύκολα αναγνωρίσιµο και πολύ συνηθισµένο. Στο παρακάτω παράδειγµα τo πρότυπο factory χρησιµοποιείται για την διαχείριση του κύκλου ζωής ενός αντικειµένου (δηµιουργία, συντήρηση) και πιο συγκεκριµένα για τη δηµιουργία µια σύνδεσης µε τη βάση δεδοµένων. Εικόνα 1: Το πρότυπο Factory Το πρότυπο Builder. Το πρότυπο Builder διαχωρίζει την κατασκευή ενός αντικειµένου από την αναπαράστασή του, έτσι ώστε η κατασκευή του να µπορεί να δηµιουργήσει διαφορετικές αναπαραστάσεις. Το πρότυπο χρησιµοποιείται για την επίλυση προβληµάτων της µορφής: Έστω ότι θέλουµε να κατασκευάσουµε έναν υπολογιστή. Η κατασκευή του υπολογιστή γίνεται σε στάδια. Επιπλέον ο πρώτος υπολογιστή που θέλουµε να κατασκευάσουµε έχει 512ΜΒ µνήµη και 2GHz CPU, ενώ ο δεύτερος έχει 256ΜΒ µνήµη και 3GHz CPU. Το πρότυπο Builder είναι αυτό που περιγράφει τη διαδικασία κατασκευής, ενώ το πρότυπο Abstract Factory περιγράφει τα συστατικά του τελiκού προϊόντος. 12

Το πρότυπο Factory Method Ορίζει µια διεπαφή για τη δηµιουργία ενός αντικειµένου αλλά αφήνει την αρχικοποίηση του αντικειµένου στις υποκλάσεις. Το πρότυπο αυτό είναι γνωστό και µε το όνοµα virtual constructor. Χρησιµοποιώντας το ίδιο παράδειγµα της συναρµολόγησης ενός υπολογιστή, το πρότυπο Factory Method χρησιµοποιείται για να παράγει µια µέθοδο η οποία θα µας επιτρέπει να διαµορφώνουµε κάθε φορά µε διαφορετικό τρόπο τα συστατικά του υπολογιστή. Το πρότυπο Abstract Factory συνήθως υλοποιείται από το πρότυπο Factory Method. Για να γίνει κατανοητό το πρότυπο Factory Method καθώς και γενικότερα η χρήση των προτύπων παρουσιάζουµε ένα αναλυτικό παράδειγµα. X Factory getclass X XY XZ abc Εικόνα 2: Το πρότυπο Factory Method Στην παραπάνω εικόνα, η κλάση x είναι η κλάση πατέρας ενώ οι κλάσεις xy και xz είναι κλάσεις παιδιά.. Η κλάση Factory είναι η κλάση που αποφασίζει ποια από τις κλάσεις παιδιά να επιστρέψει σε συνάρτηση µε τα δεδοµένα εισόδου που παρέχει ο χρήστης. Η µέθοδος getclass είναι αυτή που περνάει στην κλάση Factory τα δεδοµένα, to string abc, και επιστρέφει στον προγραµµατιστή ένα στιγµιότυπο της κλάσης x. Ποιος είναι ο τύπος (η κλάση) του στιγµιότυπου που επιστρέφεται δεν έχει σηµασία για τον προγραµµατιστή, µια και όλα έχουν τις ίδιες µεθόδους και έχουν µόνο διαφορετικές υλοποιήσεις. Η απόφαση για το πιο στιγµιότυπο να επιστρέψει η µέθοδος getclass εξαρτάται αποκλειστικά από την κλάση factory. Ας δούµε ένα µικρό και απλό παράδειγµα της χρήσης της κλάσης Factory. Υποθέτουµε ότι η εφαρµογή που θέλουµε να φτιάξουµε περιέχει µια φόρµα η οποία επιτρέπει στο χρήστη να εισάγει είτε «όνοµα επίθετο» είτε «επίθετο, όνοµα». Θεωρούµε 13

ότι αν δεν υπάρχει κόµµα µεταξύ των ονοµάτων αναφερόµαστε στον πρώτο τύπο ενώ αν υπάρχει αναφερόµαστε στο δεύτερο τύπο. Η υλοποίηση της παραπάνω λογικής είναι εξαιρετικά απλή µε τη χρήση µιας εντολής if µέσα σε µια µέθοδο µιας κλάσης, αλλά για χάρη του παραδείγµατος θα δείξουµε την υλοποίηση της παραπάνω λογικής µε τη χρήση του προτύπου factory. Ξεκινάµε µε τον ορισµό της κλάσης πατέρας η οποία παίρνει ως όρισµα ένα String και το χωρίζει σε δύο ονόµατα: class Namer { // χωρίζει το string σε δύο ονόµατα protected String last; //αποθήκευση του επιθέτου protected String first; //αποθήκευση του µικρού ονόµατος } public String getfirst() { return first; //επιστρέφει το µικρό όνοµα } public String getlast() { return last; //επιστρέφει το επίθετο } Στην κλάση αυτή ουσιαστικά δεν κάνουµε τίποτε άλλο εκτός από την υλοποίηση των µεθόδων getfirst() και getlast(). Στις µεταβλητές last και first αποθηκεύουµε το επίθετο και το µικρό όνοµα αντίστοιχα. Λόγω του γεγονότος ότι οι παραγόµενες κλάσεις χρειάζεται να προσπελαύνουν αυτές τις µεταβλητές τις ορίζουµε ως protected. Οι δύο παραγόµενες κλάσεις είναι οι ακόλουθες: class FirstFirst extends Namer { //χωρίζει το επίθετο από το όνοµα public FirstFirst(String s) { int i = s.lastindexof(" "); //βρίσκει το πρώτο κενό if (i > 0) { //αριστερά βρίσκεται το όνοµα first = s.substring(0, i).trim(); //δεξιά είναι το επίθετο last =s.substring(i+1).trim(); } else { first = ; // εάν δεν υπάρχει κενό last = s; // τοποθέτησε όλο το string στο επίθετο } } } και class LastFirst extends Namer { //χώρισε επίθετο, όνοµα public LastFirst(String s) { int i = s.indexof(","); //βρες το κόµµα if (i > 0) { //αριστερά είναι το επίθετο last = s.substring(0, i).trim(); //δεξιά είναι το όνοµα 14

} } first = s.substring(i + 1).trim(); } else { last = s; // εάν δεν υπάρχει κόµµα first = ""; // βάλε το string στο όνοµα } Η κλάση factory είναι η παρακάτω class NameFactory { // Επιστρέφει ένα στιγµιότυπο από LastFirst ή FirstFirst //ανάλογα µε τον αν βρήκε κόµµα ή όχι public Namer getnamer(string entry) { int i = entry.indexof(","); //το κόµµα καθορίζει τη σειρά if (i>0) return new LastFirst(entry); else return new FirstFirst(entry); } } Επιπλέον, για τη χρήση του παραπάνω κώδικα χρειάζεται η κατασκευή ενός παραθύρου που θα δέχεται ως είσοδο το string και θα παρουσιάζει το επίθετο από το όνοµα διαχωρισµένα. Το πρότυπο Prototype ηµιουργεί ένα πλήρως αρχικοποιηµένο πρωτότυπο αντικείµενο έτοιµο να αντιγραφεί. Ένα παράδειγµα εφαρµογής που θα µπορούσε να ωφεληθεί από το πρότυπο Prototype είναι µια εφαρµογή που αποθηκεύει εικόνες σε διάφορα format. H δυνατότητα αποθήκευσης εικόνων ενός νέου format, θα ήταν πολύ εύκολο να προστεθεί στην εφαρµογή, µε τη χρήση του πρότυπου Prototype, µια και τα στιγµιότυπα των κλάσεων καθώς και η χρονική στιγµή που δηµιουργούνται, ορίζονται δυναµικά. Το πρότυπο Singleton Το πρότυπο singleton δηµιουργεί ένα και µόνο ένα στιγµιότυπο του αντικειµένου ανεξάρτητα από το πόσες φορές αυτό αρχικοποιείται. Η πιο συνηθισµένη χρήση του προτύπου Singleton είναι για τη δηµιουργία ενός εξυπηρετητή (server) όπως για παράδειγµα συµβαίνει στην περίπτωση της Java και µε την εφαρµογή της Remote Method Invocation (RMI). 15

Εικόνα 3: Το πρότυπο Singleton 3.2 οµικά πρότυπα Το πρότυπο Adapter Στο πρότυπο Adapter (προσαρµοστής), ένα αντικείµενο υλοποιεί τη διεπαφή που χρησιµοποιείται από τα άλλα αντικείµενα µε ενιαίο και γενικό τρόπο έτσι ώστε τα αντικείµενα που προσπελαύνουν µια συσκευή (device) ή ένα άλλο συστατικό (component) να µην χρειάζεται να γνωρίζουν την συγκεκριµένη υλοποίηση αλλά µόνο τη διεπαφή (interface) αυτής. Ένα πολύ καλό παράδειγµα του πρότυπου adapter είναι ένας οδηγός βάσης δεδοµένων όπως ένας ODBC (Open Database Connectivity) driver ή JDBC (Java Database Connectivity) driver που δίνει στις εφαρµογές ένα ανεξάρτητο τρόπο προσπέλασης της βάσης δεδοµένων είτε πρόκειται για MS-Access είτε για MS- SQL Server είτε για ORACLE. Εικόνα 4: Το πρότυπο Adapter Το πρότυπο Bridge Το πρότυπο bridge διαχωρίζει τη διεπαφή µιας κλάσης από την υλοποίηση της έτσι ώστε να µπορούν να µεταβάλλονται ανεξάρτητα. Το πρότυπο bridge µοιάζει αρκετά µε το πρότυπο adapter έχουν όµως την εξής διαφορά. Το πρότυπο adapter µετατρέπει τη διεπαφή της κλάσης από µια µορφή σε µια άλλη. Αντίθετα, το πρότυπο bridge απλά διαχωρίζει τη διεπαφή από την υλοποίηση χωρίς να τη µετασχηµατίζει. Έτσι το πρότυπο bridge χρησιµοποιείται όταν θέλουµε να κρατούµε τη διεπαφή σταθερή και να αλλάζουµε κάθε φορά την υλοποίηση. 16

Το πρότυπο Composite Συχνά οι προγραµµατιστές βρίσκονται αντιµέτωποι µε την περίπτωση στην οποία ένα συστατικό µπορεί να είναι ένα µεµονωµένο αντικείµενο ή µπορεί να αντιπροσωπεύει µια συλλογή των αντικειµένων. Το πρότυπο Composite είναι σχεδιασµένο για να προσαρµόζεται και στις δύο περιπτώσεις. Μπορεί να χρησιµοποιηθεί για να φτιάξουµε ιεραρχίες σύνθεσης (composition, aggregation) ή για να κατασκευάσουµε δενδρικές δοµές δεδοµένων. Συµπερασµατικά, πρότυπο Composite είναι µια συλλογή αντικειµένων, οποιαδήποτε από τα οποία µπορεί να είναι είτε ένα σύνθετο, είτε ένα απλό αντικείµενο. Επιπλέον, στην περίπτωση των δενδρικών δοµών, µερικά αντικείµενα µπορούν να είναι κόµβοι που έχουν κλαδιά ενώ άλλα µπορεί να είναι φύλλα. Το πρόβληµα που επιλύει το πρότυπο Composite είναι αυτό της ύπαρξης µόνο µιας διεπαφής για την προσπέλαση όλων των αντικειµένων που περιέχονται στο Composite είτε πρόκειται για απλά είτε για σύνθετα αντικείµενα. Επιπλέον, όπως αναφέραµε το πρότυπο Composite διακρίνει σε δενδρικές δοµές κόµβους και φύλλα. Οι κόµβοι είναι αντικείµενα στους οποίους µπορούµε να προσθέσουµε παιδιά, ενώ τα φύλλα δεν έχουν παιδία. Το πρότυπο Decorator Το πρότυπο decorator µας δίνει έναν τρόπο για να τροποποιήσουµε τη συµπεριφορά µεµονωµένων αντικειµένων χωρίς να χρειασθεί να δηµιουργήσουµε µια νέα κλάση. Υποθέστε ότι έχουµε ένα πρόγραµµα που χρησιµοποιεί πέντε αντικείµενα, τρία από τα οποία χρειάζονται ένα πρόσθετο χαρακτηριστικό γνώρισµα. Θα µπορούσαµε πολύ εύκολα να δηµιουργήσουµε µια καινούργια κλάση µε αυτό το κοινό χαρακτηριστικό, πράγµα το οποίο είναι µια σωστή και αποδεκτή λύση. Εντούτοις, εάν κάθε ένα από αυτά τα τρία αντικείµενα απαιτεί διαφορετικές τροποποιήσεις, αυτό θα σήµαινε τρεις νέες κλάσεις. Στην περίπτωση αυτή η δηµιουργία τριών νέων κλάσεων εισάγει πολυπλοκότητα στο σύστηµα η οποία δεν είναι απαραίτητη. Στην περίπτωση αυτή χρησιµοποιείται το πρότυπο decorator. Στην πράξη το πρότυπο decorator χρησιµοποιείται πολύ συχνά. Οι γραµµές εργαλείων που ενεργοποιούνται δυναµικά κατά τη διάρκεια εκτέλεσης ενός προγράµµατος είναι ίσως το πιο συνηθισµένο παράδειγµα. 17

Το πρότυπο Façade Συχνά, καθώς οι εφαρµογές που αναπτύσσουµε µεγαλώνουν σε µέγεθος, µεγαλώνει και η πολυπλοκότητα των δοµών και του συστήµατος γενικότερα. Επιπλέον, ο αντικειµενοστρεφής τρόπος ανάπτυξης σε συνδυασµό µε τα πρότυπα σχεδίασης οδηγεί σε εξαιρετικά µεγάλες ιεραρχίες και σε κερµατισµό της λογικής µε αποτέλεσµα να γίνεται δύσκολη έως αδύνατη η κατανόηση της λογικής του συστήµατος. Η δυσκολία αυξάνεται ακόµη πιο πολύ όταν υπάρχει µεγάλος αριθµός υποσυστηµάτων µε τα οποία το σύστηµα ανταλλάσει δεδοµένα. Το πρότυπο Façade µας επιτρέπει να απλοποιήσουµε την συνολική εικόνα παρουσιάζοντας µια διεπαφή ανά υποσύστηµα αντί να έχουµε µια διεπαφή ανά κλάση. Αυτή η απλοποίηση µπορεί σε µερικές περιπτώσεις να µειώσει την ευελιξία των ελλοχευουσών κλάσεων, αλλά συνήθως παρέχει όλη τη απαιτούµενη λειτουργικότητα εκτός εξαιρέσεων και ειδικών περιπτώσεων. Για τις εξαιρετικές αυτές περιπτώσεις όπου η διεπαφή του υποσυστήµατος δεν µπορεί να µας προσφέρει τη λειτουργικότητα που χρειαζόµαστε είναι δυνατόν να χρησιµοποιήσουµε χωρίς κανένα πρόβληµα τη λειτουργικότητα την οποία παρέχουν οι ελλοχεύουσες κλάσεις και µεθόδοι. Η εφαρµογή του πρότυπου Façade είναι απλή και πολύ συνηθισµένη στην καθηµερινή πράξη. Για παράδειγµα, η γλώσσα προγραµµατισµού Java παρέχει ένα σύνολο κλάσεων που συνδέουν την εφαρµογή µε τη βάση δεδοµένων χρησιµοποιώντας τη διεπαφή JDBC (Java Database Connectivity). Επιπλέον, χρησιµοποιώντας την ίδια διεπαφή JDBC, µπορούµε να συνδέσουµε την εφαρµογή µας µε οποιαδήποτε βάση δεδοµένων για την οποία υπάρχει διεπαφή JDBC. Σε περίπτωση που η διεπαφή JDBC, δεν παρέχει επακριβώς την λειτουργικότητα που επιθυµούµε, µια και από τη φύση της είναι γενική, µπορούµε να χρησιµοποιήσουµε την ειδικευµένη διεπαφή που παρέχει ο κατασκευαστής της βάσης δεδοµένων (native drivers). 18

Εικόνα 5: Το πρότυπο Façade Στην παραπάνω εικόνα το Façade είναι η Εφαρµογή ανείων. Το Façade «Εφαρµογή ανείων» γνωρίζει: ποια κλάση του υποσυστήµατος είναι υπεύθυνη να εξυπηρετήσει κάθε εξωτερική αίτηση προς το υποσύστηµα πώς να µεταβιβάσει τις αιτήσεις στο κατάλληλο αντικείµενο του υποσυστήµατος Αντίστοιχα οι κλάσεις του υποσυστήµατος γνωρίζουν πως να υλοποιήσουν τη λειτουργικότητα του υποσυστήµατος γνωρίζουν πως να χειρισθούν τη δουλειά που τους ανατίθεται από το αντικείµενο Façade δεν γνωρίζουν την ύπαρξη του Façade. Το πρότυπο Flyweight Υπάρχουν προγραµµατιστικές περιπτώσεις όπου πρέπει να δηµιουργήσουµε έναν πολύ µεγάλο αριθµό αντικειµένων, το καθένα από τα οποία αποθηκεύει µια µικρή ποσότητα πληροφορίας και διαφέρει το ένα από το άλλο στην τιµή µιας µεταβλητής. Είναι δυνατόν να µειώσουµε το µεγάλο αυτό αριθµό αντικειµένων µετακινώντας τις µεταβλητές αυτές εκτός του κυρίως σώµατος της κλάσεως και να περνάµε τις µεταβλητές αυτές ως παραµέτρους. 19

Το πρότυπο flyweight δίνει τη λύση για το χειρισµό τέτοιων περιπτώσεων. Το πρότυπο διαχωρίζει τις µεταβλητές του αντικειµένου σε εγγενείς και σε εξωγενείς. Οι εγγενείς µεταβλητές είναι αυτές που συνδέονται άµεσα µε το αντικείµενο, του προσδίδουν ταυτότητα και παραµένουν στο εσωτερικό του αντικειµένου, ενώ οι εξωγενείς µεταβλητές µεταφέρονται εκτός του αντικειµένου και τις περνάµε στο αντικείµενο ως παραµέτρους. Το πρότυπο Flyweight χρησιµοποιείται πολύ συχνά για το χειρισµό των χαρακτήρων σε ένα επεξεργαστή κειµένου, ή το χειρισµό των ψηφίδων µιας εικόνας κ.λπ. Το πρότυπο Proxy Ένα πρότυπο proxy (πληρεξούσιο) υλοποιεί τη χρήση πληρεξούσιων αντικειµένων κατά τη διάρκεια µιας αλληλεπίδρασης. Συνήθως ένα πληρεξούσιο αντικείµενο ενεργεί ως υποκατάστατο ενός πραγµατικού αντικειµένου. Τα πληρεξούσια αντικείµενα χρησιµοποιούνται σε πρωτόκολλα αλληλεπίδρασης µε φυσικά αποµακρυσµένα αντικείµενα. Για παράδειγµα, όταν ένα αντικείµενο πρέπει να αλληλεπιδράσει µε ένα αποµακρυσµένο αντικείµενο, µέσω ενός δικτύου (internet), ο προτιµηµένος τρόπος είναι να κελυφοποιήσουµε και να κρύψουµε το µηχανισµό αλληλεπίδρασης σ ένα πληρεξούσιο αντικείµενο, το οποίο µεσολαβεί στην επικοινωνία µεταξύ του αρχικού αντικειµένου και του αποµακρυσµένου αντικειµένου. Εικόνα 6: Το πρότυπο Proxy 3.3 Πρότυπα συµπεριφοράς Το πρότυπο Chain of Responsibility Το πρότυπο Chain of Responsibility (αλυσίδα ευθύνης) επιτρέπει σε κλάσεις να προσπαθήσουν να χειρισθούν ένα αίτηµα, χωρίς αυτές να γνωρίζουν την ύπαρξη των άλλων κλάσεων του συστήµατος ούτε και τη λειτουργικότητα αυτών. Το πρότυπο παρέχει µια χαλαρή σύζευξη µεταξύ των κλάσεων, µε µόνο κοινό στοιχείο το αίτηµα προς εξυπηρέτηση το οποίο περνά από την µια κλάση στην άλλη. 20

Ένα παράδειγµα εφαρµογής του πρότυπου Chain of Responsibility είναι ένα σύστηµα βοήθειας. Σε ένα τέτοιο σύστηµα όταν ο χρήστης ζητά βοήθεια πατώντας στο κατάλληλο σηµείο της οθόνης. Αν υπάρχει βοήθεια διαθέσιµη σχετική µε αυτό το θέµα τότε παρουσιάζεται. Σε αντίθετη περίπτωση το σύστηµα ψάχνει για σχετικό θέµα βοήθειας σε υψηλότερο επίπεδο µέχρι να εξαντλήσει όλα τα δυνατά επίπεδα. Εάν δεν υπάρχει σχετικό θέµα βοήθειας, το µήνυµα χάνεται και δεν επιδεικνύεται καµία πληροφορία. Στην παρακάτω εικόνα παρουσιάζεται ένα τέτοιο σενάριο όπου ο χρήστης ζητά βοήθεια για το «ΟΚ». Αν δεν βρεθεί βοήθεια για το συγκεκριµένο διάλογο τότε ψάχνουµε για βοήθεια στην κατηγορία «Button Help» κ.λπ. Εικόνα 7: Chain of Responsibility Το πρότυπο Command Το πρότυπο Command (εντολή) χρησιµοποιείται συνήθως για τη συλλογή των αιτηµάτων (requests) από τα αντικείµενα πελάτες, τη συσκευασία των αιτηµάτων σε ένα νέο αντικείµενο µε σκοπό την επεξεργασία τους και την τελική αποστολή των αιτηµάτων στο αντικείµενο-εξυπηρετητής. Το πρότυπο Command επιτρέπει τη δηµιουργία διεπαφών από το αντικείµενο που κάνει την επεξεργασία. 21

Εικόνα 8: Το πρότυπο Command Το πρότυπο Interpreter Σε µερικά συστήµατα είναι απαραίτητη η ύπαρξη µιας γλώσσας για την περιγραφή των διαδικασιών προς εκτέλεση. Το πρότυπο Interpreter περιγράφει τον ορισµό της γραµµατικής της γλώσσας καθώς και τη µεταγλώττιση και εκτέλεση των εντολών της. Το πρότυπο Iterator Το πρότυπο Iterator είναι ένας απλός µηχανισµός για να διατρέξουµε και να προσπελάσουµε µια λίστα αντικειµένων. Το πρότυπο Iterator κελυφοποιεί την εσωτερική υλοποίηση της λίστας ενώ ταυτόχρονα προσφέρει ένα στάνταρτ µηχανισµό για να διατρέχουµε τη λίστα. Εικόνα 9: Το πρότυπο Iterator Το πρότυπο Mediator Ένα πρόγραµµα αποτελείται από ένα σύνολο κλάσεων, οι οποίες µοιράζονται την λογική και τους υπολογισµούς που οφείλει να εκτελέσει το σύστηµα. Για την υλοποίηση της συµπεριφοράς που τους έχει ανατεθεί οι κλάσεις χρειάζεται να γνωρίζουν την 22

συµπεριφορά άλλων κλάσεων του συστήµατος. Όσο το σύστηµα γίνεται µεγαλύτερο, τόσο πιο δύσκολο και πιο πολύπλοκο γίνεται να γνωρίζουν οι κλάσεις αυτή τη συµπεριφορά. Επιπλέον, η συντήρηση του συστήµατος γίνεται πολύπλοκη καθώς αυξάνει ο αριθµός των εξαρτήσεων και των αλληλεπιδράσεων µεταξύ των κλάσεων. Το πρότυπο Mediator (µεσολαβητής) λύνει αυτό το πρόβληµα µε την προαγωγή της χαλαρότερης σύνδεσης (loose coupling) µεταξύ των κλάσεων. Οι Mediators επιτυγχάνουν αυτό το στόχο µε το να έχουν αναλυτική γνώση της συµπεριφοράς, της λογικής και των υπευθυνοτήτων της κάθε κλάσης του συστήµατος. Οι κλάσεις ενηµερώνουν το Mediator για οποιαδήποτε αλλαγή έχει συµβεί και ο Mediator µε τη σειρά του ενηµερώνει τις κλάσεις για τις αλλαγές που έχουν συµβεί και πρέπει να γνωρίζουν. Το πρότυπο Memento Η προσπέλαση των δεδοµένων ενός αντικειµένου γίνεται µε τη χρήση των public µεθόδων του. Στην περίπτωση που κάποιος θα ήθελε να αποθηκεύσει την εσωτερική κατάσταση ενός αντικειµένου, θα έπρεπε κάνοντας χρήση των public µεθόδων του αντικειµένου, να διαβάσει όλα τα δεδοµένα του αντικειµένου και στην συνέχεια να τα αποθηκεύσει. Όµως στη γενική περίπτωση αυτό δεν είναι εφικτό λόγω του γεγονότος ότι τα αντικείµενα δεν εκθέτουν όλα τα δεδοµένα τους µέσω public µεθόδων αφού στον αντικειµενοστρεφή τρόπο ανάπτυξης η κελυφοποίηση θεωρείται καλή τεχνική. Από την άλλη πλευρά, η λειτουργικότητα της αποθήκευσης των δεδοµένων ενός αντικειµένου και της µετέπειτα αποκατάστασής αυτών είναι επιθυµητή σε πληθώρα συστηµάτων (π.χ. λειτουργικότητα undo). Το πρότυπο memento προσπαθεί να λύσει αυτό το πρόβληµα µε τη δηµιουργία προνοµίων πρόσβασης στην εσωτερική κατάσταση του αντικειµένου που θέλουµε να αποθηκεύσουµε. Σύµφωνα µε το πρότυπο memento έχουµε τρεις ρόλους για τα αντικείµενα: 1. Ο ρόλος originator. Είναι το αντικείµενο του οποίου θέλουµε να αποθηκεύσουµε τα δεδοµένα. 2. Ο ρόλος memento. Είναι το αντικείµενο που αποθηκεύει την κατάσταση του originator και 23

3. Ο επιστάτης (caretaker) που διαχειρίζεται το συγχρονισµό των γεγονότων της αποθήκευσης και της ανακατασκευής. Οι τρεις παραπάνω ρόλοι παρουσιάζονται στην παρακάτω εικόνα. Εικόνα 10: Το πρότυπο memento Το πρότυπο Observer Τα σηµερινά συστήµατα λειτουργούν σε σύνθετα παραθυρικά περιβάλλοντα όπου πολλές φορές είναι αναγκαίο να παρουσιάζουµε τα δεδοµένα ταυτόχρονα. Για παράδειγµα είναι πολύ συνηθισµένο να παρουσιάζουµε την τιµή µιας µετοχής τόσο αριθµητικά όσο και σε γράφηµα. Προφανώς όταν η τιµή της µετοχής αλλάζει το σύστηµα πρέπει να ενηµερώνει τόσο την αριθµητική τιµή όσο και το γράφηµα. Το πρόβληµα αυτό αντιµετωπίζεται από το πρότυπο Observer (παρατηρητής). Το πρότυπο Observer προϋποθέτει ότι το αντικείµενο που περιέχει τα δεδοµένα είναι διαφορετικό από το αντικείµενο που τα παρουσιάζει, και ότι τα αντικείµενα που παρουσιάζουν τα δεδοµένα είναι αυτά που παρατηρούν τις αλλαγές. Το πρότυπο State Το πρότυπο State αλλάζει τη συµπεριφορά ενός αντικειµένου όταν αλλάξει η κατάσταση του αντικειµένου. Το πρότυπο State χρησιµοποιείται όταν θέλουµε να έχουµε έναν εσωτερικό διακόπτη κλάσης µέσα σε ένα αντικείµενο και ανάλογα µε την εσωτερική κατάσταση του αντικειµένου να διαλέγουµε το είδος της κλάσης του. Το πρότυπο Strategy Το πρότυπο Strategy (στρατηγική) αποτελείται από ένα σύνολο σχετικών αλγορίθµων οι οποίοι κελυφοποιούνται µέσα σε µια κλάση οδηγό (driver) που ονοµάζεται πλαίσιο (context). Η εφαρµογή πελάτης (client) επιλέγει έναν από τους διαφορετικούς 24

αλγορίθµους προς εκτέλεση ή εναλλακτικά το πλαίσιο επιλέγει τον πλέον κατάλληλο. Ο στόχος του προτύπου Strategy είναι να µπορούµε να επιλέγουµε αλγόριθµο µεταξύ των διαθέσιµων αλγορίθµων Η διαφορά µεταξύ του πρότυπου state και του πρότυπου strategy είναι ότι στο πρότυπο state κελυφοποιούµε τις κλάσεις οι οποίες διαφέρουν ενώ στο πρότυπο strategy κελυφοποιούµε τους αλγορίθµους που διαφέρουν. Το πρότυπο strategy χρησιµοποιείται από εφαρµογές που απαιτούν µια ιδιαίτερη υπηρεσία ή µια λειτουργία η οποία έχει διάφορες παραλλαγές. Η επιλογή του κατάλληλου αλγορίθµου προς εκτέλεση γίνεται αυτόµατα από το σύστηµα ή από τον ενδιαφερόµενο χρήστη. Επιπλέον, ο αριθµός των διαθέσιµων στρατηγικών-αλγορίθµων είναι δυνατόν να µεταβάλλεται χρονικά. Το πρότυπο strategy είναι χρήσιµο σε πολλές περιπτώσεις όπως:: στην αποθήκευση των αρχείων µε διαφορετικό format στην συµπίεση αρχείων χρησιµοποιώντας διαφορετικούς αλγορίθµους στην καταγραφή video χρησιµοποιώντας τα διαφορετικά πρότυπα συµπίεσης στην σχεδίαση δεδοµένων µε διαφορετικούς τρόπους κ.λπ. Το πρότυπο Template Method Το πρότυπο Template Method είναι ίσως το πιο χρησιµοποιηµένο πρότυπο. Χρησιµοποιείται για να περιγράψει το σκελετό ενός αλγορίθµου, αφήνοντας την υλοποίηση του αλγορίθµου στις υποκλάσεις. Το βασικό πλεονέκτηµα της χρήσης του προτύπου είναι η αλλαγή του κώδικα της εφαρµογής χωρίς να χρειαστεί να αλλάξει η δοµή του συστήµατος. Επιπλέον, το πρότυπο είναι ιδιαίτερα χρήσιµο για το διαχωρισµό της µεταβαλλόµενης από την αµετάβλητη συµπεριφορά του συστήµατος. Η αµετάβλητη συµπεριφορά τοποθετείται στην αφηρηµένη κλάση (στο template) ενώ η µεταβαλλόµενη συµπεριφορά τοποθετείται στις υποκλάσεις. 25

Εικόνα 11: Το πρότυπο Template Method. Στην παραπάνω εικόνα η αφηρηµένη κλάση AbstractClass ορίζει δύο µεθόδους PrimitiveOperation1() και PrimitiveOperation2(). Η συγκεκριµένη κλάση ConcreteClass υλοποιεί τις µεθόδους PrimitiveOperation1() και PrimitiveOperation2() εισάγοντας λεπτοµέρειες. Η µέθοδος TemplateMethod() της αφηρηµένης κλάσης ορίζει το σκελετό του αλγορίθµου, ο οποίος απλά καλεί τις κλάσεις PrimitiveOperation1() και PrimitiveOperation2(). Το πρότυπο Visitor Ο σκοπός του προτύπου Visitor είναι να κελυφοποιήσει τις λειτουργίες που θέλουµε να εκτελέσουµε πάνω σε µια δοµή δεδοµένων. Με τον τρόπο αυτό µπορούµε να αλλάξουµε τον τρόπο µε τον οποίο διαχειριζόµαστε τα δεδοµένα χωρίς να χρειαστεί να αλλάξουµε τις κλάσεις που χρησιµοποιούν τα δεδοµένα. Έτσι µε τη χρήση του προτύπου visitor µπορούµε να διαχωρίσουµε τις κλάσεις που περιέχουν τα δεδοµένα και τις δοµές δεδοµένων από τις κλάσεις που περιέχουν τους αλγορίθµους για τη διαχείριση των δεδοµένων. 26

4 Η Περιγραφή ενός προτύπου Υπάρχουν πολλοί τρόποι για να περιγράψει κανείς ένα πρότυπο. Οι Alexander, Gamma και Buschmann προτείνουν τα δικά τους σχήµατα περιγραφή τα οποία ονοµάζονται Αλεξανδριανό ή κανονικό, σχήµα GoF και σχήµα POSA αντίστοιχα. Τα σχήµατα περιγραφής προτύπων είναι σε γενικές γραµµές παρόµοια. Το παρακάτω είναι το σχήµα περιγραφής προτύπων GoF το οποίο περιγράφει τα ακόλουθα: Όνοµα και Ταξινόµηση Κάθε πρότυπο πρέπει να έχει ένα όνοµα µε σηµασία. Το όνοµα πρέπει να δίνεται µε τέτοιο τρόπο έτσι να µπορεί να χρησιµοποιείται εύκολα όταν συζητούµε για αυτό και να µην χρειάζεται να το περιγράψουµε περιφραστικά. Σκοπός Είναι µια σύντοµη περιγραφή του προβλήµατος που λύνει το πρότυπο και του σκοπού για τον οποίο φτιάχτηκε. Συνώνυµα Το κάθε πρότυπο µπορεί να είναι γνωστό µε διάφορα εναλλακτικά ονόµατα τα οποία και περιγράφονται στο σηµείο αυτό. Κίνητρο Το κίνητρο, το σενάριο µε το οποίο καταδεικνύουµε τη χρησιµότητα του προτύπου. Εφαρµοσιµότητα Οι περιπτώσεις για τις οποίες το πρότυπο είναι κατάλληλο οµή Η δοµή του προτύπου δίνεται σε µια αντικειµενοστρεφή γλώσσα µοντελοποίησης. Αρχικά τα πρότυπα GoF περιγράφηκαν µε τη χρήση της ΟΜΤ (Object Modeling Technique) αλλά πλέον µπορεί κανείς να τα συναντήσει στη διεθνή βιβλιογραφία και σε γλώσσα UML. Συµµετέχοντες (Participants) Οι κλάσεις ή/και τα αντικείµενα που συµµετέχουν στο πρότυπο καθώς και οι υπευθυνότητές τους. 27

Συνεργασίες (Collaborations) Πώς οι συµµετέχοντες συνεργάζονται για να υλοποιήσουν τις υπευθυνότητές τους. Συνέπειες Πως τελικά το πρότυπο ικανοποιεί τους στόχους του. Στο σηµείο αυτό αναφέρονται οι παραδοχές που έγιναν καθώς και οι περιορισµοί στους οποίους υπόκειται το πρότυπο. Υλοποίηση Τεχνικές, συµβουλές σχετικές µε το πρότυπο χρήσιµες για την υλοποίηση του προτύπου στο σύστηµα. Παραδειγµατικός κώδικας Τµήµατα του κώδικα που παρουσιάζουν µε µορφή παραδείγµατος την υλοποίηση του προτύπου Γνωστές χρήσεις Τρόποι µε τους οποίους έχει ήδη χρησιµοποιηθεί το πρότυπο Σχετικά Πρότυπα Πρότυπα µε άµεση σχέση µε το παρών πρότυπο. Ποιες είναι οι οµοιότητες και ποιες οι διαφορές από άλλα παρόµοια πρότυπα. 28

5 Τα ποιοτικά χαρακτηριστικά ενός προτύπου Ένα πρότυπο αποτελεί µια επαναχρησιµοποιούµενη µονάδα λογισµικού. Εποµένως είναι ιδιαίτερα σηµαντικό να είναι υψηλής ποιότητας. Τα βασικά ποιοτικά χαρακτηριστικά ενός προτύπου είναι τα ακόλουθα: Κελυφοποίηση (Encapsulation) και Αφαίρεση (Abstraction) Κάθε πρότυπο κελυφοποιεί ένα καλά καθορισµένο πρόβληµα και παρουσιάζει µια σαφή λύση σε ένα συγκεκριµένο χώρο αναφοράς. Τα πρότυπα πρέπει να έχουν ένα σαφές περίγραµµα έτσι ώστε τόσο το πρόβληµα όσο και η λύση του να είναι ξεκάθαρες. Επίσης υλοποιούν αφαιρέσεις, που ενσωµατώνουν τη γνώση και την εµπειρία διαφορετικών περιοχών εφαρµογής. Τέλος, εµφανίζονται σε ποικίλα ιεραρχικά επίπεδα εννοιολογικής λεπτοµέρειας. Ανοικτό και ευµετάβλητο Κάθε πρότυπο πρέπει να είναι ανοικτό για επεκτάσεις και παραµετροποίηση από άλλα πρότυπα έτσι ώστε να µπορεί να συνδυασθεί στη λύση ενός µεγαλύτερου προβλήµατος. Επιπλέον, το κάθε πρότυπο πρέπει να µπορεί να επιδέχεται απεριόριστο αριθµό διαφορετικών υλοποιήσεων µόνο του ή σε συνδυασµό µε άλλα. Συνθεσιµότητα και γενικευσιµότητα Αν και οι όροι συνθεσιµότητα και γενικευσιµότητα δεν είναι δόκιµοι στην Ελληνική γλώσσα η ιδέα πίσω από αυτές τις λέξεις είναι η δυνατότητα των προτύπων που έχουν ήδη εφαρµοσθεί να αποτελούν τη βάση για εφαρµογή και άλλων προτύπων σε πιο υψηλό επίπεδο. Βέβαια η συµπεριφορά των προτύπων δεν είναι γραµµική και οµοιόµορφη αλλά εξαρτάται από το πεδίο εφαρµογής, πράγµα που σηµαίνει ότι νέοι τρόποι συνδυασµού τους παράγουν και νέες συµπεριφορές. Ισορροπία Κάθε πρότυπο πρέπει να ισορροπήσει µεταξύ των δυνατοτήτων του και των περιορισµών του. Μερικές πρακτικές συµβουλές για τα πρότυπα είναι: Η αρχή της ελάχιστης έκπληξης: Το πρότυπο δεν πρέπει να δηµιουργεί έκπληξη και απορία στον αναγνώστη. 29

Το πρότυπο πρέπει να εφαρµόζει την αρχή 80-20, που λέει ότι σε ένα σύστηµα στο 80% του χρόνου εκτελείται µόνο το 20% του κώδικα, ή µε απλά λόγια ότι οι συνηθισµένες λειτουργίες πρέπει να είναι πολύ απλές ενώ οι δύσκολες να είναι απλά εφαρµόσιµες. Μόνο οι απαραίτητοι κανόνες. Όσους περισσότερους κανόνες εισάγουµε τόσο αυξάνουµε την πολυπλοκότητα και δυσκολία της εφαρµογής. Ο κανόνας Demeter. Μια κλάση πρέπει να αναφέρεται στα δεδοµένα της και στις µεθόδους της και όσο το δυνατόν λιγότερο σε άλλες κλάσεις. Ο σχεδιασµός του συστήµατος τελειώνει όταν δεν µπορούµε να αφαιρέσουµε τίποτε άλλο από αυτόν. Η απλότητα είναι πιο σηµαντική από τη γενικότητα. Κάθε κλάση υλοποιεί µια αφαίρεση και κάθε αφαίρεση περιγράφεται από µια κλάση (ισοµορφισµός) Ο στόχος είναι ότι, κάθε καλό πρότυπο περιγράφει ένα σύνολο που είναι µεγαλύτερο από τα µέρη που το απαρτίζουν, λόγω των συνδυασµών των κλάσεων και του τρόπου που λειτουργούν όλες µαζί έτσι ώστε να υλοποιήσουν τους στόχους του προτύπου. 30

6 Συµπεράσµατα Όλες οι ώριµες ειδικότητες της µηχανικής βασίζονται εκτός από τις επιστηµονικές θεωρίες και τα µαθηµατικά µοντέλα σε ένα σύνολο καλών πρακτικών και εφαρµοσµένων διαδικασιών για την επίλυση των γνωστών και συνηθισµένων προβληµάτων. Οι έµπειροι µηχανικοί δεν σχεδιάζουν τα προϊόντα τους µόνο σύµφωνα µε τις αυστηρές αρχές των µαθηµατικών και της επιστήµης, αλλά πρέπει να λάβουν υπόψη τους ένα σύνολο παραγόντων που επιδρούν σε ένα σύγχρονο ανταγωνιστικό περιβάλλον Οι παράγοντες αυτοί περιλαµβάνουν την ταχύτητα παράδοσης του προϊόντος, το κόστος, την ποιότητα, τις ανάγκες των πελατών κ.λπ. Τα πρότυπα σχεδιασµού βοηθούν προς αυτή την κατεύθυνση, ειδικά στην µηχανική λογισµικού η οποία είναι και από τις νεότερες κατευθύνσεις της µηχανικής µε το να ορίσουν ποιες λύσεις είναι ήδη γνωστές και έχουν εφαρµοσθεί κατ επανάληψη και ποιες όχι. Τα πρότυπα αναπαριστούν συµπυκνωµένη εµπειρία πολλών µηχανικών λογισµικού δοκιµασµένη σε µεγάλο αριθµό συστηµάτων. Βοηθούν στο να σφυρηλατήσουµε το όραµα µιας κοινής αρχιτεκτονικής κατεύθυνσης και των κοινών βασικών δοµών οι οποίες θα βοηθήσουν στην ωρίµαση της µηχανικής λογισµικού Εάν µια λύση µπορεί να εκφρασθεί σε µορφή προτύπων, τότε µπορεί να εφαρµοστεί και σε άλλες περιπτώσεις συστηµάτων, και διευκολύνει την επαναχρησιµοποίηση αυτής σε ολόκληρο φάσµα των παραδοτέων της µηχανικής λογισµικού. Επιπλέον τα πρότυπα είναι ένα βασικό εργαλείο για την αναπαράσταση και την επικοινωνία της γνώσης και της εµπειρίας µεταξύ της κοινότητας των µηχανικών λογισµικού. Εκτός από το γεγονός ότι τα πρότυπα κελυφοποιούν τη γνώση δηµιουργούν και ένα κοινό λεξιλόγιο για τους µηχανικούς πράγµα το οποίο διευκολύνει σε µεγάλο βαθµό την επικοινωνία, ενώ ταυτόχρονα βελτιώνουν την τεκµηρίωση των συστηµάτων λογισµικού. Είναι βέβαιο ότι τα πρότυπα θα συνεχίσουν να επηρεάζουν σε µεγάλο βαθµό τη τεχνολογία λογισµικού και τα επόµενα χρόνια µια και περιέχουν πολύτιµη γνώση που αποκτήθηκε από τους ειδικούς του χώρου σε µια µεγάλη χρονική περίοδο. 31

7 Βιβλιογραφία 1. Christopher Alexander, Sara Ishikawa, Murray Silverstein, Max Jacobson, Ingrid Fiksdahl-King, and Shlomo Angel., A Pattern Language, Oxford University Press, 1977. 2. Christopher Alexander, The Timeless Way of Building, Oxford University Press, 1979. 3. Grady Booch, James Rumbaugh, Ivar Jacobson: The Unified Modeling Language User Guide. Addison-Wesley Longman, 1999. 4. Martin Fowler, UML Distilled, Addison-Wesley, 2000. 5. Michael Jesse Chonoles and James A. Schardt, UML 2 for Dummies, Hungry Minds, 2003 6. Floyd Marinescu, EJB Design Patterns, John Willey & Sons, Inc., 2002. 7. Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Design Patterns, Addison-Wesley, 1994 8. Graig Larman, Applying UML and Patterns, Prentice Hall, 2001. 9. Bruce Eckel, Thinking in Patterns, ιαθέσιµο στο http://www.mindview.net 10. James O. Coplien, Software Patterns, ιαθέσιµο στο http://hillside.net/patterns/definition.html 11. Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, Michael Stal, Peter Sommerlad, Michael Stal, Pattern-Oriented Software Architecture, Volume 1: A System of Patterns, John Wiley & Sons; 1996 12. James Cooper, The Design Patterns Java Companion, Addison Wesley Design Patterns Series, 1998. Η εικόνα των προτύπων GoF στο εξώφυλλο προέρχεται από τον δικτυακό ιστοχώρο http://home.earthlink.net/~huston2/dp/patterns.html και έχει φτιαχτεί από τον Guilherme Balena Versiani. 32