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

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

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

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

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

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

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

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

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Συστήματα Αυτομάτου Ελέγχου. Ενότητα Α: Γραμμικά Συστήματα

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

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

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

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

ΒΟΗΘΗΤΙΚΕΣ ΣΗΜΕΙΩΣΕΙΣ

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

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

4η ιάλεξη. UML ιαγράμματα αλληλεπίδρασης

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

ΔΙΔΑΣΚΩΝ: Δρ. Στυλιανός Τσίτσος

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

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

Εφαρμογή Υπολογιστικών Τεχνικών στην Γεωργία

ΑΝΟΙΧΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ. Λογισμός ΙΙ. Χρήστος Θ. Αναστασίου Τμήμα Μηχανικών Πληροφορικής ΤΕ

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

Προγραμματισμός Διαδικτύου

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

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

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

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

Λογιστικές Εφαρμογές Εργαστήριο

Λογιστική Κόστους Ενότητα 12: Λογισμός Κόστους (2)

Εισαγωγή στην Πληροφορική

ΣΤΑΤΙΣΤΙΚΗ ΕΠΙΧΕΙΡΗΣΕΩΝ

Τεχνολογίες & Εφαρμογές Πληροφορικής Ενότητα 1: Εισαγωγικό Μάθημα

Προγραμματισμός Διαδικτύου

Πληροφοριακά Συστήματα & Περιβάλλον Ασκήσεις

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Τεχνικό Σχέδιο

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα ΕΠΕΞΕΡΓΑΣΙΑ ΕΙΚΟΝΑΣ. Ενότητα 3: Αποκατάσταση Εικόνας.

ΑΝΑΛΥΣΗ ΧΡΗΜΑΤΟΟΙΚΟΝΟΜΙΚΩΝ ΚΑΤΑΣΤΑΣΕΩΝ

Αυτοματοποιημένη χαρτογραφία

Οντοκεντρικός Προγραμματισμός

Μοντελοποίηση Λογικών Κυκλωμάτων

Προγραμματισμός Διαδικτύου

Επικοινωνία Ανθρώπου- Υπολογιστή Σχεδίαση Αλληλεπίδρασης

Διαδικαστικός Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 2: Κλάσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Μηχανολογικό Σχέδιο Ι

Σχεδίαση με Ηλεκτρονικούς Υπολογιστές

Αλληλεπίδραση Ανθρώπου- Υπολογιστή & Ευχρηστία

Οντοκεντρικός Προγραμματισμός

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

Εκκλησιαστικό Δίκαιο. Ενότητα 10η: Ιερά Σύνοδος της Ιεραρχίας και Διαρκής Ιερά Σύνοδος Κυριάκος Κυριαζόπουλος Τμήμα Νομικής Α.Π.Θ.

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

ΜΑΘΗΜΑ: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

Εφαρμογές Συστημάτων Γεωγραφικών Πληροφοριών

Εφαρμογές Συστημάτων Γεωγραφικών Πληροφοριών

ΜΑΘΗΜΑ: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

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

Εισαγωγή στους Αλγορίθμους

ΜΑΘΗΜΑ: ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Υδραυλικά & Πνευματικά ΣΑΕ

Υπολογιστικά & Διακριτά Μαθηματικά

Εφαρμογή Υπολογιστικών Τεχνικών στην Γεωργία

Αλληλεπίδραση Ανθρώπου- Υπολογιστή & Ευχρηστία

Μεταγλωττιστές. Ενότητα 6: Λεκτική ανάλυση (Μέρος 2 ο ) Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Διδακτική της Πληροφορικής

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Τεχνικό Σχέδιο

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

Μεταγλωττιστές. Ενότητα 3: Τυπικές γλώσσες (Μέρος 2 ο ) Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Ιστορία της μετάφρασης

Εισαγωγή στην Διοίκηση Επιχειρήσεων

ΝΟΜΙΣΜΑΤΙΚΗ ΟΙΚΟΝΟΜΙΚΗ ΠΟΛΙΤΙΚΗ. Ενότητα 3: Αγορά Χρήματος και επιτόκια. Γεώργιος Μιχαλόπουλος Τμήμα Λογιστικής-Χρηματοοικονομικής

Προχωρημένα Θέματα Προγραμματισμού Δικτύων

Οδοποιία IΙ. Ενότητα 14: Υπόδειγμα σύνταξης τευχών θέματος Οδοποιίας. Γεώργιος Μίντσης ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ

Μικροβιολογία & Υγιεινή Τροφίμων

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι. Ενότητα 2: Μοντελο Συσχετίσεων Οντοτήτων, Μελέτη Περίπτωσης: Η βάση δεδομένων των CD

Σχεδιασμός Υπαιθρίων Εκμεταλλεύσεων

ΣΤΑΤΙΣΤΙΚΗ ΑΝΑΛΥΣΗ ΜΕ ΧΡΗΣΗ Η/Υ

Οργανωσιακή Συμπεριφορά Ενότητα 1: Η έννοια της οργάνωσης και διοίκησης

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Εισαγωγή στους Αλγορίθμους

Δομημένος Προγραμματισμός

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

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

ΑΣΦΑΛΕΙΑ & ΔΙΑΧΕΙΡΙΣΗ ΔΙΚΤΥΩΝ(Θ)

Πληροφορική. Εργαστηριακή Ενότητα 3 η : Επεξεργασία Κελιών Γραμμών & Στηλών. Ι. Ψαρομήλιγκος Τμήμα Λογιστικής & Χρηματοοικονομικής

Διδακτική Πληροφορικής

ΑΣΦΑΛΕΙΑ & ΔΙΑΧΕΙΡΙΣΗ ΔΙΚΤΥΩΝ(Θ)

Τεχνικό Τοπογραφικό Σχέδιο

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

Θεωρία Πιθανοτήτων & Στατιστική

Τεχνικό Τοπογραφικό Σχέδιο

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Πληροφορική. Εργαστηριακή Ενότητα 8 η : Γραφήματα

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύ

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

Transcript:

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

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

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. ΒΙΟΜΗΧΑΝΙΚΗ ΠΛΗΡΟΦΟΡΙΚΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ 2

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Κεντρικής Μακεδονίας» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. ΒΙΟΜΗΧΑΝΙΚΗ ΠΛΗΡΟΦΟΡΙΚΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ 3

Μοτίβα σχεδίασης Οι σχεδιαστές έχουν διαπιστώσει ότι συγκεκριμένα μοτίβα (patterns) εμφανίζονται διαρκώς κατά τη σχεδίαση προγραμμάτων Για αυτό έχουν αναπτύξει συγκεκριμένες λύσεις οι οποίες μπορούν να εφαρμοστούν όποτε αναγνωρίζεται ότι το πρόβλημα εντάσσεται σε ένα από τα γνωστά μοτίβα ανάπτυξης 2

Τι είναι τα μοτίβα σχεδίασης; Προσφέρουν λύσεις σε προβλήματα που συναντιούνται συχνά Είναι γενικά και μπορούν να εφαρμοσθούν σε πολλές περιπτώσεις Περιγράφουν τη μορφή του κώδικα και όχι τις λεπτομέρειες 3

Μοτίβα Σχεδίασης Υπάρχουν πολλά μοτίβα σχεδίασης αλλά αρχικά ορίσθηκαν 23 βασικά Κάθε μοτίβο έχει τουλάχιστον Ένα όνομα Ένα σκοπό για τον οποίο δημιουργήθηκε Μια περιγραφή του προβλήματος το οποίο προσπαθεί να λύσει 4

Κατηγορίες μοτίβων σχεδίασης ημιουργικά μοτίβα (Creational) Ποιος είναι ο καλύτερος τρόπος να φτιάχνεις αντικείμενα Abstract Factory, Factory, Prototype, Singleton Μοτίβα συμπεριφοράς (Behavioural) Επικοινωνία μεταξύ αντικειμένων Iterator, Visitor ομικά μοτίβα (Structural) Συνδυασμός ομάδων αντικειμένων Composite, Adaptor Παρακάτω θα παρουσιαστεί το Factory Pattern ως παράδειγμα μοτίβου 5

Παράδειγμα Γράφετε κώδικα και για Windows και για Unix. Πρέπει να γράψετε μια κλάση η οποία είναι υπεύθυνη για τη δημιουργία μιας σύνδεσης TCP Όμως η κλάση αυτή πρέπει να υλοποιεί διαφορετικά τη σύνδεση, αν πρόκειται για την υλοποίηση σε Windows και διαφορετικά αν πρόκειται για την υλοποίηση σε Unix 6

Χωρίς το Factory Pattern Ορίζετε δύο κλάσεις WindowsTcpConnection UnixTcpConnection 7

Χωρίς το Factory Pattern Και μέσα στον κώδικά σας, όποτε χρειάζεται να χρησιμοποιήσετε αυτήν την κλάση έχετε: if (platform == "Unix") { UnixTcpConnection connection; connection.connect(); } else if (platform == "Windows") { WindowsTcpConnection connection; connection.connect(); } // κ.τ.λ. 8

