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

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

. Μεθοδολογία Προγραμματισμού. Abstract Κλάσεις και Interfaces. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

. Μεθοδολογία Προγραμματισμού. Abstract Κλάσεις και Interfaces. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

Μεθοδολογία Προγραμματισμού

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

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

Θέµατα εξετάσεων µε απαντήσεις

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

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

Θέματα εξετάσεων. Τύπος: B

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

Προγραμματισμός ΙI (Θ)

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

. Μεθοδολογία Προγραμματισμού. UML Διαγράμματα. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

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

Οδηγίες Συγγραφής και Αξιολόγησης Εργασιών του μαθήματος

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Διαδικαστικά

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

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

'Ασκηση 1: Στατικός Κατακερματισμός. Εισαγωγή. Ρουτίνες υλοποίησης κατακερματισμού. (Ημερομηνία Παράδοσης: Παρασκευή, 16/5/2008, 5μμ) HT_Init()

Από τη UML στον Κώδικα. Μέρος Β

LATEX Site 2750 & Documents Class LATEX WYSIWYG

Ειδικά Θέματα Προγραμματισμού

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #15

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

11β Δομικά πρότυπα σχεδίασης

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ Π ΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ Π ΕΡΙΒΑΛΛΟΝ

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον Λύσεις Θεμάτων Επαναληπτικών Εξετάσεων Ενιαίου Λυκείου 2006

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #13

Σκοπός του μαθήματος

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

Προγραμματισμός ΙI (Θ)

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

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

Διορθώσεις σελ

Αρχές Προγραμματισμού Η/Υ Μέθοδοι παρουσίασης του αλγόριθμου και Βασικές έννοιες

K15 Ψηφιακή Λογική Σχεδίαση 7-8: Ανάλυση και σύνθεση συνδυαστικών λογικών κυκλωμάτων

Το λειτουργικό σύστημα. Προγραμματισμός II 1

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ. Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής

Υπολογισμός - Συλλογή Δεδομένων - Πίνακες

ΑΦAΙΡΕΤΙΚΟΣ (ή ΑΦΗΡΗΜΕΝΟΣ) ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT) - σύνολο δεδομένων (data, objects) - σύνολο πράξεων στα δεδομένα

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

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

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

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

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

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής T.E.I. ΘΕΣΣΑΛΟΝΙΚΗΣ


Εισ. Στην ΠΛΗΡΟΦΟΡΙΚΗ. Διάλεξη 4 η. Βασίλης Στεφανής

ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT)

Διαφορές single-processor αρχιτεκτονικών και SoCs

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

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

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1

A. Να γράψετε τον αριθμό της κάθε μιας από τις παρακάτω προτάσεις και δίπλα. το γράμμα Σ, εάν είναι σωστή, ή το γράμμα Λ, εάν είναι λανθασμένη.

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

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

ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΑΡΧΕΣ ΤΗΣ ΕΠΙΣΤΗΜΗΣ ΤΩΝ Η/Υ

ΑΝΙΧΝΕΥΣΗ ΠΡΟΤΥΠΩΝ ΣΧΕΔΙΑΣΗΣ ΣΕ ΛΟΓΙΣΜΙΚΟ ΑΝΟΙΧΤΟ ΚΩΔΙΚΑ ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ ΓΚΟΥΝΤΙΝΑΣ ΛΑΖΑΡΟΣ(ΑΜ:708) ΕΠΙΒΛΕΠΩΝ : ΑΛΕΞΑΝΔΡΟΣ ΛΑΖΑΡΙΔΗΣ

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Μέθοδοι. Υποσυστήµατα και πακέτα. Μοντέλα αντικειµενοστραφούς σχεδίασης. Αντικειµενοστραφής Σχεδίαση. Στα πρώτα στάδια της ανάλυσης

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

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

x < y ή x = y ή y < x.

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

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Μαλούτα Θεανώ Σελίδα 1

Με τι ασχολείται ο αντικειμενοστραφής προγραμματισμός

Μεταβλητές τύπου χαρακτήρα

8 Τεχνικός Εφαρμογών Πληροφορικής με Πολυμέσα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Ειδικά Θέματα Προγραμματισμού

Από τη UML στον Κώδικα. Μέρος Α

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

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

App Inventor 3ο Μάθημα (Ζάρια - επέκταση)

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

Δομημένος Προγραμματισμός (ΤΛ1006)

10. Με πόσους και ποιους τρόπους μπορεί να αναπαρασταθεί ένα πρόβλημα; 11. Περιγράψτε τα τρία στάδια αντιμετώπισης ενός προβλήματος.

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

Εργαστήριο Τεχνολογίας Λογισμικού και Ανάλυσης Συστημάτων

Εισαγωγή στην επανάληψη

Κεφάλαιο 7: Υλοποίηση εφαρμογών σε προγραμματιστικά περιβάλλοντα. Εφαρμογές Πληροφορικής Κεφ. 7 Καραμαούνας Πολύκαρπος 1

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

Master Mind εφαρμογή στη γλώσσα προγραμματισμού C

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

ΠΡΟΣΟΧΗ: Οι απαντήσεις πολλαπλής επιλογής µόνο πάνω στο ΦΥΛΛΟ ΑΠΑΝΤΗΣΕΩΝ

τις αναδρομικές ακολουθίες (recursive sequences) στις οποίες ορίζαμε

Εργαλεία CASE. Computer Assisted Systems Engineering. Δρ Βαγγελιώ Καβακλή. Τμήμα Πολιτισμικής Τεχνολογίας και Επικοινωνίας Πανεπιστήμιο Αιγαίου

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

ΚΕΦΑΛΑΙΟ 10 ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

Transcript:

.. Μεθοδολογία Προγραμματισμού Μοτίβα σχεδίασης (Design Patterns) Νικόλαος Πεταλίδης Τμήμα Μηχανικών Η/Υ ΤΕΙ Κεντρικής Μακεδονίας Εισαγωγή Εαρινό Εξάμηνο 2014 Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 1 / 40

Μοτίβα σχεδίασης Οι σχεδιαστές έχουν διαπιστώσει ότι συγκεκριμένα μοτίβα (patterns) εμφανίζονται διαρκώς κατά τη σχεδίαση προγραμμάτων Για αυτό έχουν αναπτύξει συγκεκριμένες λύσεις οι οποίες μπορούν να εφαρμοστούν όποτε αναγνωρίζεται ότι το πρόβλημα εντάσσεται σε ένα από τα γνωστά μοτίβα ανάπτυξης Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 2 / 40

Τι είναι ένα μοτίβο σχεδίασης Δίνουν έμφαση στη δομή του συστήματος ανεξάρτητα από το πως μεταβάλλεται στο χρόνο Ένα προγραμματιστικό μοτίβο που παρουσιάζεται συχνά Γενικό: μπορεί να εφαρμοσθεί σε πολλές περιπτώσεις Περιγράφει τη μορφή του κώδικα και όχι τις λεπτομέρειες Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 3 / 40

Πόσα είναι τα μοτίβα σχεδίασης Υπάρχουν εκατοντάδες μοτίβα σχεδίασης αλλά αρχικά ορίσθηκαν 23 βασικά Κάθε μοτίβο έχει τουλάχιστον Ένα όνομα Ένα σκοπό για τον οποίο δημιουργήθηκε Σύζευξη δεδομένων Μια περιγραφή του προβλήματος το οποίο προσπαθεί να λύσει Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 4 / 40

Κατηγορίες μοτίβων σχεδίασης Δημιουργικά Ποιος είναι ο καλύτερος τρόπος να φτιάχνεις αντικείμενα. Συμπεριφοράς Επικοινωνία μεταξύ αντικειμένων Δομικά Συνδυασμός ομάδων αντικειμένων Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 5 / 40

Παραδείγματα μοτίβων σχεδίασης Δημιουργικά Abstract Factory, Factory, Prototype, Singleton Συμπεριφοράς Iterator, Visitor Δομικά Composite, Adaptor Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 6 / 40

Factory Pattern Έχετε ένα αντικείμενο το οποίο πρέπει να επεξεργαστεί δεδομένα που μπορεί να αναπαριστώνται με διαφορετικό τρόπο. Για παράδειγμα σε μια φόρμα ο χρήστης μπορεί να δώσει τα στοιχεία του είτε ως Επίθετο, Όνομα είτε ως Όνομα Επίθετο Θέλετε πρόσβαση στο επίθετο και το όνομα μέσα από τις μεθόδους μιας κλάσης και δε θέλετε να γεμίσετε το πρόγραμμα σας με if statements Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 7 / 40

Factory Pattern Φτιάχνετε μια βασική κλάση Χ και δύο κλάσεις ΧΨ, ΧΖ που κληρονομούν τη Χ Λόγω κληρονομικότητας όμως εσείς μπορείτε να χρησιμοποιήσετε είτε τη ΧΨ είτε τη ΧΖ σα να ήταν η Χ Φτιάχνετε μια κλάση Factory η οποία επιστρέφει πάντα την κατάλληλη κλάση ΧΨ ή ΧΖ Αποτέλεσμα: Στον κώδικά σας απλά έχετε μια κλήση στη Factory και χειρίζεστε το αποτέλεσμα σα να ήταν η κλάση Χ ανεξάρτητα από τα δεδομένα που περάσατε. Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 8 / 40