Χωρίς το Factory Pattern Αν αργότερα αποφασίσετε να προσθέσετε και μια υλοποίηση για Mac, τότε θα προσθέσετε μια κλάση MacTcpConnection και παντού θα πρέπει να προσθέσετε τον αντίστοιχο κώδικα 9

Χωρίς το Factory Pattern if (platform == "Unix") { UnixTcpConnection connection; connection.connect(); } else if (platform == "Windows") { WindowsTcpConnection connection; connection.connect(); } else if (platform == "Mac") { MacTcpConnection connection; connection.connect(); } // κ.τ.λ. 10

Χωρίς το Factory Pattern Τα πράγματα είναι ακόμα πιο δύσκολα αν αποφασίσετε να κρατάτε και μία λίστα με όλες τις ανοιχτές συνδέσεις σας. Σε αυτήν την περίπτωση θα πρέπει να γράψετε τον ακόλουθο κώδικα 11

vector<unixtcpconnection> unixtcpconnections; vector<windowstcpconnection> windowstcpconnections; if (platform == "Unix") { UnixTcpConnection connection; unixtcpconnections.add(connection); connection.connect(); } else if (platform == "Windows") { WindowsTcpConnection connection; windowstcpconnections.add(connection); connection.connect(); } // κ.τ.λ. 12

Προβλήματα Το κύριο πρόβλημα είναι ότι πρέπει να γράφετε τον κώδικά σας 2 φορές, μία για κάθε υλοποίηση. Αυτό τον κάνει πολύπλοκο, δυσανάγνωστο ενώ είναι εύκολο να γίνουν και λάθη 13

Με το Factory Pattern Χρησιμοποιώντας την κληρονομικότητα και τον πολυμορφισμό μπορούμε να καταφύγουμε σε μια λύση η οποία είναι αρκετά πιο κομψή Ορίζετε κλάσεις όπως στο ακόλουθο διάγραμμα 14

Με το Factory Pattern TCPConnection +connect() : bool +send(in data : string) : void +receive() : string +close() : void TCPConnectionFactory +getinstance() : TCPConnection WindowsTCPConnection +connect() : bool +send(in data : string) : void +receive() : string +close() : void UnixTCPConnection +connect() : bool +send(in data : string) : void +receive() : string +close() : void 15

Με το FactoryPattern H κλάση TcpConnection είναι abstract, δεν περιέχει υλοποίηση δηλαδή των μεθόδων connect(), send(), receive(), close(). Ορίζει ουσιαστικά τη διεπαφή επικοινωνίας με τις κλάσεις WindowsTcpConnection, UnixTcpConnection 16

Με το Factory Pattern H κλάση TcpConnectionFactory περιέχει μια μέθοδο getinstance η οποία μπορεί να οριστεί όπως παρακάτω: class TcpConnectionFactory { public: static TcpConnection &getinstance(string type) { if (type=="windows") { WindowsTcpConnection *connection = new WindowsTcpConnection(); return connection; } else { UnixTcpConnection *connection = new UnixTcpConnection(); return connection; } }; 17

Με το FactoryPattern Και πώς χρησιμοποιείται; Απλά: TcpConnection connection = TcpConnectionFactory::getInstance("Windows"); connection.connect(); 18

Με το Factory Pattern Αν θέλετε να κρατάτε και μια λίστα με όλες τις συνδέσεις σας; vector<tcpconnection> connections; TcpConnection connection = TcpConnectionFactory.getInstance("Windows "); connections.add(connection); connection.connect(); 19

Factory Pattern Σκοπός Ορίζει μια διεπαφή για τη δημιουργία αντικειμένων αλλά αφήνει τις υποκλάσεις να αποφασίσουν τι είδους αντικείμενο θα φτιάξουν Που μπορεί να χρησιμοποιηθεί Όταν χρειάζεται να δημιουργήσετε αντικείμενα κλάσεων που έχουν την ίδια διεπαφή (αλλά διαφορετική υλοποίηση) και δε γνωρίζετε τη συγκεκριμένη στιγμή τι είδους αντικείμενα θα χρειαστείτε 20

Μοτίβα σχεδίασης Τα περισσότερα μοτίβα σχεδίασης στηρίζονται σε έξυπνη χρήση Της κληρονομικότητας Του πολυμορφισμού Της περιεκτικότητας 21