Σχέδιο Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 9 / 40

Παράδειγμα Γράφετε κώδικα και για Windows και για Unix. Πρέπει να γράψετε μια κλάση η οποία είναι υπεύθυνη για τη δημιουργία μιας σύνδεσης TCP Όμως η κλάση αυτή πρέπει να υλοποιεί διαφορετικά τη σύνδεση, αν πρόκειται για την υλοποίηση σε Windows και διαφορετικά αν πρόκειται για την υλοποίηση σε Unix Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 10 / 40

Χωρίς το Factory Pattern Ορίζετε δύο κλάσεις: WindowsTcpConnection, UnixTcpConnection Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 11 / 40

Χωρίς το Factory Pattern Και μέσα στον κώδικά σας, όποτε χρειάζεται να χρησιμοποιήσετε αυτήν την κλάση έχετε: i f ( p l a t f o r m. e q u a l s ( " U n i x " ) ) { U n i x T c p C o n n e c t i o n c o n n e c t i o n = new U n i x T c p C o n n e c t i o n ( ) ; c o n n e c t i o n. c o n n e c t ( ) ; } e l s e i f ( p l a t f o r m. e q u a l s ( " Windows " ) ) { W i n d o w s T c p C o n n e c t i o n c o n n e c t i o n = new W i n d o w s T c p C o n n e c t i o n ( ) ; c o n n e c t i o n. c o n n e c t ( ) ; } Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 12 / 40

Χωρίς το Factory Pattern Αν αργότερα αποφασίσετε να προσθέσετε και μια υλοποίηση για Mac, τότε θα προσθέσετε μια κλάση MacTcpConnection και παντού θα πρέπει να προσθέσετε τον αντίστοιχο κώδικα Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 13 / 40

Χωρίς το Factory Pattern i f ( p l a t f o r m. e q u a l s ( " U n i x " ) ) { U n i x T c p C o n n e c t i o n c o n n e c t i o n = new U n i x T c p C o n n e c t i o n ( ) ; c o n n e c t i o n. c o n n e c t ( ) ; } e l s e i f ( p l a t f o r m. e q u a l s ( " Windows " ) ) { W i n d o w s T c p C o n n e c t i o n c o n n e c t i o n = new W i n d o w s T c p C o n n e c t i o n ( ) ; c o n n e c t i o n. c o n n e c t ( ) ; } e l s e i f ( p l a t f o r m. e q u a l s ( " Mac " ) ) { M a c T c p C o n n e c t i o n c o n n e c t i o n = new M a c T c p C o n n e c t i o n ( ) ; c o n n e c t i o n. c o n n e c t ( ) ; } Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 14 / 40

Χωρίς το Factory Pattern Τα πράγματα είναι ακόμα πιο δύσκολα αν αποφασίσετε να κρατάτε και μία λίστα με όλες τις ανοιχτές συνδέσεις σας. Σε αυτήν την περίπτωση θα πρέπει να γράψετε τον ακόλουθο κώδικα Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 15 / 40

Χωρίς το Factory Pattern L i s t < U n i x T c p C o n n e c t i o n > u n i x T c p C o n n e c t i o n s = new A r r a y L i s t < > ( ) ; L i s t < W i n d o w s T c p C o n n e c t i o n > w i n d o w s T c p C o n n e c t i o n s = new A r r a y L i s t < > ( ) ; i f ( p l a t f o r m. e q u a l s ( " U n i x " ) ) { U n i x T c p C o n n e c t i o n c o n n e c t i o n = new U n i x T c p C o n n e c t i o n ( ) ; u n i x T c p C o n n e c t i o n s. add ( c o n n e c t i o n ) ; c o n n e c t i o n. c o n n e c t ( ) ; } e l s e i f ( p l a t f o r m. e q u a l s ( " Windows " ) ) { W i n d o w s T c p C o n n e c t i o n c o n n e c t i o n = new W i n d o w s T c p C o n n e c t i o n ( ) ; w i n d o w s T c p C o n n e c t i o n s. add ( c o n n e c t i o n ) ; c o n n e c t i o n. c o n n e c t ( ) ; } Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 16 / 40

Προβλήματα Το κύριο πρόβλημα είναι ότι πρέπει να γράφετε τον κώδικά σας 2 φορές, μία για κάθε υλοποίηση. Αυτό τον κάνει πολύπλοκο, δυσανάγνωστο ενώ είναι εύκολο να γίνουν και λάθη Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 17 / 40

Με το Factory Pattern Ορίζεται κλάσεις όπως στο ακόλουθο διάγραμμα: Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 18 / 40

Με το FactoryPattern H TcpConnection είναι interface, δεν περιέχει υλοποίηση δηλαδή των μεθόδων connect(), send(), receive(), close(). Ορίζει ουσιαστικά τη διεπαφή επικοινωνίας με τις κλάσεις WindowsTcpConnection UnixTcpConnection Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 19 / 40

Με το Factory Pattern H κλάση TcpConnectionFactory περιέχει μια μέθοδο getinstance() η οποία μπορεί να οριστεί όπως: c l a s s T c p C o n n e c t i o n F a c t o r y { p u b l i c s t a t i c T c p C o n n e c t i o n g e t I n s t a n c e ( S t r i n g t y p e ) T c p C o n n e c t i o n c o n n e c t i o n ; i f ( t y p e. e q u a l s ( " U n i x " ) ) { c o n n e c t i o n = new W i n d o w s T c p C o n n e c t i o n ( ) ; } e l s e { c o n n e c t i o n = new U n i x T c p C o n n e c t i o n ( ) ; } r e t u r n c o n n e c t i o n ; } Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 20 / 40

Με το FactoryPattern Και πώς χρησιμοποιείται; Απλά: T c p C o n n e c t i o n c o n n e c t i o n = T c p C o n n e c t i o n F a c t o r y. g e t I n s t a n c e ( " Windows " ) ; c o n n e c t i o n. c o n n e c t ( ) Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 21 / 40

Με το Factory Pattern Αν θέλετε να κρατάτε και μια λίστα με όλες τις συνδέσεις σας; L i s t < T c p C o n n e c t i o n > c o n n e c t i o n s = new A r r a y L i s t < > ( ) ; T c p C o n n e c t i o n c o n n e c t i o n = T c p C o n n e c t i o n F a c t o r y. g e t I n s t a n c e ( " Windows " ) ; c o n n e c t i o n s. add ( c o n n e c t i o n ) ; c o n n e c t i o n. c o n n e c t ( ) ; Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 22 / 40

Βελτιώσεις στη σχεδίαση του Factory Pattern Η προηγούμενη σχεδίαση απαιτούσε αλλαγή στο Factory όποτε θέλαμε να προσθέσουμε νέες κλάσεις Μπορούμε να σχεδιάσουμε το Factory χρησιμοποιώντας ένα χαρακτηριστικό της Java που ονομάζεται reflection Η ιδέα είναι να μπορούμε να επιτρέπουμε μια κλάση να εγγραφεί ως κομμάτι του Factory Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 23 / 40

c l a s s S o m e F a c t o r y { p r i v a t e HashMap < S t r i n g, C l a s s > a C l a s s M a p = new HashMap < > ( ) ; p u b l i c v o i d r e g i s t e r C l a s s ( S t r i n g name, C l a s s c l a s s ) { a C l a s s M a p. p u t ( p r o d u c t I D, p r o d u c t C l a s s ) ; } p u b l i c S o m e C l a s s c r e a t e C l a s s ( S t r i n g p r o d u c t I D ) { C l a s s a C l a s s = a C l a s s M a p. g e t ( p r o d u c t I D ) ; r e t u r n ( S o m e C l a s s ) a C l a s s. n e w I n s t a n c e ( ) ; } } Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 24 / 40

Singleton (Anti)Pattern Πολλές φορές θέλουμε μόνο ένα αντικείμενο από μια συγκεκριμένη τάξη σε ένα πρόγραμμα Παράδειγμα Μόνο ένα αντικείμενο της τάξης Connection Μόνο ένα αντικείμενο της τάξης Logger Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 25 / 40

Singleton vs Global variables Σε πολλές περιπτώσεις το Singleton χρησιμοποιείται (κακώς) σε περιπτώσεις όπου χρειάζεστε μια global variable. Το Singleton μπορεί να καταλήξει ως εύκολη λύση σε μια κακή σχεδίαση Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 26 / 40

Παράδειγμα υλοποίησης Singleton c l a s s M y S i n g l e t o n C l a s s { p u b l i c s t a t i c M y S i n g l e t o n C l a s s g e t I n s t a n c e ( ) { s t a t i c M y S i n g l e t o n C l a s s i n s t a n c e = new M y S i n g l e t o n C l a s s ; r e t u r n i n s t a n c e ; } / * * T h e r e can be o n l y one. * / p r i v a t e M y S i n g l e t o n C l a s s ( ) { } } Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 27 / 40

Singleton σε UML Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 28 / 40

Παράδειγμα Έστω ότι γράφετε ένα πρόγραμμα που πρέπει να έχει πρόσβαση στο πληκτρολόγιο. Για το σκοπό αυτό ορίζετε μια κλάση Keyboard την οποία και χρησιμοποιείται όταν θέλετε να διαβάσετε από εκεί. Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 29 / 40

Χωρίς το Singleton pattern c l a s s K e y b o a r d { p u b l i c : K e y b o a r d ( ) { / / i n i t i a l i s a t i o n t o c o n n e c t t o h a r d w a r e } c h a r g e t K e y s t r o k e ( ) { / / c o d e t o r e t u r n a s i n g l e k e y s t r o k e } } ; Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 30 / 40

Χωρίς το Singleton pattern Προφανώς πρέπει να υπάρχει μόνο μία κλάση Keyboard (υποθέτουμε ότι υπάρχει ένα πληκτρολόγιο) Πρέπει να εμποδίσουμε τη δημιουργία περισσοτέρων από μίας κλάσεων (σκεφτείτε τι θα γίνει αν κάνουμε αρχικοποίηση το hardware ενώ κάποιος άλλος περιμένει να διαβάσει ένα keystroke) Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 31 / 40

Χωρίς το Singleton pattern Η μόνη λύση που έχουμε αν δε χρησιμοποιήσουμε τον singleton pattern είναι μια γενική μεταβλητή K e y b o a r d k e y b o a r d ; και η ελπίδα ότι ο προγραμματιστής θα κάνει τους κατάλληλους ελέγχους όποτε χρησιμοποιεί την keyboard i f ( k e y b o a r d==n u l l ) { k e y b o a r d = new K e y b o a r d ( ) ; } k e y b o a r d. g e t K e y s t r o k e ( ) ; Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 32 / 40

Με το singleton pattern Καταρχήν ορίζουμε την κλάση μας διαφορετικά: Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 33 / 40

Με το Singleton pattern c l a s s K e y b o a r d { p u b l i c : p u b l i c c h a r g e t K e y s t r o k e ( ) { / / r e t u r n s k e y s t r o k e } p u b l i c s t a t i c K e y b o a r d g e t I n s t a n c e ( ) { i f ( i n s t a n c e == n u l l ) { i n s t a n c e = new K e y b o a r d ( ) ; } r e t u r n i n s t a n c e ; } p r i v a t e K e y b o a r d ( ) { / / h a r d w a r e i n i t i a l i s a t i o n } p r i v a t e s t a t i c K e y b o a r d i n s t a n c e = n u l l ; } ; Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 34 / 40

Με το Singleton pattern Και η χρήση πλέον του Keyboard είναι απλή: k e y b o a r d = K e y b o a r d. g e t I n s t a n c e ( ) ; Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 35 / 40

Η υλοποίηση του Singleton στη Java Τα τελευταία χρόνια οι περισσότερες υλοποιήσεις του Singleton είναι με enum. Δείξτε μια υλοποίηση του Singleton με enum Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 36 / 40

Adapter (Wrapper) Pattern Ο Adapter Pattern χρησιμοποιείται για να αλλάξει τη διεπαφή μιας τάξης προκειμένου να φαίνεται συμβατή με κάποια άλλη Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 37 / 40

Παράδειγμα Το παράδειγμα της ουράς και της προσομοίωσης της με λίστα είναι το πιο διαδεδομένο. Στο παράδειγμα αυτό έχουμε υλοποίηση τη λίστα σε μια κλάση LinkedList αλλά θα θέλαμε και μια υλοποίηση ουράς Η λύση είναι να μη γράψουμε μια καινούργια κλάση αλλά Ορίζουμε ότι η CAQueue κληρονομεί από τη LinkedList και υλοποιεί τη διεπαφή μιας ουράς Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 38 / 40

Ο ορισμός της CAQueue c l a s s CAQueue <T> e x t e n d s L i n k e d L i s t <T> i m p l e m e n t s Queue { p u b l i c v o i d enqueue ( T s o m e t h i n g ) { s u p e r. add ( s o m e t h i n g ) ; } p u b l i c T dequeue ( ) { r e t u r n s u p e r. remove ( s i z e ( ) 1 ) ; } p u b l i c b o o l e a n i s E m p t y ( ) { r e t u r n s u p e r. i s E m p t y ( ) ; } ; Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 39 / 40

Η υλοποίηση της enqueue/dequeue Η προηγούμενη υλοποίηση που δείξαμε ήταν με κληρονομικότητα Δείξτε μια υλοποίηση του Adapter με περιεκτικότητα Ν. Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 40 / 40