ΠΡΟΤΥΠΑ ΣΧΕΔΙΑΣΗΣ. 6.1 Εισαγωγή

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "ΠΡΟΤΥΠΑ ΣΧΕΔΙΑΣΗΣ. 6.1 Εισαγωγή"

Transcript

1 ΠΡΟΤΥΠΑ ΣΧΕΔΙΑΣΗΣ 6.1 Εισαγωγή Τα προβλήματα που αντιμετωπίζει ένας προγραμματιστής κατά τη διάρκεια σχεδίασης και υλοποίησης ενός συστήματος λογισμικού, πολύ σπάνια εμφανίζονται για πρώτη φορά μόνο στο συγκεκριμένο έργο. Συνήθως πρόκειται για προβλήματα που έχουν παρουσιαστεί και αντιμετωπισθεί επιτυχώς σε προηγούμενα έργα λογισμικού από άλλους προγραμματιστές. Ωστόσο, η φύση του λογισμικού δίνει την αίσθηση ότι κάθε πρόβλημα έχει τα δικά του ιδιαίτερα χαρακτηριστικά και κατά συνέπεια οι λύσεις που απαιτούνται θα είναι διαφορετικές. Εν μέρει, η άποψη αυτή είναι σωστή καθώς οι συγκεκριμένες εντολές και τα δεδομένα που πρέπει κάθε φορά να χρησιμοποιηθούν διαφέρουν. Ωστόσο, η στρατηγική επίλυσης πολλών προβλημάτων, ειδικά δε όταν αυτή αποτυπώνεται στη στατική δομή ενός αντικειμενοστρεφούς συστήματος λογισμικού, είναι κοινή ή παρόμοια σε πολλές περιπτώσεις. Ο στόχος των προτύπων σχεδίασης (design patterns) είναι να συστηματοποιήσουν συνηθισμένες λύσεις σε συνηθισμένα προβλήματα λογισμικού. Κάθε πρότυπο σχεδίασης κατονομάζει τη συγκεκριμένη λύση, παρέχει μια περιγραφή του προβλήματος στο οποίο μπορεί να εφαρμοστεί, και προδιαγράφει τη λύση, συνήθως σε επίπεδο αρχιτεκτονικής σχεδίασης. Το όνομα κάθε προτύπου διευκολύνει την επικοινωνία μεταξύ προγραμματιστών καθώς και την εύκολη αναφορά σε κοινά είδη προβλημάτων. Το πρόβλημα σε κάθε πρότυπο προσδιορίζει ένα γενικότερο πλαίσιο όπου υπό κανονική αντιμετώπιση (χωρίς τη χρήση προτύπων) θα προέκυπταν ανεπιθύμητες συνέπειες αναφορικά με την λειτουργία, τον έλεγχο και τη συντήρηση του λογισμικού. Τέλος, η λύση περιγράφει τα στοιχεία από τα οποία πρέπει να συγκροτείται το σχέδιο, τις μεταξύ τους σχέσεις, τις ιδιότητες και τις αρμοδιότητες αυτών. Η έμπνευση για τη χρήση προτύπων στην Τεχνολογία Λογισμικού προήλθε από το χώρο της Αρχιτεκτονικής και συγκεκριμένα από την προσπάθεια του αρχιτέκτονα Christopher Alexander ο οποίος στο βιβλίο του "A Pattern Language: Towns, Buildings, Construction (1977)", προσπάθησε να δώσει απάντηση στο ερώτημα εάν η ποιότητα (στην αρχιτεκτονική) είναι μια αντικειμενική ιδιότητα. Αν αποδεχθεί κανείς ότι είναι δυνατό να 153

2 154 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΣΧΕΔΙΑΣΗ αναγνωρίσει και να περιγράψει ένα αρχιτεκτονικό σχέδιο καλής ποιότητας, τότε σύμφωνα με τον Alexander το επόμενο εύλογο ερώτημα είναι τι υπάρχει σε ένα σχέδιο καλής ποιότητας το οποίο δεν εμφανίζεται σε ένα σχέδιο κακής ποιότητας; Μελετώντας πληθώρα αρχιτεκτονικών κατασκευασμάτων, ο Alexander παρατήρησε ότι αυτές που θεωρούνται καλές κατασκευές είχαν κοινά στοιχεία μεταξύ τους. Τα κοινά αυτά στοιχεία, συνήθως αφορούν κοινές "λύσεις" ή λύσεις σε κοινά προβλήματα. Κατανοώντας ότι οι διάφορες δομές δεν μπορούν να διαχωριστούν από το πρόβλημα το οποίο προσπαθούν να επιλύσουν, αναζήτησε τις διαφορετικές δομές που σχεδιάστηκαν για να επιλύσουν το ίδιο πρόβλημα. Για παράδειγμα στο "πρόβλημα" του περιορισμού των ενοχλήσεων σε ένα δωμάτιο λόγω πολλαπλών θυρών, είναι πιθανό να παρατηρηθούν διαφορετικές αρχιτεκτονικές λύσεις, όπως αυτές που παρουσιάζονται στο Σχήμα Στις λύσεις αυτές εμφανίζονται επαναλαμβανόμενα στοιχεία, και ο Alexander ονόμασε τα κοινά αυτά στοιχεία μεταξύ διαφορετικών σχεδίων υψηλής ποιότητας, πρότυπα. Η έννοια του προτύπου ορίστηκε ως "μια λύση ενός προβλήματος μέσα σε συγκεκριμένο πλαίσιο" σημειώνοντας ότι "... κάθε πρότυπο περιγράφει ένα πρόβλημα που εμφανίζεται διαρκώς στο περιβάλλον και στη συνέχεια περιγράφει τον πυρήνα της λύσης κατά τέτοιο τρόπο ώστε η λύση να μπορεί να εφαρμοστεί εκατομμύρια φορές". Στο συγκεκριμένο πρόβλημα διαπιστώνεται ότι αν οι θύρες σε ένα δωμάτιο προκαλούν "ανησυχία" λόγω της θέσης τους, τότε το δωμάτιο αυτό δεν θα είναι ποτέ άνετο για διαβίωση ή εργασία. Η λύση του συγκεκριμένου προτύπου επιβάλλει, "με εξαίρεση τους πολύ μεγάλους χώρους, την τοποθέτηση των θυρών όσο το δυνατόν πλησιέστερα προς τα άκρα του δωματίου" mm 11806mm Σχήμα 6.1.1: Δύο αρχιτεκτονικές λύσεις στο ίδιο πρόβλημα Μέχρι στιγμής ίσως φαίνεται παράλογος ο συσχετισμός μεταξύ αρχιτεκτονικής και τεχνολογίας λογισμικού. Παρόλο που επαναλαμβανόμενες λύσεις χρησιμοποιούνταν στην ανάπτυξη λογισμικού από τις πρώτες ημέρες του προγραμματισμού, στις αρχές της δεκαετίας του 1990 τέθηκαν τα εξής δύο ερωτήματα:

3 6 Πρότυπα σχεδίασης 155 αν υπάρχουν προβλήματα στο λογισμικό τα οποία επαναλαμβάνονται αν υπάρχει η δυνατότητα σχεδίασης λογισμικού αξιοποιώντας πρότυπα Πολλοί ερευνητές και ιδιαίτερα στα πλαίσια του αντικειμενοστρεφούς προγραμματισμού είχαν θετική άποψη και πρότειναν διάφορες στρατηγικές επίλυσης γνωστών προβλημάτων. Ωστόσο, ο πρώτος συστηματικός κατάλογος προτύπων σχεδίασης λογισμικού προτάθηκε το 1995 από τους Gamma, Helm, Johnson και Vlissides, οι οποίοι είναι γνωστοί στην κοινότητα του αντικειμενοστρεφούς λογισμικού ως "Ομάδα των Τεσσάρων" (Gang of Four - GoF). Στο βιβλίο τους "Design Patterns: Elements of Reusable Object-Oriented Software (1995)" κατήρτισαν έναν κατάλογο με 23 πρότυπα σχεδίασης δίνοντας για το κάθε ένα από αυτά το όνομα, το πρόβλημα, τη λύση και τις συνέπειες από την εφαρμογή τους, χρησιμοποιώντας παραδείγματα από τη C++ και τη Smalltalk. Εντάσσουν όλα τα πρότυπα σε τρεις κύριες κατηγορίες: κατασκευαστικά (creational) τα οποία διαπραγματεύονται τη διεργασία δημιουργίας αντικειμένων, δομικά (structural) τα οποία ασχολούνται με τη σύνθεση κλάσεων/αντικειμένων και πρότυπα συμπεριφοράς (behavioral) που χαρακτηρίζουν τους τρόπους με τους οποίους οι κλάσεις αλληλεπιδρούν και κατανέμουν τις αρμοδιότητες. Ορισμένα από τα πρότυπα σχεδίασης είναι προφανή ή αποτελούν την εξ' ορισμού επιλογή ενός σχεδιαστή λογισμικού. Άλλα πρότυπα αποτελούν λιγότερο προφανείς λύσεις και απαιτείται προσπάθεια για την κατανόηση του προβλήματος που επιλύουν όσο και του τρόπου υλοποίησής τους. Για παράδειγμα, ένα πρόβλημα που εμφανίζεται σε αρκετά συστήματα είναι η αναγκαιότητα πολλαπλά αντικείμενα του ιδίου τύπου να αλληλεπιδράσουν για να ολοκληρωθεί κάποια εργασία. Ένα κλασσικό παράδειγμα για αυτή την περίπτωση είναι μια σειρά από αλεξιπτωτιστές που είναι έτοιμοι να πραγματοποιήσουν πτώση. Ο κάθε αλεξιπτωτιστής ενημερώνει αυτόν που στέκεται εμπρός του, και μόλις αυτός πηδήξει, πηδά και ο ίδιος. Από πλευράς αντικειμενοστρεφούς μοντέλου, κάθε αλεξιπτωτιστής μπορεί να αναπαρασταθεί ως ένα αντικείμενο με μοναδική λειτουργικότητα την πραγματοποίηση άλματος αφού ενημερωθεί ο επόμενος στη σειρά και αφού αυτός πηδήξει. Κατά συνέπεια, η ενεργοποίηση των αλμάτων πραγματοποιείται με την ειδοποίηση του τελευταίου μόνο αλεξιπτωτιστή, αντί όλων στη σειρά. Η μέθοδος "πραγματοποίησε άλμα" (jump) της κλάσης Αλεξιπτωτιστής (Paratrooper) θα είναι ως εξής (C++): void Paratrooper::jump() nextparatrooper -> jump(); //ενημέρωση του επόμενου στη σειρά leave the plane(); //εγκατάλειψη του αεροπλάνου Απαιτείται κατά συνέπεια η υλοποίηση μιας αναδρομικής διαδικασίας, όπου σε κάθε αντικείμενο Paratrooper η ενέργεια jump καλεί τη μέθοδο jump() ενός άλλου αντικειμένου, και δεν πραγματοποιείται μέχρις ότου επιστρέψει η μέθοδος jump() που κλήθηκε. Από πλευράς σχεδίασης, η λύση είναι η χρήση σε κάθε αντικείμενο ενός δείκτη (μιας αναφοράς) προς ένα άλλο αντικείμενο του ιδίου τύπου καθώς και η αναδρομική κλήση

4 156 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΣΧΕΔΙΑΣΗ της ίδιας μεθόδου. Η λύση αυτή αποτυπώνεται στο διάγραμμα κλάσεων του Σχήματος Paratrooper +jump() 1 1 nextparatrooper nextparatrooper -> jump(); Σχήμα 6.1.2: Στοιχειώδες πρότυπο σχεδίασης για αναδρομικές κλήσεις Η ανωτέρω αποτύπωση συνιστά ένα στοιχειώδες πρότυπο σχεδίασης που μπορεί να εφαρμοστεί σε όλα τα παρόμοια προβλήματα όπου απαιτείται η αλληλεπίδραση μεταξύ αντικειμένων του ιδίου τύπου και η εκτέλεση αναδρομικών κλήσεων. Βεβαίως, ένα τέτοιο πρότυπο εντοπίζεται συνήθως από τον ίδιο τον προγραμματιστή χωρίς να χρειάζεται να ανατρέξει σε καταλόγους. Ωστόσο, τέτοια στοιχειώδη πρότυπα σχεδίασης αποτελούν τα συστατικά πιο σύνθετων λύσεων και παρέχουν ένα σημαντικό βοήθημα για την ανάπτυξη αντικειμενοστρεφούς λογισμικού καλής ποιότητας. Τα πρότυπα σχεδίασης έχουν γνωρίσει πολύ μεγάλη αποδοχή, παρόλη τη σχετικά σύντομη διάρκεια ζωής τους. Αυτό οφείλεται κυρίως στο ότι τα αποτελέσματα της ακαδημαϊκής έρευνας αλλά και η εφαρμογή τους στην πράξη απέδειξαν, πώς η συστηματική χρήση τους οδηγεί στην ανάπτυξη καλά δομημένου, συντηρήσιμου και επαναχρησιμοποιήσιμου λογισμικού. Στις επόμενες ενότητες θα περιγραφούν ορισμένα από τα πρότυπα σχεδίασης που περιλαμβάνονται στον κατάλογο της "Ομάδας των Τεσσάρων". Σκοπός είναι να αντιληφθεί ο αναγνώστης τον τρόπο με τον οποίο μια ήδη τεκμηριωμένη λύση μπορεί να επιβάλλει "δομή" σε ένα σύστημα αλληλεπιδρώντων κλάσεων κυρίως μέσω της χρήσης α- φαιρέσεων. Για το λόγο αυτό δεν περιλαμβάνονται όλα τα πρότυπα ούτε και η συζήτηση για κάθε πρότυπο είναι εκτενής. Ο ενδιαφερόμενος αναγνώστης μπορεί να ανατρέξει στη σχετική βιβλιογραφία για περαιτέρω πληροφορίες, ξεκινώντας από το βιβλίο που ήδη α- ναφέρθηκε (Gamma et al., 1995). Για κάθε πρότυπο παρέχεται η ελληνική απόδοση του ονόματός του καθώς και μια σύντομη περιγραφή του σκοπού τους και του είδους των προβλημάτων που επιλύουν. Για λόγους συνέπειας, η περιγραφή του σκοπού κάθε προτύπου είναι η ίδια με αυτή της "Ομάδας των Τεσσάρων". Στη συνέχεια, για την καλύτερη δυνατή κατανόηση του τρόπου εφαρμογής τους, περιγράφεται ένα συγκεκριμένο παράδειγμα, το πρόβλημα που εμφανίζεται καθώς και η λύση με χρήση προτύπων. Κάθε παράδειγμα συνοδεύεται από ένα πλήρες πρόγραμμα που παρουσιάζει τον τρόπο υλοποίησης των προτύπων σε C++ ή Java. Τέλος παρουσιάζεται η γενική δομή του προτύπου υπό μορφή διαγράμματος κλάσεων της UML.

5 6 Πρότυπα σχεδίασης Προσαρμογέας Εισαγωγή Το πρότυπο σχεδίασης "Προσαρμογέας" (Adapter) έχει ως στόχο τη μετατροπή της διασύνδεσης μιας κλάσης σε μια άλλη που αναμένει το πρόγραμμα πελάτης. Ο προσαρμογέας επιτρέπει τη συνεργασία κλάσεων, η οποία σε διαφορετική περίπτωση θα ήταν αδύνατη λόγω ασύμβατων διασυνδέσεων. Συχνά, ο κώδικας μιας κλάσης προσφέρεται για επαναχρησιμοποίηση, αλλά αυτή δεν είναι δυνατή λόγω του ότι τα προγράμματα που επιθυμούν να χρησιμοποιήσουν τις λειτουργίες της, αναμένουν διαφορετική διασύνδεση. Έστω για παράδειγμα ότι μια κλάση Σχεδίασης είναι σε θέση να σχεδιάσει γραμμές, αλλά απαιτεί ως παραμέτρους τις συντεταγμένες στη μορφή (x1, y1, x2, y2), ενώ τα προγράμματα πελάτες είναι σε θέση να παρέχουν τις συντεταγμένες στη μορφή (x1, x2, y1, y2). Στη συνήθη περίπτωση όπου τα προγράμματα πελάτες δεν είναι δυνατόν να τροποποιηθούν (καθώς βρίσκονται ήδη εγκατεστημένα σε διάφορα πεδία εφαρμογών), ενώ και η κλάση Σχεδίασης είναι επιθυμητό να χρησιμοποιηθεί χωρίς τροποποίηση (καθώς οποιαδήποτε επέμβαση στον κώδικα μιας μεθόδου είναι δυνατόν να προκαλέσει σφάλματα στις υπόλοιπες μεθόδους), βρίσκει εφαρμογή το πρότυπο "Προσαρμογέας" Παράδειγμα Θεωρούμε μια εφαρμογή η οποία χειρίζεται διάφορα σχήματα (σημεία, γραμμές, τετράγωνα) με ενιαίο τρόπο, δηλαδή καλεί λειτουργίες επί των σχημάτων, αδιαφορώντας για το συγκεκριμένο είδος σχήματος. Τέτοιες λειτουργίες είναι η εμφάνιση του σχήματος, ο καθορισμός του χρώματος, η διαγραφή από την οθόνη, ο καθορισμός θέσης, το γέμισμα με χρώμα κλπ. Με άλλα λόγια, όλα τα σχήματα θα πρέπει να ενσωματωθούν σε μια αφηρημένη έννοια σχήματος που θα παρέχει όλες αυτές τις λειτουργίες. Η προφανής αντιμετώπιση του προβλήματος είναι με τη χρήση πολυμορφισμού: Μια αφηρημένη κλάση ορίζει όλες τις λειτουργίες της διασύνδεσης, ενώ η υλοποίηση των λειτουργιών είναι διαφορετική για κάθε μία από τις παράγωγες κλάσεις. Το πρόγραμμα πελάτης είναι σε θέση να χειρίζεται αντικείμενα της αφηρημένης κλάσης διατηρώντας ένα δείκτη προς αυτή, ενώ κατά την εκτέλεση του προγράμματος μεταβιβάζονται ως τιμές στον δείκτη οι διευθύνσεις συγκεκριμένων αντικειμένων των παράγωγων κλάσεων. Το πρόγραμμα πελάτης (αναθέτοντας διευθύνσεις υποκείμενων κλάσεων σε δείκτη της βασικής κλάσης) είναι σε θέση να καλέσει τις λειτουργίες των αντικειμένων σχημάτων προς τα οποία "δείχνει" ο δείκτης κατά τη διάρκεια της εκτέλεσης (= πολυμορφισμός). Το διάγραμμα κλάσεων σε αυτή την περίπτωση παρουσιάζεται στο Σχήμα Ορισμένες βέβαια λειτουργίες, που έχουν κοινή υλοποίηση σε όλες τις παράγωγες κλάσεις, υλοποιούνται στην αφηρημένη βασική κλάση (όπως για παράδειγμα οι setlocation() και setlinecolor()).

6 158 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΣΧΕΔΙΑΣΗ Shape Client +setlocation() +display() +setlinecolor() +undisplay() +fill() Point Line Square +display() +undisplay() +fill() +display() +undisplay() +fill() +display() +undisplay() +fill() Σχήμα 6.2.1: Διάγραμμα κλάσεων για σύστημα σχεδίασης σχημάτων Σε περίπτωση που ζητηθεί η προσθήκη δυνατότητας σχεδίασης κύκλων από την εφαρμογή, θα πρέπει να προστεθεί μία νέα κλάση η οποία θα κληρονομεί από την αφηρημένη κλάση Shape υλοποιώντας την πολυμορφική συμπεριφορά των μεθόδων που δηλώνονται στη διασύνδεση. Στο σημείο αυτό, θα πρέπει να γραφεί ο κώδικας για τις μεθόδους display(), undisplay() και fill(). Επειδή η συγγραφή των μεθόδων αυτών είναι αρκετά περίπλοκη, αρχικά πραγματοποιείται αναζήτηση εναλλακτικής λύσης, υπό τη μορφή κάποιας κλάσης που ήδη υλοποιεί κύκλους και είναι διαθέσιμη. Έστω ότι εντοπίζεται μια τέτοια κλάση με το όνομα OtherCircle, η οποία διαθέτει τις ίδιες λειτουργίες με διαφορετικά ωστόσο ονόματα μεθόδων. Η κλάση OtherCircle δεν μπορεί να ενταχθεί απευθείας στην ιεραρχία των κλάσεων αφενός λόγω της ασυμβατότητας των μεθόδων (ονομάτων και ενδεχομένως παραμέτρων), καθώς και διότι στον ορισμό της δεν κληρονομεί από την κλάση Shape. H λύση στο σημείο αυτό είναι η δημιουργία μιας νέας κλάσης Circle η οποία όντως κληρονομεί από την Shape (και κατά συνέπεια είναι συμβατή με τις λειτουργίες της διασύνδεσης), και η οποία περιέχει ένα αντικείμενο της κλάσης OtherCircle. Κατά αυτόν τον τρόπο, η κλάση Circle μπορεί να μεταβιβάζει τις αιτήσεις που φθάνουν σε αυτή, στο αντικείμενο OtherCircle που μπορεί να τις ικανοποιήσει. Η υπάρχουσα κλάση OtherCircle επομένως δεν τροποποιείται, αλλά προσαρμόζεται. Η λύση στο ανωτέρω πρόβλημα με χρήση του προτύπου "Προσαρμογέας" παρουσιάζεται στο διάγραμμα κλάσεων του Σχήματος Η εφαρμογή του προτύπου επιτρέπει τη συνέχιση της πολυμορφικής συμπεριφοράς των σχημάτων: το πρόγραμμα πελάτης συνεχίζει να χειρίζεται μόνο αντικείμενα τύπου Shape, αδιαφορώντας για τον διαφορετικό τρόπο υλοποίησης των λειτουργιών σε κάθε σχήμα.

7 6 Πρότυπα σχεδίασης 159 Shape Client +setlocation() +display() +setlinecolor() +undisplay() +fill() Point Line Square Circle OtherCircle +display() +undisplay() +fill() +display() +undisplay() +fill() +display() +undisplay() +fill() +setlocation() +display() +setlinecolor() +undisplay() +fill() 1 1 +setitslocation() +displayit() +setitslinecolor() +undisplayit() +fillit() Υλοποίηση Σχήμα 6.2.2: Προσαρμογή της κλάσης OtherCircle στις επιθυμητές λειτουργίες της Shape Η αφηρημένη κλάση Shape ορίζει την αφαίρεση ενός σχήματος ώστε να μπορεί να χρησιμοποιηθεί από προγράμματα-πελάτες. Δύο από τις μεθόδους (setlocation() και setlinecolor()) είναι υλοποιημένες ενώ οι υπόλοιπες αφήνουν την υλοποίηση στις παράγωγες κλάσεις. (Η κλάση κληρονομεί την JComponent της Java έτσι ώστε να μπορεί να σχεδιαστεί σε ένα παράθυρο). //Shape.java import javax.swing.*; import java.awt.*; public abstract class Shape extends JComponent public void setlocation(int x, int y) xtopleft = x; ytopleft = y; public void setlinecolor(color c) linecolor = c; public abstract void display(); public abstract void undisplay(); public abstract void fill(color c); protected int xtopleft = 0; protected int ytopleft = 0; protected Color linecolor;

8 160 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΣΧΕΔΙΑΣΗ Κάθε πραγματικό σχήμα υλοποιείται ως παράγωγη κλάση της Shape παρέχοντας υλοποίηση στις αφηρημένες μεθόδους. Στη συνέχεια παρουσιάζεται ο κώδικας για τα τετράγωνα. Η μέθοδος paint() καλείται κατά την τοποθέτηση του αντικειμένου σε μια γραφική διασύνδεση. //Square.java import javax.swing.*; import java.awt.*; public class Square extends Shape public Square() rect = new Rectangle(xTopLeft, ytopleft, 100, 100); public void paint(graphics g) super.paint(g); Graphics2D g2 = (Graphics2D)g; g2.setcolor(linecolor); rect.setlocation(xtopleft, ytopleft); g2.draw(rect); if(fillcolor!= null) g2.setcolor(fillcolor); g2.fillrect(xtopleft, ytopleft, 100, 100); public void fill(color c) fillcolor = c; public void display() this.setvisible(true); public void undisplay() this.setvisible(false); private Rectangle rect; private Color fillcolor = null; Ένα πρόγραμμα πελάτης προσομοιώνεται από τον ακόλουθο κώδικα. Στο αντικείμενο S1 της κλάσης Square μπορούν να κληθούν όλες οι μέθοδοι που δηλώνονται στη διασύνδεση της Shape.

9 6 Πρότυπα σχεδίασης 161 //Client.java import javax.swing.*; import java.awt.*; import java.util.*; public class Client extends JFrame public void draw(shape componenttodraw) getcontentpane().add(componenttodraw); public static void main(string[] args) Client frame = new Client(); Square S1 = new Square(); S1.setLineColor(Color.BLUE); S1.setLocation(50, 70); frame.draw(s1); S1.fill(Color.ORANGE); S1.undisplay(); S1.display(); frame.setsize(400, 400); frame.setvisible(true); frame.setdefaultcloseoperation(jframe.exit_on_close); Όπως αναφέρθηκε, υποθέτουμε ότι υπάρχει ήδη μια κλάση OtherCircle η οποία διαθέτει υλοποιημένες όλες τις αντίστοιχες μεθόδους, με διαφορετικές όμως υπογραφές, αποκλείοντας την απευθείας χρήση από έναν πελάτη ο οποίος "γνωρίζει" τη διασύνδεση της Shape. Για παράδειγμα, ένα πρόγραμμα πελάτης, μπορεί να σαρώνει μια λίστα από σχήματα και να τα σχεδιάζει, καλώντας τις ίδιες μεθόδους (αυτές που δηλώνονται στη Shape) για όλα τα σχήματα. Ο κώδικας της OtherCircle φαίνεται παρακάτω: //OtherCircle.java import javax.swing.*; import java.awt.*; public class OtherCircle extends JComponent public void paint(graphics g) super.paint(g); Graphics2D g2 = (Graphics2D)g;

10 162 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΣΧΕΔΙΑΣΗ g2.setcolor(linecolor); g2.drawoval(xupperleft, yupperleft, 100, 100); if(fillcolor!= null) g2.setcolor(fillcolor); g2.filloval(xupperleft, yupperleft, 100, 100); //Αυτή η μέθοδος λαμβάνει τα ορίσματα με αντίστροφη σειρά public void setitslocation(int y, int x) xupperleft = x; yupperleft = y; //Διαφορετικά ονόματα μεθόδων και ιδιοτήτων public void setitslinecolor(color c) linecolor = c; public void fillit(color c) fillcolor = c; public void displayit() this.setvisible(true); public void undisplayit() this.setvisible(false); private Color fillcolor = null; private int xupperleft = 0; private int yupperleft = 0; private Color linecolor; Για την προσαρμογή μιας τέτοιας κλάσης στην υπάρχουσα διασύνδεση, δημιουργείται μια κλάση "Προσαρμογέας" η οποία κληρονομεί τη Shape και κατά τη δημιουργία της δημιουργεί με τη σειρά της ένα αντικείμενο της προσαρμοζόμενης κλάσης OtherShape. Η κλάση Circle που έχει το ρόλο του προσαρμογέα, υλοποιεί όλες τις μεθόδους αποστέλλοντας κατάλληλα μηνύματα στο προσαρμοζόμενο αντικείμενο. Ο κώδικας είναι ο εξής: import javax.swing.*; import java.awt.*; public class Circle extends Shape

11 6 Πρότυπα σχεδίασης 163 //Ο κατασκευαστής δημιουργεί στιγμιότυπο //της προσαρμοζόμενης κλάσης public Circle() adaptedcircle = new OtherCircle(); public void paint(graphics g) adaptedcircle.paint(g); //Επικάλυψη μεθόδων υπερκλάσης και αποστολή μηνυμάτων public void setlocation(int x, int y) adaptedcircle.setitslocation(y, x); public void setlinecolor(color c) adaptedcircle.setitslinecolor(c); //Υλοποίηση αφηρημένων μεθόδων public void fill(color c) adaptedcircle.fillit(c); public void display() adaptedcircle.displayit(); public void undisplay() adaptedcircle.undisplayit(); private OtherCircle adaptedcircle; Κατά συνέπεια, το πρόγραμμα πελάτης χειρίζεται αντικείμενα Circle με τον ίδιο ακριβώς τρόπο, αγνοώντας την ύπαρξη των προσαρμοσμένων αντικειμένων OtherCircle προς τα οποία αποστέλλονται τα πραγματικά μηνύματα: import javax.swing.*; import java.awt.*; import java.util.*; public class Client extends JFrame public void draw(shape componenttodraw)

12 164 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΣΧΕΔΙΑΣΗ getcontentpane().add(componenttodraw); public static void main(string[] args) Client frame = new Client(); Circle C1 = new Circle(); C1.setLineColor(Color.RED); C1.setLocation(200, 200); frame.draw(c1); C1.fill(Color.RED); S1.undisplay(); S1.display(); frame.setsize(400, 400); frame.setvisible(true); frame.setdefaultcloseoperation(jframe.exit_on_close); Γενική Δομή Εφαρμογή Ένας προσαρμογέας χρησιμοποιείται όταν: θέλετε να χρησιμοποιήσετε μια υπάρχουσα κλάση, αλλά η διασύνδεσή της δεν συμβαδίζει με τις ανάγκες σας. Ένας προσαρμογέας κλάσης (class adapter) χρησιμοποιεί πολλαπλή κληρονομικότητα για να προσαρμόσει μια διασύνδεση σε μια άλλη. Σχήμα 6.2.3: Προσαρμογέας Κλάσης Ένας προσαρμογέας αντικειμένου (object adapter) βασίζεται στη σύνθεση αντικειμένων και στη διαβίβαση μηνυμάτων (delegation).

13 6 Πρότυπα σχεδίασης Σύνθετο Εισαγωγή Σχήμα 6.2.4: Προσαρμογέας Αντικειμένου Το πρότυπο σχεδίασης "Σύνθετο" (Composite) επιτρέπει τη σύνθεση αντικειμένων σε δενδροειδείς δομές για την αναπαράσταση ιεραρχιών τμήματος-όλου. Το πρότυπο σχεδίασης "Σύνθετο" επιτρέπει στα προγράμματα πελάτες να διαχειρίζονται με ενιαίο τρόπο τόσο τα ανεξάρτητα αντικείμενα όσο και συνθέσεις αντικειμένων. Πολύ συχνά, σε μια εφαρμογή, εκτός από μεμονωμένα αντικείμενα (π.χ. Τροχός, Μηχανή, Κάθισμα), υφίστανται και σύνθετα αντικείμενα που περιέχουν ή περιλαμβάνουν άλλα αντικείμενα (π.χ. Αυτοκίνητο). Η σχέση περιεκτικότητας μπορεί να είναι ασθενούς μορφής (συσσωμάτωση) είτε ισχυρής μορφής (σύνθεση). Η συνήθης αντιμετώπιση μιας τέτοιας περίπτωσης με τη χρήση μιας σχέσης περιεκτικότητας μεταξύ της κλάσης που αντιπροσωπεύει το όλον (περικλείουσα κλάση) και των κλάσεων που αντιπροσωπεύουν τα τμήματα, έχει το μειονέκτημα ότι δεν επιτρέπει τoν ομοιόμορφο χειρισμό των αντικειμένων από ένα πρόγραμμα πελάτη. Για παράδειγμα, μια άλλη εφαρμογή, θα πρέπει να διατηρεί δείκτες και προς αντικείμενα τύπου Τροχός, Μηχανή, Κάθισμα, αλλά και δείκτες προς αντικείμενα τύπου Αυτοκίνητο. Λαμβάνοντας υπόψη τους πρωταρχικούς στόχους του αντικειμενοστρεφούς προγραμματισμού, αν προστεθεί στο σύστημα μια νέα σύνθετη κλάση (π.χ. Λεωφορείο), τότε ο κώδικας του προγράμματος πελάτη, θα πρέπει να τροποποιηθεί για να είναι δυνατός ο χειρισμός των νέων αντικειμένων τύπου Λεωφορείο. Η α- ντιμετώπιση αυτού του προβλήματος, επιτυγχάνεται με κομψό τρόπο με το πρότυπο σχεδίασης "Σύνθετο" Παράδειγμα Οι εφαρμογές που σχεδιάζουν πολύπλοκα ψηφιακά κυκλώματα VLSI (όπως για παράδειγμα το κύκλωμα ενός επεξεργαστή), αντιμετωπίζουν οποιαδήποτε οντότητα ως αντικείμενο. Κάθε αντικείμενο έχει ορισμένες λειτουργίες, μεταξύ αυτών η σχεδίαση του. Ο-

14 166 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΣΧΕΔΙΑΣΗ ρισμένα από τα αντικείμενα είναι πρωταρχικά και δεν αναλύονται περαιτέρω (π.χ. λογικές πύλες AND, OR, NOT), ενώ άλλα αντικείμενα είναι σύνθετα και αποτελούνται από πρωταρχικές πύλες (π.χ. ένας πλήρης αθροιστής Full Adder). Ο χρήστης είναι σε θέση να δημιουργήσει οποιαδήποτε σύνθετη οντότητα και να την προσθέσει στην εφαρμογή. Η σχεδίαση ενός σύνθετου αντικειμένου ουσιαστικά συνίσταται στη σχεδίαση των επί μέρους τμημάτων του. Για το λόγο αυτό, είναι επιθυμητή η ενιαία αντιμετώπιση όλων των αντικειμένων. Το πρότυπο σχεδίασης "Σύνθετο", επιτρέπει τον αναδρομικό ορισμό περιεκτικότητας, ώστε οι πελάτες να μην αντιλαμβάνονται τη διαφορά μεταξύ πρωταρχικών και σύνθετων αντικειμένων. Το σημείο κλειδί στο πρότυπο σχεδίασης "Σύνθετο" είναι η ύπαρξη μιας αφηρημένης κλάσης που αναπαριστά τόσο πρωταρχικές κλάσεις όσο και περικλείουσες κλάσεις. Για τη συγκεκριμένη εφαρμογή, η αφηρημένη κλάση είναι η κλάση Εξάρτημα (Σχήμα 6.3.1). Η κλάση Εξάρτημα (Component) δηλώνει λειτουργίες όπως η σχεδίαση που είναι διαφορετική για κάθε αντικείμενο, καθώς και λειτουργίες που είναι κοινές σε όλα τα σύνθετα α- ντικείμενα, όπως οι λειτουργίες προσθήκης και αφαίρεσης αντικειμένων. Οι λειτουργίες αυτές, δεν υλοποιούνται στις πρωταρχικές κλάσεις, καθώς οι πρωταρχικές πύλες δεν περιέχουν αντικείμενα. Θα πρέπει να σημειωθεί, ότι η κλάση Εξάρτημα που εισάγεται από το πρότυπο, δεν έχει αντιστοιχία με οποιαδήποτε φυσική έννοια του πραγματικού κόσμου. Η κλάση Κύκλωμα (Circuit), ορίζει μια συσσωμάτωση αντικειμένων τύπου Εξάρτημα. Η λειτουργία της σχεδίασης υλοποιείται καλώντας τη λειτουργία της σχεδίασης ό- λων των αντικειμένων (πρωταρχικών ή σύνθετων) που εμπεριέχονται. Η κλάση Κύκλωμα, συμμορφώνεται με τη διασύνδεση που δηλώνεται από την κλάση Εξάρτημα και για το λόγο αυτό, αντικείμενα τύπου Κύκλωμα είναι δυνατόν να περιλαμβάνουν αναδρομικά άλλα αντικείμενα τύπου Κύκλωμα. Σχήμα 6.3.1: Εφαρμογή του προτύπου "Σύνθετο" σε πρόγραμμα σχεδίασης κυκλωμάτων Θέτοντας τις λειτουργίες χειρισμού των αντικειμένων που εμπεριέχονται σε μια περικλείουσα κλάση (add(), remove()) στην κλάση Component, όλα τα αντικείμενα αντιμε-

15 6 Πρότυπα σχεδίασης 167 τωπίζονται με τον ίδιο ακριβώς τρόπο, εξασφαλίζοντας ομοιομορφία. Ωστόσο δημιουργείται το εξής πρόβλημα: Για τις κλάσεις φύλλα (όπως οι AND, OR, NOT) είναι δυνατόν να κληθούν οι λειτουργίες add(), remove() οι οποίες δεν έχουν νόημα και για τον λόγο αυτό ο σχεδιαστής θα πρέπει να παράσχει μια εκφυλισμένη υλοποίηση. Εναλλακτικά, οι λειτουργίες αυτές είναι δυνατόν να δηλωθούν στην κλάση Circuit, ώστε οποιαδήποτε απόπειρα να προστεθούν ή να διαγραφούν αντικείμενα σε αντικείμενα τύπου AND, OR ή NOT να ανιχνευθεί κατά τη μεταγλώττιση, εξασφαλίζοντας ασφάλεια. Ωστόσο, στην περίπτωση αυτή, οι πρωταρχικές κλάσεις και οι σύνθετες κλάσεις έχουν διαφορετική διασύνδεση Υλοποίηση Η αφηρημένη κλάση Component ορίζει τη διασύνδεση κάθε οντότητας που μπορεί να σχεδιαστεί, ώστε να μπορεί να χρησιμοποιηθεί από προγράμματα-πελάτες: //C++ class Component public: Component(string text); virtual void draw() = 0; virtual void add(component*) ; virtual void remove(component*) ; protected: string identifier; ; Component::Component(string text) identifier = text; Η κλάση παρέχει έναν κατασκευαστή ώστε να λαμβάνει τιμή η ιδιότητα identifier κάθε αντικειμένου κατά την υλοποίησή του. Οι υπόλοιπες λειτουργίες είναι δηλωμένες ως virtual, επιτρέποντας πολυμορφική συμπεριφορά, δηλαδή τη μεταβίβαση ενός δείκτη προς αντικείμενο τύπου Component σε οποιοδήποτε πρόγραμμα πελάτη, και την ανάθεση στον δείκτη της διεύθυνσης οποιουδήποτε αντικειμένου της ιεραρχίας (πρωταρχικού ή σύνθετου). Οι μέθοδοι για τις οποίες υπάρχει μια εξ' ορισμού υλοποίηση (όπως οι add(), remove()) και οι οποίες είναι δηλωμένες ως virtual, επανα-ορίζονται στις παράγωγες κλάσεις για τις οποίες οι λειτουργίες αυτές έχουν νόημα (κλάσεις σύνθετων αντικειμένων). H μέθοδος draw() είναι δηλωμένη ως αφηρημένη (μέσω του = 0) έτσι ώστε να εξασφαλισθεί ότι δεν πρόκειται να υλοποιηθεί αντικείμενο της κλάσης αυτής. Μια πρωταρχική κλάση, όπως μια κλάση πύλης AND, δηλώνεται ως παράγωγη της κλάσης Component:

16 168 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΣΧΕΔΙΑΣΗ class AND : public Component public: AND(string text); virtual void draw(); ; Καθώς οι κατασκευαστές μιας βασικής κλάσης δεν κληρονομούνται από τις παράγωγες κλάσεις, ο κατασκευαστής της κλάσης AND ορίζεται μεταβιβάζοντας την παράμετρο στον κατασκευαστή της βασικής κλάσης: AND::AND(string text) : Component(text) ; Η δε μέθοδος draw() υλοποιεί τη λειτουργία που αντιστοιχεί στη συγκεκριμένη πρωταρχική κλάση, και η οποία προσομοιώνεται ως: void AND::draw() cout << "AND " << identifier << " is being drawn" << endl; Η κλάση Circuit είναι μια περικλείουσα κλάση η οποία είναι δυνατόν να περιέχει αντικείμενα είτε πρωταρχικών κλάσεων (π.χ. ένα κύκλωμα που αποτελείται από πύλες), είτε άλλων σύνθετων κλάσεων (π.χ. ένα κύκλωμα που αποτελείται από άλλα κυκλώματα), είτε αντικείμενα και των δύο κατηγοριών (ένα κύκλωμα που αποτελείται από πύλες και άλλα κυκλώματα). Για το λόγο αυτό, μια από τις ιδιότητες υλοποιεί έναν περιέχοντα (container), όπως ένα διάνυσμα (vector), ουρά (queue), διπλά συνδεδεμένη λίστα (list), στοίβα (stack) κ.ο.κ, που περιλαμβάνονται στην πρότυπη βιβλιοθήκη της C++ (STL): class Circuit : public Component public: Circuit(string text); virtual void draw(); virtual void add(component*); virtual void remove(component*); private: vector<component*> components; //διάνυσμα περιεχόμενων //συστατικών ; Circuit::Circuit(string text) : Component(text) ; Η λειτουργία draw() χρησιμοποιεί έναν επαναλήπτη (Iterator) για να διατρέξει όλα τα στοιχεία του διανύσματος components, και να καλέσει μέσω αυτού τη λειτουργία draw() του κάθε αντικειμένου που περιλαμβάνεται:

17 6 Πρότυπα σχεδίασης 169 void Circuit::draw() cout <<"Circuit "<<identifier<< " is being drawn" << endl; std::vector<component*>::iterator i; for(i=components.begin(); i!=components.end(); i++) (*i)->draw(); Οι λειτουργίες add() και remove() εισάγουν και διαγράφουν αντικείμενα τύπου Component (άρα οτιδήποτε) από το διάνυσμα που είναι αποθηκευμένο στο μέλος δεδομένων components: void Circuit::add(Component* comp) components.push back(comp); void Circuit::remove(Component* comp) vector<component*>::iterator i; for(i=components.begin(); i!=components.end(); i++) if((*i) == comp) break; components.erase(i); Με τη χρήση του ανωτέρου προτύπου είναι πλέον δυνατή η δημιουργία οποιουδήποτε πρωταρχικού ή σύνθετου αντικειμένου και ο χειρισμός τους με ενιαίο τρόπο: int main() AND G1("Gate1"); AND G2("Gate2"); //δημιουργία απλού στοιχείου Circuit C1("Circuit1"); //δημιουργία σύνθετου στοιχείου C1.add(&G1); C1.add(&G2); AND G3("Gate3"); Circuit C2("Circuit2"); C2.add(&G3); C2.add(&C1); G1.draw(); //προσθήκη απλού στοιχείου //προσθήκη σύνθετου στοιχείου //κοινή διασύνδεση

18 170 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΣΧΕΔΙΑΣΗ C2.draw(); return 0; Γενική Δομή Εφαρμογή Το πρότυπο σχεδίασης "Σύνθετο" χρησιμοποιείται όταν: θέλετε τα προγράμματα πελάτες να μπορούν να χειρίζονται μεμονωμένα αντικείμενα και σύνθετα αντικείμενα (συλλογές από άλλα αντικείμενα) με τον ίδιο τρόπο. 6.4 Μοναδιαίο Εισαγωγή Σχήμα 6.3.2: Διάγραμμα κλάσεων προτύπου "Σύνθετο" Το πρότυπο σχεδίασης "Μοναδιαίο" (Singleton) εξασφαλίζει ότι μια κλάση θα έχει μόνο ένα στιγμιότυπο και παρέχει ένα καθολικό σημείο πρόσβασης σε αυτό. Συνήθως μεταξύ κλάσεων και στιγμιοτύπων τους υπάρχει μια σχέση ένα-προς-πολλά. Κατά τη διαδικασία ανάλυσης, η ύπαρξη πολλών στιγμιότυπων της ίδιας έννοιας στο σύστημα υποδηλώνει την αναγκαιότητα μιας κλάσης. Τα αντικείμενα δημιουργούνται δεσμεύοντας χώρο στη μνήμη όποτε κρίνεται σκόπιμο και διαγράφονται από τη μνήμη όταν τερματιστεί η χρήση τους. Ορισμένες όμως φορές, απαιτείται η ύπαρξη κλάσεων από τις οποίες παράγεται ένα μόνο αντικείμενο. Πολύ συχνά, το αντικείμενο αυτό συνήθως δημιουργείται κατά την έναρξη της εφαρμογής και διαγράφεται με το πέρας της. Ο ρόλος του μοναδικού αυτού αντικειμένου είναι η διαχείριση των υπολοίπων αντικειμένων της εφαρμογής και για το λόγο αυτό, αποτελεί λογικό σφάλμα να δημιουργηθούν περισσότερα του

19 6 Πρότυπα σχεδίασης 171 ενός τέτοια αντικείμενα-διαχειριστές (managers ή controllers). Σε μια τέτοια περίπτωση, η εφαρμογή θα έχει περισσότερα του ενός σημεία εκκίνησης, και ο υποθετικός χρήστης, ανάλογα με το σημείο εκκίνησης, μπορεί να καταλήξει να χρησιμοποιεί ένα υποσύνολο των αντικειμένων του συστήματος. Επιπλέον, αν υπάρχουν περισσότεροι του ενός διαχειριστές, ενώ ο επιθυμητός στόχος είναι η ακολουθιακή εκτέλεση δραστηριοτήτων, πολλές δραστηριότητες θα εκτελούνται παράλληλα. Το πρότυπο σχεδίασης "Μοναδιαίο", εξασφαλίζει τη δημιουργία ενός και μόνο αντικειμένου, περιλαμβάνοντας μια ειδική μέθοδο κατασκευής στιγμιοτύπων: Όταν καλείται αυτή η μέθοδος, ελέγχει αν κάποιο αντικείμενο έχει ήδη δημιουργηθεί. Αν ναι, η μέθοδος επιστρέφει απλώς έναν δείκτη προς το υπάρχον αντικείμενο. Αν όχι, η μέθοδος δημιουργεί ένα νέο αντικείμενο και επιστρέφει δείκτη προς αυτό. Για να εξασφαλισθεί ότι αυτός είναι ο μοναδικός τρόπος δημιουργίας αντικειμένων από αυτή την κλάση, ο κατασκευαστής της κλάσης δηλώνεται ως προστατευμένος (protected) ή ιδιωτικός (private). Με τον τρόπο αυτό, δεν είναι δυνατόν να δημιουργηθεί ένα αντικείμενο παρακάμπτοντας την παραπάνω ειδική μέθοδο Παράδειγμα Έστω ότι επιχειρείται η αντικειμενοστρεφής μοντελοποίηση μιας κεντρικής μονάδας επεξεργασίας (ΚΜΕ) ενός υπολογιστή. Παρόλο που είναι δυνατόν να υπάρχουν πολλοί καταχωρητές γενικής χρήσης, πρέπει να υπάρχει (σε συμβατική αρχιτεκτονική), μόνο ένας καταχωρητής (συσσωρευτής - Accumulator) στον οποίο καταλήγουν τα αποτελέσματα των αριθμητικών και λογικών πράξεων. Η εφαρμογή πρέπει να εξασφαλίσει ότι δεν θα δημιουργηθούν πέραν του ενός τέτοιοι συσσωρευτές και ότι οι λειτουργίες του καταχωρητή θα είναι καθολικά προσπελάσιμες. Οι ανωτέρω απαιτήσεις ικανοποιούνται εφαρμόζοντας το πρότυπο "Μοναδιαίο" και ορίζοντας στην κλάση Accumulator μια στατική λειτουργία getinstance() η οποία δημιουργεί ένα αντικείμενο μόνο όταν αυτό δεν υφίσταται. Η λειτουργία είναι δηλωμένη στατική, έτσι ώστε να μπορεί να κληθεί και πριν από την κατασκευή του μοναδικού αντικειμένου. Η κλάση περιλαμβάνει ένα στατικό μέλος instance, δείκτη προς το μοναδικό αντικείμενο (όσο αυτό δεν υφίσταται, η τιμή του δείκτη είναι NULL). Η λειτουργία getinstance() σε περίπτωση που η τιμή του δείκτη instance είναι NULL δημιουργεί ένα αντικείμενο της κλάσης. Σε περίπτωση που ο δείκτης έχει ήδη μια τιμή, η λειτουργία απλώς επιστρέφει την τιμή του Υλοποίηση Ο κώδικας της κλάσης Accumulator που εφαρμόζει το πρότυπο σχεδίασης "Μοναδιαίο" παρουσιάζεται στη συνέχεια (C++): class Accumulator public: static Accumulator* getinstance();

20 172 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΣΧΕΔΙΑΣΗ protected: Accumulator(); private: static Accumulator* instance; ; Accumulator* Accumulator::instance = NULL; Accumulator::Accumulator() Accumulator* Accumulator::getInstance() if(instance == NULL) instance = new Accumulator; return instance; Τα προγράμματα πελάτες μπορούν να προσπελάσουν το συσσωρευτή μόνο μέσω της μεθόδου getinstance() καθώς ο κατασκευαστής είναι δηλωμένος ως προστατευμένος και κατά συνέπεια η δημιουργία ενός αντικειμένου δεν μπορεί να πραγματοποιηθεί παρακάμπτοντας τη μέθοδο getinstance(). Οποιαδήποτε προσπάθεια κλήσης του κατασκευαστή θα οδηγήσει σε σφάλμα κατά τη μεταγλώττιση. Η τιμή που επιστρέφει η μέθοδος, δεν δημιουργείται μέχρι την πρώτη κλήση της (lazy initialization). Αν επομένως ένα μοναδιαίο αντικείμενο δεν χρησιμοποιηθεί, δεν δημιουργείται. Στο παρακάτω πρόγραμμα ελέγχου, οι δύο εντολές printf επιστρέφουν την ίδια διεύθυνση για τους δείκτες A και A1, καθώς η getinstance() δημιουργεί ένα μοναδικό αντικείμενο της κλάσης Accumulator. int main() Accumulator* A; A = Accumulator::getInstance(); //δημιουργία ενός συσσωρευτή Accumulator* A1; A1 = Accumulator::getInstance(); //προσπάθεια δημιουργίας //δεύτερου συσσωρευτή printf("a address: %p\n", A); printf("a1 address: %p\n", A1); return 0; Η απλότητα του προτύπου επιτρέπει οποιαδήποτε κλάση να μετατραπεί σε μοναδιαία, κάνοντας τον κατασκευαστή ιδιωτικό ή προστατευμένο και προσθέτοντας μια στατική μέθοδο και μια στατική ιδιότητα. Τέλος, ένα πλεονέκτημα του προτύπου είναι ότι σε περί-

21 6 Πρότυπα σχεδίασης 173 πτωση δημιουργίας παράγωγων κλάσεων από μια μοναδιαία κλάση, κάθε απόγονος μπορεί να είναι επίσης μοναδιαία κλάση αν προστεθούν και σε αυτές η στατική ιδιότητα και μέθοδος. Για παράδειγμα, αν υπάρχουν ειδικές κατηγορίες συσσωρευτών από τις οποίες μπορεί να επιλέξει ο σχεδιαστής, κάθε κατηγορία μπορεί να κληρονομεί από την κλάση Accumulator. Καθώς η ιδιότητα instance είναι δείκτης προς αντικείμενα τύπου Accumulator, η μέθοδος getinstance() μπορεί να αναθέσει στην instance την τιμή ενός δείκτη προς οποιαδήποτε παράγωγη κλάση Γενική Δομή Εφαρμογή Το πρότυπο σχεδίασης "Μοναδιαίο" χρησιμοποιείται όταν: σε κάποιο σύστημα λογισμικού υπάρχει η απαίτηση από μια κλάση να δημιουργείται ένα και μόνο ένα αντικείμενο. Μοναδιαίο -στιγμιότυπο -δεδομένο +υλοποίησηστιγμιοτύπου() +λειτουργία() +λήψηδεδομένου() return στιγμιότυπο; Σχήμα 6.4.1: Διάγραμμα κλάσεων προτύπου "Μοναδιαίο" Η υπογράμμιση στο μέλος δεδομένων στιγμιότυπο, και στη μέθοδο υλοποίηση- Στιγμιοτύπου() υποδηλώνει στη UML ότι πρόκειται για στατικά μέλη της κλάσης. 6.5 Γέφυρα Εισαγωγή Το πρότυπο σχεδίασης "Γέφυρα" (Bridge Pattern) έχει ως στόχο την αποσύνδεση μιας α- φαίρεσης από την υλοποίησή της, ώστε να μπορούν να μεταβάλλονται ανεξάρτητα. Όταν μια αφαίρεση μπορεί να έχει περισσότερες από μία υλοποιήσεις, ο συνήθης τρόπος οργάνωσης είναι με τη χρήση κληρονομικότητας. Με τον όρο αφαίρεση νοείται μια αφηρημένη κλάση που ορίζει μια διασύνδεση (ένα σύνολο υπογραφών), ενώ υλοποιήσεις είναι οι συγκεκριμένες παράγωγες κλάσεις οι οποίες υλοποιούν τις μεθόδους της αφηρημένης κλάσεις. Η προσέγγιση αυτή ωστόσο, συνδέει με μόνιμο τρόπο την αφαίρεση και τις υλοποιήσεις, καθιστώντας δύσκολη την επέκταση, τροποποίηση και επαναχρησιμοποίηση αφαιρέσεων και υλοποιήσεων ανεξάρτητα. Το πρότυπο "Γέφυρα" είναι σχετικά δύσκολο στην κατανόησή του. Χρησιμοποιείται ωστόσο σε πληθώρα περιπτώσεων όπου εντοπίζονται: Μεταβολές στην αφαίρεση μιας έννοιας Μεταβολές στον τρόπο υλοποίησης της έννοιας αυτής

22 174 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΣΧΕΔΙΑΣΗ Η Γέφυρα αντίκειται στη συνήθη τάση χειρισμού αντίστοιχων καταστάσεων μόνο με κληρονομικότητα. Ικανοποιεί όμως δύο από τους βασικούς κανόνες της αντικειμενοστρεφούς κοινότητας: "Εντοπίστε αυτό που μεταβάλλεται και ενσωματώστε το", και "προτιμήστε τη σύνθεση αντικειμένων από την κληρονομικότητα κλάσεων" Παράδειγμα Θεωρούμε μια εφαρμογή η οποία χειρίζεται τις πληρωμές τεχνικών υπαλλήλων (TechEmployees). Η πληρωμή των υπαλλήλων είναι δυνατόν να πραγματοποιείται είτε με βάση το μηνιαίο μισθό, είτε με βάση τον αριθμό ωρών εργασίας ανά μήνα και την αντίστοιχη α- μοιβή ανά ώρα. Ο υπολογισμός του μισθού, κρατήσεων κλπ. πραγματοποιείται από δύο ανεξάρτητα προγράμματα, που αντιστοιχούν στις κλάσεις PayPerMonth και PayPerHour. Η εφαρμογή θα πρέπει να είναι σε θέση να λειτουργήσει με υπάλληλο οποιασδήποτε κατηγορίας πληρωμής, αλλά δεν οφείλει να γνωρίζει εκ των προτέρων τον τρόπο πληρωμής κάθε υπαλλήλου. Με άλλα λόγια, ο τρόπος πληρωμής (που υλοποιείται προγραμματιστικά ως μια σύνδεση με μία από τις δύο κλάσεις πληρωμών), μπορεί να τροποποιηθεί κατά τη διάρκεια της εκτέλεσης του προγράμματος. Οι υπάλληλοι θα σχετίζονται με συγκεκριμένο τρόπο πληρωμής κατά την υλοποίηση των αντικειμένων τους, και κατά συνέπεια είναι λογικό η εφαρμογή να διατηρεί έναν δείκτη προς μια αφηρημένη κλάση Τεχνικός Υπάλληλος (TechEmployee) από την οποία θα κληρονομούν οι δύο συγκεκριμένες κατηγορίες με βάση τον τρόπο πληρωμής. Η κάθε κατηγορία διατηρεί δείκτη προς την αντίστοιχη κλάση υπολογισμού του μισθού. Το διάγραμμα κλάσεων για την περίπτωση αυτή παρουσιάζεται στο Σχήμα Client TechEmployee +calcsalary() TechEmployee1 TechEmployee2 +calcsalary() +calcsalary() PayPerMonth PayPerHour +paytechempl() +paytechempl() Σχήμα 6.5.1: Σχέδιο συστήματος πληρωμής Υπαλλήλων Είναι ωστόσο γνωστό, ότι στην ανάπτυξη λογισμικού, η τροποποίηση των απαιτήσεων είναι αναπόφευκτη. Έστω, ότι ζητείται ο εμπλουτισμός της εφαρμογής, ώστε να μπορεί να

23 6 Πρότυπα σχεδίασης 175 χειρίζεται και την πληρωμή πωλητών (SalesEmployees), οι οποίοι είναι επίσης δυνατόν να πληρώνονται με οποιονδήποτε από τους δύο τρόπους. Η προφανής αντιμετώπιση του προβλήματος από έναν αναλυτή αντικειμενοστρεφών συστημάτων είναι η χρήση κληρονομικότητας. Ορίζοντας μια επιπλέον αφηρημένη κλάση, τύπου Υπάλληλος (Employee), είναι δυνατόν να κληρονομούν οι δύο ειδικές κατηγορίες υπαλλήλων (τεχνικοί και πωλητές), ώστε η εφαρμογή να συνεχίσει να μπορεί να χειρίζεται οποιονδήποτε υπάλληλο. Η ανάλυση αυτή, οδηγεί στο διάγραμμα κλάσεων του Σχήματος Client Employee +calcsalary() TechEmployee SalesEmployee +calcsalary() +calcsalary() TechEmployee1 TechEmployee2 SalesEmployee1 SalesEmployee2 +calcsalary() +calcsalary() +calcsalary() +calcsalary() PayPerMonth PayPerHour +paytechempl() +paysalesempl() +paytechempl() +paysalesempl() Σχήμα 6.5.2: Σχέδιο συστήματος πληρωμής Τεχνικών Υπαλλήλων και Πωλητών Είναι εύκολο να αντιληφθεί κανείς την πολυπλοκότητα του σχεδίου που θα προκύψει σε περίπτωση που υπάρξει μεταβολή στην υλοποίηση, όπως για παράδειγμα αν προστεθεί ένας επιπλέον τρόπος πληρωμής (π.χ. ανά τεμάχιο). Ο αριθμός των συγκεκριμένων κλάσεων που αναπαριστούν κατηγορίες υπαλλήλων/τρόπων πληρωμής, θα αυξηθεί σε έξι. Αντίστοιχο πρόβλημα θα προκύψει και σε περίπτωση που μεταβληθεί και η αφαίρεση, όπως για παράδειγμα αν προστεθεί μία επιπλέον κατηγορία υπαλλήλου. Η εκρηκτική αυτή αύξηση του αριθμού των κλάσεων στο σύστημα, προκαλείται διότι η αφαίρεση (οι κατηγορίες των Υπαλλήλων) και οι υλοποιήσεις (οι διαφορετικοί τρόποι πληρωμών) έχουν υψηλή σύζευξη. Κάθε τύπος Υπαλλήλου πρέπει να γνωρίζει την κλάση που υπολογίζει την πληρωμή του. Ο στόχος του προτύπου σχεδίασης "Γέφυρα" είναι ο

24 176 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΣΧΕΔΙΑΣΗ διαχωρισμός των μεταβολών στην αφαίρεση από τις μεταβολές στην υλοποίηση, ώστε ο αριθμός των κλάσεων να αυξάνει γραμμικά. Η στρατηγική για την αντιμετώπιση του προβλήματος συνίσταται αφενός στον εντοπισμό των εννοιών που μεταβάλλονται και στην ενσωμάτωσή τους και αφετέρου στην επιλογή σύνθεσης στη θέση της κληρονομικότητας. Στη συγκεκριμένη εφαρμογή μεταβάλλονται οι έννοιες του Υπαλλήλου (Employee) και του Τρόπου Πληρωμής (Pay). Η ενσωμάτωση των εννοιών που μεταβάλλονται επιτυγχάνεται με τη χρήση αφηρημένων κλάσεων για κάθε έννοια. Οι διάφορες έννοιες πλέον αναπαριστώνται ως παράγωγες κλάσεις αυτών των αφηρημένων κλάσεων (Σχήμα 6.5.3). Employee Pay +calcsalary() +paytechempl() +paysalesempl() TechEmployee SalesEmployee PayPerMonth PayPerHour +calcsalary() +calcsalary() +paytechempl() +paysalesempl() +paytechempl() +paysalesempl() Σχήμα 6.5.3: Αναπαράσταση μεταβαλλόμενων εννοιών Το ερώτημα που τίθεται είναι με ποιο τρόπο οι δύο αυτές ομάδες κλάσεων θα συσχετιστούν μεταξύ τους. Η κληρονομικότητα ωστόσο πρέπει να αποφευχθεί, διότι η εισαγωγή ενός επιπλέον επιπέδου δημιουργεί τα προβλήματα που συζητήθηκαν προηγουμένως. Α- κολουθώντας τον κανόνα που επιβάλλει να προτιμηθεί η σύνθεση, επιλέγεται η χρήση μιας σχέσης περιεκτικότητας του τρόπου πληρωμής (Pay) στην έννοια του Υπαλλήλου (Employee). Κατά τον τρόπο αυτό προκύπτει το διάγραμμα κλάσεων του Σχήματος που συνιστά εφαρμογή του προτύπου "Γέφυρα". Employee Pay +calcsalary() +paytechempl() +paysalesempl() TechEmployee SalesEmployee PayPerMonth PayPerHour +calcsalary() Αφαίρεση Υπάλληλος +calcsalary() +paytechempl() +paysalesempl() Υλοποίηση Πληρωμής +paytechempl() +paysalesempl() Σχήμα 6.5.4: Διαχωρισμός Αφαίρεσης και Υλοποίησης με χρήση του προτύπου "Γέφυρα"

25 6 Πρότυπα σχεδίασης 177 Τα πλεονεκτήματα της εφαρμογής του ανωτέρω προτύπου είναι τα εξής: Οι υλοποιήσεις δεν είναι μόνιμα συσχετισμένες με μια διασύνδεση. Η υλοποίηση μιας αφαίρεσης μπορεί να διαμορφώνεται ή και να τροποποιείται κατά το χρόνο εκτέλεσης. Στο παράδειγμα, ένα αντικείμενο τύπου TechEmployee μπορεί κατά την εκτέλεση του προγράμματος να συσχετιστεί με τον τρόπο πληρωμής ανά ώρα και στη συνέχεια να τροποποιηθεί ο τρόπος πληρωμής του σε πληρωμή ανά μήνα. Οποιαδήποτε αλλαγή στις υλοποιήσεις, δεν απαιτεί μεταγλώττιση των κλάσεων στην ιεραρχία της αφαίρεσης ή των προγραμμάτων που τις χρησιμοποιούν. Οποιαδήποτε από τις δύο ιεραρχίες κλάσεων (Αφαίρεση και Υλοποίηση) μπορεί να επεκταθεί (προσθέτοντας περισσότερα επίπεδα) με τρόπο ανεξάρτητο Υλοποίηση Η αφηρημένη κλάση Employee ορίζει την αφαίρεση ενός Υπαλλήλου ώστε να μπορεί να χρησιμοποιηθεί από προγράμματα-πελάτες (C++, η υλοποίηση των μεθόδων συμπεριλαμβάνεται στη δήλωση της κλάσης για λόγους συντομίας): class Employee public: Employee(Pay* payimpl) payimplementation = payimpl; virtual void calcsalary()=0; void setmonthlysalary(double amount) monthlysalary = amount; double getmonthlysalary() return monthlysalary; void sethoursworked(int hours) hoursworked = hours; void sethourlysalary(double amount) hourlysalary = amount; int gethoursworked() return hoursworked; double gethourlysalary() return hourlysalary; Pay* getpayimplementation() return payimplementation; void setpayimplementation(pay* impl) payimplementation = impl; private: Pay* payimplementation; int hoursworked; float monthlysalary; float hourlysalary; ; Η κλάση Employee διατηρεί έναν δείκτη προς την κλάση Pay, υλοποιώντας τη γέφυρα μεταξύ αφαίρεσης και υλοποίησης. Οι ιδιότητες hoursworked, monthlysalary και hourlysalary, κληρονομούνται από όλες τις παράγωγες κλάσεις που αφορούν σε ειδικότερες κατηγορίες υπαλλήλων, δεν λαμβάνουν όμως τιμές σε όλες τις περιπτώσεις. Μια παράγωγος κλάση είναι για παράδειγμα η κατηγορία των Τεχνικών Υπαλλήλων:

26 178 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΣΧΕΔΙΑΣΗ class TechEmployee : public Employee public: TechEmployee(Pay* payimpl); virtual void calcsalary(); ; TechEmployee::TechEmployee(Pay* payimpl) : Employee(payImpl) void TechEmployee::calcSalary() getpayimplementation()->paytechempl(this); Η υπερβατή (virtual) μέθοδος calcsalary() είναι πλέον ορισμένη για αυτήν την κλάση, καθώς πρέπει να παρέχεται μια συγκεκριμένη υλοποίησή της. Στο σώμα της calcsalary() καλείται μέσω του δείκτη που διατηρεί κάθε κλάση της ιεραρχίας, η κατάλληλη μέθοδος της κλάσης στην ιεραρχία των κλάσεων που παρέχουν υλοποίηση του τρόπου πληρωμής. Ο δείκτης λαμβάνει τιμή κατά την κλήση του κατασκευαστή. Η calcsalary() μεταβιβάζει επιπλέον στο αντικείμενο της κλάσης πληρωμής και τον δείκτη του αντικειμένου, ώστε να μπορούν να ληφθούν οι απαραίτητες πληροφορίες. Η αφηρημένη κλάση Pay στην κορυφή της ιεραρχίας υλοποίησης δηλώνει μόνο τη διασύνδεση προς τις λειτουργίες των υποκείμενων κλάσεων: class Pay public: virtual void paytechempl(employee*) = 0; virtual void paysalesempl(employee*) = 0; ; ενώ οι συγκεκριμένοι τρόποι πληρωμής των Υπαλλήλων υποστηρίζονται από τις παράγωγες κλάσεις της Pay: class PayPerMonth : public Pay public: virtual void paytechempl(employee* emp); virtual void paysalesempl(employee* emp); ; void PayPerMonth::payTechEmpl(Employee* emp) double endsalary; endsalary = emp->getmonthlysalary(); endsalary = endsalary * 0.9; //αφαίρεση φόρου 10% cout << "Tech. Employee, Pay Per Month: " << endsalary << endl; ;

27 6 Πρότυπα σχεδίασης 179 void PayPerMonth::paySalesEmpl(Employee* emp) double endsalary; endsalary = emp->getmonthlysalary(); endsalary = endsalary * 0.8; // αφαίρεση φόρου 20% cout << "Sales Employee, Pay Per Month: " << endsalary << endl; ; class PayPerHour : public Pay public: virtual void paytechempl(employee* emp); virtual void paysalesempl(employee* emp); ; void PayPerHour::paySalesEmpl(Employee* emp) double endsalary; endsalary = emp->gethourlysalary() * emp->gethoursworked(); endsalary = endsalary * 0.95; //αφαίρεση φόρου 5% cout << "Sales Employee, Pay Per Hour: " << endsalary << endl;; ; void PayPerHour::payTechEmpl(Employee* emp) double endsalary; endsalary = emp->gethourlysalary() * emp->gethoursworked(); endsalary = endsalary * 0.85; // αφαίρεση φόρου 15% cout << "Technical Employee, Pay Per Hour: " << endsalary << endl;; ; Στο ανωτέρω παράδειγμα όπου η κλάση PayPerMonth ορίζει τον τρόπο πληρωμής ανά μήνα και η κλάση PayPerHour τον τρόπο πληρωμής ανά ώρα εργασίας, για λόγους α- πλότητας, η διαφορά μεταξύ Τεχνικών Υπαλλήλων και Πωλητών συνίσταται σε διαφορετική παρακράτηση φόρου. Η συσχέτιση ενός Υπαλλήλου με συγκεκριμένο τρόπο πληρωμής μπορεί να πραγματοποιηθεί και να τροποποιηθεί κατά τη διάρκεια της εκτέλεσης του προγράμματος: int main() PayPerMonth Pay1; PayPerHour Pay2; //υλοποίηση αντικειμένων τρόπου πληρωμής TechEmployee Fred(&Pay1); //δήλωση Τεχνικού Υπαλλήλου Fred.setMonthlySalary( ); Fred.calcSalary(); //υπολογισμός μισθού με βάση το μήνα Fred.setPayImplementation(&Pay2); //αλλαγή τρόπου πληρωμής

28 180 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΣΧΕΔΙΑΣΗ Fred.setHourlySalary(15.70); Fred.setHoursWorked(38); Fred.calcSalary(); //υπολογισμός μισθού με βάση τις ώρες return 0; Γενική Δομή Εφαρμογή Μια "Γέφυρα" χρησιμοποιείται όταν: μια έννοια (αφαίρεση) μπορεί να σχετίζεται με διάφορες υλοποιήσεις οι οποίες μπορεί να τροποποιούνται κατά τη διάρκεια εκτέλεσης οι αφαιρέσεις και οι υλοποιήσεις τους θα πρέπει να είναι επεκτάσιμες μέσω κληρονομικότητας. Σε αυτή την περίπτωση, το πρότυπο "Γέφυρα" σας επιτρέπει να συνδυάσετε τις διάφορες αφαιρέσεις και υλοποιήσεις και να τις επεκτείνετε ανεξάρτητα. Πελάτης Αφαίρεση υλοπ Υλοποίηση +Λειτουργία() υλοπ -> ΥλοπΛειτουργία(); +ΥλοπΛειτουργία() ΕκλεπτυσμένηΑφαίρεση ΣυγκεκριμένηΥλοποίησηΑ +ΥλοπΛειτουργία() ΣυγκεκριμένηΥλοποίησηΒ +ΥλοπΛειτουργία() Σχήμα 6.5.5: Διάγραμμα κλάσεων προτύπου "Γέφυρα" 6.6 Παρατηρητής Εισαγωγή Το πρότυπο σχεδίασης "Παρατηρητής" (Observer) είναι επίσης γνωστό ως πρότυπο "Δημοσίευση-Εγγραφή" (Publish-Subscribe). Oρίζει μια σχέση εξάρτησης ένα-προς-πολλά μεταξύ αντικειμένων έτσι ώστε όταν μεταβάλλεται η κατάσταση ενός αντικειμένου, όλα τα ε- ξαρτώμενα αντικείμενα να ενημερώνονται και τροποποιούνται αυτόματα. Καθώς ο στόχος της αντικειμενοστρεφούς σχεδίασης είναι η δημιουργία ενός συνόλου αλληλεπιδρώντων αντικειμένων, ένα από τα συχνά προβλήματα είναι η αναγκαιότητα συνεργασίας μεταξύ κλάσεων, γεγονός που οδηγεί σε υψηλή σύζευξη. Ορισμένα από τα πρότυπα σχεδίασης, με χαρακτηριστικότερο το πρότυπο "Παρατηρητής", επιδιώκουν να μειώσουν τη σύζευξη μεταξύ των αντικειμένων, παρέχοντας αυξημένη δυνατότητα επα-

29 6 Πρότυπα σχεδίασης 181 ναχρησιμοποίησης και τροποποίησης του συστήματος. Το συγκεκριμένο πρότυπο, επιτρέπει την αυτόματη ειδοποίηση και ενημέρωση ενός συνόλου αντικειμένων τα οποία "αναμένουν" ένα γεγονός, που εκδηλώνεται ως αλλαγή στην κατάσταση ενός αντικειμένου. Ο στόχος είναι η από-σύζευξη των παρατηρητών από το παρακολουθούμενο αντικείμενο (υποκείμενο), έτσι ώστε κάθε φορά που προστίθεται ένας νέος παρατηρητής (με διαφορετική διασύνδεση ενδεχομένως), να μην απαιτούνται αλλαγές στο παρακολουθούμενο α- ντικείμενο. Το συγκεκριμένο πρότυπο είναι από τα πλέον ευρέως χρησιμοποιούμενα και υλοποιείται με σχετική ευκολία σε διάφορες γλώσσες προγραμματισμού. Η εφαρμογή του προτύπου προϋποθέτει τον εντοπισμό των εξής δύο τμημάτων: ενός υποκειμένου και του παρατηρητή. Μεταξύ των δύο υφίσταται μια συσχέτιση ένα-προς-πολλά. Το υποκείμενο θεωρείται ότι διατηρεί το μοντέλο των δεδομένων και η λειτουργικότητα που αφορά στην παρατήρηση των δεδομένων κατανέμεται σε διακριτά αντικείμενα παρατηρητές. Οι παρατηρητές καταχωρούνται στο υποκείμενο κατά τη δημιουργία τους. Οποτεδήποτε το υποκείμενο αλλάζει, "ανακοινώνει" προς όλους τους καταχωρημένους παρατηρητές το γεγονός της αλλαγής, και κάθε παρατηρητής ερωτά το υποκείμενο για το υποσύνολο της κατάστασης του υποκειμένου που το ενδιαφέρει. Στο ανωτέρω πρωτόκολλο επικοινωνίας η πληροφορία "αντλείται", αντί να αποστέλλεται στους παρατηρητές. Το πρότυπο "Παρατηρητής" εφαρμόζεται για χρόνια στην ευρέως γνωστή αρχιτεκτονική Μοντέλου-Όψης-Έλεγκτή (Model-View-Controller) Παράδειγμα Θεωρούμε μια κλάση Timer η οποία υλοποιεί ένα χρονόμετρο (ο φυσικός μηχανισμός της μέτρησης δεν μας ενδιαφέρει, θεωρούμε ότι η κατάσταση του χρονομέτρου τίθεται από εξωτερική πηγή στο συγκεκριμένο παράδειγμα από το χρήστη). Την τιμή του χρονομέτρου εμφανίζουν στην οθόνη, υπό διαφορετικές μορφές (στο δεκαεξαδικό, οκταδικό και δυαδικό σύστημα) διάφοροι παρατηρητές. Σκοπός είναι η αυτόματη ενημέρωση όλων των "οθονών" οποτεδήποτε αλλάζει η κατάσταση του χρονομέτρου. Το πρώτο ζητούμενο είναι όλοι οι παρατηρητές να έχουν την ίδια διασύνδεση, ώστε να μην απαιτείται η τροποποίηση του υποκειμένου (χρονομέτρου) κάθε φορά που προστίθεται ένας νέος παρατηρητής. Αυτό επιτυγχάνεται επιβάλλοντας σε όλες τις κλάσεις παρατηρητών να κληρονομούν μια αφηρημένη βασική κλάση ή μια διασύνδεση (αφηρημένη κλάση Observer). Επειδή είναι επιθυμητό η ευθύνη της παρακολούθησης του υποκειμένου (χρονομέτρου) να ανήκει στους παρατηρητές (οθόνες), κάθε αντικείμενο Παρατηρητής θα πρέπει να μπορεί να καταχωρεί τον εαυτό του σε μια λίστα παρατηρητών που διαθέτει το χρονόμετρο. Καθώς όλοι οι παρατηρητές είναι ιδίου τύπου (ως απόγονοι της κλάσης Observer) αρκεί η προσθήκη μεθόδων προσθήκης (attach()) και διαγραφής (detach()) παρατηρητών σε μια δομή δεδομένων του υποκειμένου. Πλέον η ανακοίνωση ενός συμβάντος (π.χ. αλλαγή τιμής του χρονομέτρου) στους παρατηρητές γίνεται με τη σάρωση της λίστας των παρατηρητών και την κλήση μιας κοινής μεθόδου ενημέρωσης (update()). Η μέθοδος update() της κάθε οθόνης υλοποιεί τον

Πρότυπα Σχεδίασης. Design Patterns

Πρότυπα Σχεδίασης. Design Patterns Πρότυπα Σχεδίασης Design Patterns 1 Πρότυπα Σχεδίασης Όλα ξεκίνησαν από.. την Αρχιτεκτονική!! Christopher Alexander, The Timeless Way of Building, Oxford University Press, New York, 1979: "Είναι η ποιότητα

Διαβάστε περισσότερα

Πρότυπα Σχεδίασης. Πρότυπα Σχεδίασης. Πρότυπα Σχεδίασης. Πρότυπα Σχεδίασης

Πρότυπα Σχεδίασης. Πρότυπα Σχεδίασης. Πρότυπα Σχεδίασης. Πρότυπα Σχεδίασης Design Patterns Όλα ξεκίνησαν από.. την Αρχιτεκτονική!! Christopher Alexander, The Timeless Way of Building, Oxford University Press, New York, 1979: "Είναι η ποιότητα µία αντικειµενική ιδιότητα? " Αν

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Πρότυπα Σχεδίασης. Design Patterns

Πρότυπα Σχεδίασης. Design Patterns Πρότυπα Σχεδίασης Design Patterns 1 Bridge (Γέφυρα) Κατηγορία: Structural Σκοπός: Η αποσύνδεση μιας αφαίρεσης από την υλοποίησή της, ώστε να μπορούν να μεταβάλλονται ανεξάρτητα. Συνώνυμα: Handle/Body 2

Διαβάστε περισσότερα

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης ΠΟΛΥΜΟΡΦΙΣΜΟΣ Λόγω της θεμελιώδους σημασίας της έννοιας του πολυμορφισμού (polymorphism) στην αντικειμενοστρεφή σχεδίαση, κρίνεται σκόπιμο στο σημείο αυτό του βιβλίου να αναλυθεί εκτενέστερα. Ο πολυμορφισμός

Διαβάστε περισσότερα

Πρότυπα Σχεδίασης. Design Patterns

Πρότυπα Σχεδίασης. Design Patterns Πρότυπα Σχεδίασης Design Patterns 1 Bridge (Γέφυρα) Κατηγορία: Structural Σκοπός: Η αποσύνδεση μιας αφαίρεσης από την υλοποίησή της, ώστε να μπορούν να μεταβάλλονται ανεξάρτητα. Συνώνυμα: Handle/Body 2

Διαβάστε περισσότερα

Bridge (Γέφυρα) Πρότυπα Σχεδίασης

Bridge (Γέφυρα) Πρότυπα Σχεδίασης Πρότυπα Σχεδίασης Κατηγορία: Structural Σκοπός: Η αποσύνδεση µιας αφαίρεσης από την υλοποίησή της, ώστε να µπορούν να µεταβάλλονται ανεξάρτητα. Συνώνυµα: Handle/Body Design Patterns 1 2 Όταν µία αφαίρεση

Διαβάστε περισσότερα

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

public void printstatement() { System.out.println(Employee:  + name +  with salary:  + salary); Κληρονομικότητα Η κληρονομικότητα (inheritance) αποτελεί έναν από τους χαρακτηριστικότερους μηχανισμούς των αντικειμενοστρεφών γλωσσών προγραμματισμού. Επιτρέπει την δημιουργία μιας νέας κλάσης απορροφώντας

Διαβάστε περισσότερα

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

Διαγράμματα Κλάσεων στη Σχεδίαση Διαγράμματα Κλάσεων στη Σχεδίαση περιεχόμενα παρουσίασης Αφηρημένες κλάσεις Ιδιότητες Λειτουργίες Απλοί τύποι Συσχετίσεις Εξάρτηση Διεπαφές αφηρημένες κλάσεις Οι αφηρημένες κλάσεις δεν μπορούν να δημιουργήσουν

Διαβάστε περισσότερα

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

Αντικειμενοστρεφής Προγραμματισμός ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΙΚΑ ΜΑΘΗΜΑΤΑ Αντικειμενοστρεφής Προγραμματισμός Ενότητα 15: Σχεδίαση Εφαρμογών Γρηγόρης Τσουμάκας, Επικ. Καθηγητής Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

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

Μοτίβα Σχεδίασης (Design Patterns) Ενότητα 6 Μοτίβα Σχεδίασης (Design Patterns) Ορισµοί βασικές έννοιες. Σηµαντικά µοτίβα σχεδίασης: Παρατηρητής (Observer). Πρόσοψη (Façade). Προσαρµογέας (Adapter). Πληρεξούσιος (Proxy). Μοναχοπαίδι (Singleton).

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #13 Wrapper Classes, Abstract Classes and Interfaces Διάλεξη #13: Μεταβλητές/μέθοδοι κλάσης, αφηρημένες κλάσεις και διαπροσωπείες Μεταβλητές /πεδία κλάσης [class variables] Τα αντικείμενα ανήκουν σε κλάσεις

Διαβάστε περισσότερα

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

Κλάσεις και Αντικείµενα Κλάσεις και Αντικείµενα Γρηγόρης Τσουµάκας Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης Κλάσεις και Αντικείµενα 2 Τα αντικείµενα σε µια αντικειµενοστρεφή γλώσσα προγραµµατισµού, µοντελοποιούν

Διαβάστε περισσότερα

ΑΝΑΛΥΣΗ ΑΠΑΙΤΗΣΕΩΝ ανάλυση απαιτήσεων Σε αυτό το μάθημα θα ασχοληθούμε με : Δημιουργία μοντέλων

ΑΝΑΛΥΣΗ ΑΠΑΙΤΗΣΕΩΝ ανάλυση απαιτήσεων Σε αυτό το μάθημα θα ασχοληθούμε με : Δημιουργία μοντέλων ΑΝΑΛΥΣΗ ΑΠΑΙΤΗΣΕΩΝ Οι Μηχανικοί Λογισμικού παράγουν μοντέλα που βοηθούν στη διατύπωση των απαιτήσεων με τη μορφή προδιαγραφών. Η εργασία της παραγωγής μοντέλων περιγράφεται ως ανάλυση απαιτήσεων. Η ανάλυση

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Εργαστήριο Τεχνολογίας Λογισμικού και Ανάλυσης Συστημάτων - 4 ο Εργαστήριο - ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΤΜΗΜΑ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ 3 ο ΕΞΑΜΗΝΟ Εργαστήριο Τεχνολογίας Λογισμικού και Ανάλυσης Συστημάτων - 4 ο Εργαστήριο - ΕΠΙΜΕΛΕΙΑ ΜΑΘΗΜΑΤΟΣ: Πρέντζα Ανδριάννα ΕΠΙΜΕΛΕΙΑ ΕΡΓΑΣΤΗΡΙΟΥ: Στουγιάννου

Διαβάστε περισσότερα

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

3 Αλληλεπίδραση Αντικειμένων Αφαίρεση και Αρθρωσιμότητα 3 Αλληλεπίδραση Αντικειμένων Πώς συνεργάζονται τα αντικείμενα που δημιουργούμε Αφαίρεση (abstraction) είναι η δυνατότητα να αγνοούμε τις λεπτομέρειες και να εστιάζουμε την προσοχή

Διαβάστε περισσότερα

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

2.1 Αντικειµενοστρεφής προγραµµατισµός 2.1 Αντικειµενοστρεφής προγραµµατισµός Στον αντικειµενοστρεφή προγραµµατισµό (object oriented programming, OOP) ένα πρόγραµµα υπολογιστή είναι ένα σύνολο αλληλεπιδρώντων αντικειµένων. Μπορεί να ειπωθεί

Διαβάστε περισσότερα

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

Οντοκεντρικός Προγραμματισμός Οντοκεντρικός Προγραμματισμός Ενότητα 2: Η ΓΛΩΣΣΑ JAVA Κληρονομικότητα ΔΙΔΑΣΚΟΝΤΕΣ: Ιωάννης Χατζηλυγερούδης, Χρήστος Μακρής Πολυτεχνική Σχολή Τμήμα Μηχανικών Η/Υ & Πληροφορικής ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ

Διαβάστε περισσότερα

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

J-GANNO. Σύντοµη αναφορά στους κύριους στόχους σχεδίασης και τα βασικά χαρακτηριστικά του πακέτου (προέκδοση 0.9Β, Φεβ.1998) Χάρης Γεωργίου J-GANNO ΓΕΝΙΚΕΥΜΕΝΟ ΠΑΚΕΤΟ ΥΛΟΠΟΙΗΣΗΣ ΤΕΧΝΗΤΩΝ ΝΕΥΡΩΝΙΚΩΝ ΙΚΤΥΩΝ ΣΤΗ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ JAVA Σύντοµη αναφορά στους κύριους στόχους σχεδίασης και τα βασικά χαρακτηριστικά του πακέτου (προέκδοση 0.9Β,

Διαβάστε περισσότερα

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA Τι θα συζητήσουμε σήμερα Πώς υλοποιούμε συσχετίσεις μεταξύ κλάσεων απλές και πολλαπλές συσχετίσεις κληρονομικότητα Static, final Overloading Overriding Hiding

Διαβάστε περισσότερα

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

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα; Εισαγωγή Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα; 1. Σελίδα μαθήματος Εγγραφή Ο κάθε φοιτητής πρέπει να κάνει εγγραφή στη σελίδα του μαθήματος στην πλατφόρμα e-class

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Διάγραμμα Κλάσεων. Class Diagram

Διάγραμμα Κλάσεων. Class Diagram Διάγραμμα Κλάσεων Class Diagram Γενικά Ορίζει τις κλάσεις αντικειμένων σε ένα σύστημα, τις μεθόδους και τις συναρτήσεις τους, και τις συσχετίσεις μεταξύ των κλάσεων. Περιγράφουν την δομή και συμπεριφορά

Διαβάστε περισσότερα

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C# Εισαγωγή σε αντικειμενοστραφή concepts Και λίγη C# Κλάσεις Κλάση: τύπος δεδομένων που αποτελεί συλλογή πεδίων, ορισμών συναρτήσεων/μεθόδων και ορισμών άλλων τύπων δεδομένων. Αντίστοιχο σκεπτικό με struct

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΑΚΩΝ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΠΡΟΠΤΥΧΙΑΚΟ ΠΡΟΓΡΑΜΜΑ ΣΠΟΥΔΩΝ ΜΑΘΗΜΑ: ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ ΜΟΝΤΕΛΑ ΣΥΣΤΗΜΑΤΟΣ Διδάσκων: Γ. Χαραλαμπίδης, Επ. Καθηγητής

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

ΑΠΛΗ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ

ΑΠΛΗ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ Μηχανισµός υλοποίησης των σχέσεων γενίκευσης/εξειδίκευσης µεταξύ κλάσεων Η σχέση εξειδίκευσης «υποκλάση-της» (subclass-of)είναι γνωστή σαν σχέση «είναι ένα» (isa) ή «είναι ένα είδος» (ako:

Διαβάστε περισσότερα

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ Κων. Κόκκινος Μεταβλητές-1 Οι μεταβλητές αποτελούν θέσεις μνήμης στις οποίες αποθηκεύονται τιμές αντίστοιχες

Διαβάστε περισσότερα

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

Από τη UML στον Κώδικα. Μέρος Α Από τη UML στον Κώδικα Μέρος Α περιεχόμενα παρουσίασης Κλάσεις Ισότητα αντικειμένων Μονόδρομες συσχετίσεις με πολλαπλότητα «ένα» Μονόδρομες συσχετίσεις με πολλαπλότητα «πολλά» Συλλογές από το σχέδιο στον

Διαβάστε περισσότερα

ΕΠΛ233 Βιβλιοθήκες και Προσδιοριστές Πρόσβασης στην JAVA

ΕΠΛ233 Βιβλιοθήκες και Προσδιοριστές Πρόσβασης στην JAVA Βιβλιοθήκες και Προσδιοριστές Πρόσβασης στην JAVA 2 «Μονάδα Μετάφρασης» 2 «Μονάδα Μετάφρασης» Όταν δημιουργείται ένα αρχείο πηγαίου κώδικα στην Java, το αρχείο καλείται µονάδα µετάφρασης (compilation unit)

Διαβάστε περισσότερα

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

Εισαγωγή στη Σχεδίαση Λογισμικού Εισαγωγή στη Σχεδίαση Λογισμικού περιεχόμενα παρουσίασης Τι είναι η σχεδίαση λογισμικού Έννοιες σχεδίασης Δραστηριότητες σχεδίασης Σχεδίαση και υποδείγματα ανάπτυξης λογισμικού σχεδίαση Η σχεδίαση του

Διαβάστε περισσότερα

Η κατασκευή αντικειμένων της κλάσης Student μπορεί να πραγματοποιηθεί είτε στη main είτε σε οποιαδήποτε μέθοδο κλάσης:

Η κατασκευή αντικειμένων της κλάσης Student μπορεί να πραγματοποιηθεί είτε στη main είτε σε οποιαδήποτε μέθοδο κλάσης: Αντικειμενοστρεφής Προγραμματισμός Τμήμα Εφαρμοσμένης Πληροφορικής Δημιουργία Κλάσεων/Αντικειμένων/Συσχετίσεων/Συνδέσεων Δημιουργία κλάσεων και αντικειμένων Θεωρούμε ένα υποθετικό σύστημα που αναφέρεται

Διαβάστε περισσότερα

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth. Το πρόγραμμα HelloWorld.java Σχόλια στη Java HelloWorld Παύλος Εφραιμίδης pefraimi ee.duth.gr Java Το πρόγραμμα HelloWorld 1 Java Το πρόγραμμα HelloWorld 2 Σχόλια στη Java ΗγλώσσαJava υποστηρίζει

Διαβάστε περισσότερα

Σύνθεση και Κληρονομικότητα

Σύνθεση και Κληρονομικότητα Σύνθεση και Κληρονομικότητα Σύνθεση (composition) Κληρονομικότητα (inheritance) Υπερφόρτωση κληρονομημένων μελών Εικονικές συναρτήσεις και Πολυμορφισμός Αφηρημένες (abstract) βασικές κλάσεις 1 Σύνθεση

Διαβάστε περισσότερα

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

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #12 Διάγραμμα κλάσεων [Class diagram] Διάλεξη #12: Υπο-τύποι και πολυμορφισμός [sub-typing and polymorphism] Database Music Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό,, Slide 1 Εισαγωγή στον Αντικειμενοστρεφή

Διαβάστε περισσότερα

Wrapper Classes, Abstract Classes and Interfaces

Wrapper Classes, Abstract Classes and Interfaces Wrapper Classes, Abstract Classes and Interfaces Εβδοµάδα 3: Κλάσεις συσκευαστές, αφηρηµένες κλάσεις και διαπροσωπείες Αντικείµενα και µη-αντικείµενα Η Java παρέχει τύπους αντικειµένων και απλούς τύπους

Διαβάστε περισσότερα

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Μια δομή δεδομένων στην πληροφορική, συχνά αναπαριστά οντότητες του φυσικού κόσμου στον υπολογιστή. Για την αναπαράσταση αυτή, δημιουργούμε πρώτα ένα αφηρημένο μοντέλο στο οποίο προσδιορίζονται

Διαβάστε περισσότερα

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων Κλάσεις Τροποποιητές, ιασυνδέσεις, Πακέτα Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων Υπάρχουν 4τροποποιητές: default, public, private, protected. Default: εν προηγείται τροποποιητής του ονόµατος

Διαβάστε περισσότερα

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

ΕΡΓΑΣΙΕΣ ΟΝΤΟΚΕΝΤΡΙΚΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΕΡΓΑΣΙΕΣ ΟΝΤΟΚΕΝΤΡΙΚΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ 2016-2017 ΕΡΓΑΣΙΑ 1 (JAVA) Παράδοση 26/4/2017 Στα πλαίσια της εργασίας θα υλοποιηθεί ένα απλοϊκό πρόγραμμα κρατήσεων Ξενοδοχείων. Για απλοποίηση θα περιοριστούμε

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Υποδείγματα Ανάπτυξης Υποδείγματα Ανάπτυξης περιεχόμενα παρουσίασης Αποσύνθεση Αφαίρεση Μοντελοποίηση Η δεδομένο λειτουργική προσέγγιση Η αντικειμενοστρεφής προσέγγιση αποσύνθεση Όταν επιχειρούμε τη λύση ενός προβλήματος, πρώτα

Διαβάστε περισσότερα

Σύνθεση και Κληρονομικότητα

Σύνθεση και Κληρονομικότητα Σύνθεση και Κληρονομικότητα Σύνθεση (composition) Κληρονομικότητα (inheritance) Υπερφόρτωση κληρονομημένων μελών Εικονικές συναρτήσεις και Πολυμορφισμός Αφηρημένες (abstract) βασικές κλάσεις 1 Σύνθεση

Διαβάστε περισσότερα

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA Τι θα συζητήσουμε σήμερα Πώς υλοποιούμε συσχετίσεις μεταξύ κλάσεων απλές και πολλαπλές συσχετίσεις κληρονομικότητα Static, final Overloading Overriding Hiding

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Εισαγωγή στον Προγ/μό Η/Υ

Εισαγωγή στον Προγ/μό Η/Υ Εισαγωγή στον Προγ/μό Η/Υ Ενότητα 7 2ο μέρος: Επιπλέον έννοιες σχετικά με αντικείμενα Διδάσκων: Μιχάλης Τίτσιας Περιεχόμενα Τι μπορεί να περιέχει μια τάξη Μέθοδοι τάξης και σταθερές τάξης Πολυμορφισμός

Διαβάστε περισσότερα

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

Αντικειµενοστρεφής Προγραµµατισµός 16 η διάλεξη Π. Σταθοπούλου pstath@ece.upatras.gr ή pstath@upatras.gr Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Φροντιστήριο : ευτέρα 11πµ-12πµ ΗΛ4 Προηγούµενη ιάλεξη

Διαβάστε περισσότερα

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1 Κλάσεις στη Java Παύλος Εφραιμίδης Java Κλάσεις στη Java 1 Κλάσεις στην Java Θα δούμε τη διαδικασία δημιουργίας μιας κλάσης Θα υλοποιήσουμε μια κλάση για τη Δομή Δεδομένων Stack Java Κλάσεις στη Java 2

Διαβάστε περισσότερα

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack Κλάσεις στην Java Κλάσεις στη Java Παύλος Εφραιμίδης Θα δούμε τη διαδικασία δημιουργίας μιας κλάσης Θα υλοποιήσουμε μια κλάση για τη Δομή Δεδομένων Stack Java Κλάσεις στη Java 1 Java Κλάσεις στη Java 2

Διαβάστε περισσότερα

Εφαρμογή Μεθοδολογίας ICONIX

Εφαρμογή Μεθοδολογίας ICONIX Πρόγραμμα Μεταπτυχιακών Σπουδών στην Εφαρμοσμένη Πληροφορική Προηγμένη Τεχνολογία Λογισμικού, 2016 Α. Χατζηγεωργίου Εφαρμογή Μεθοδολογίας ICONIX Παράδειγμα: Εγγραφή Φοιτητή σε Μάθημα Θέμα Θεωρείστε ότι

Διαβάστε περισσότερα

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( ) ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ Γεώργιος Παπαϊωάννου (2013-16) gepap@aueb.gr Περιγραφή: Μορφές μεταβίβασης ορισμάτων σε συναρτήσεις (και μεθόδους) και οι επιπτώσεις τους Επιστροφή τιμών από κλήση συναρτήσεων Υπερφόρτωση

Διαβάστε περισσότερα

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι 1 ΕΙΣΑΓΩΓΗ Η γλώσσα προγραµµατισµού Java είναι ισχυρά τυποποιηµένη (strongly typed), που σηµαίνει ότι κάθε µεταβλητή και κάθε έκφραση έχει κάποιο τύπο, ο οποίος πρέπει να είναι γνωστός κατά το χρόνο της

Διαβάστε περισσότερα

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

Τεχνολογία Λογισμικού & Ανάλυση Συστημάτων Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων Τεχνολογία Λογισμικού & Ανάλυση Συστημάτων 14/11/2016 Δρ. Ανδριάνα Πρέντζα Αναπληρώτρια Καθηγήτρια aprentza@unipi.gr Class Diagrams Διαγράμματα Κλάσεων Άξονες

Διαβάστε περισσότερα

Διαγράμματα UML στην Ανάλυση. Μέρος Β Διαγράμματα Κλάσεων Διαγράμματα Αντικειμένων

Διαγράμματα UML στην Ανάλυση. Μέρος Β Διαγράμματα Κλάσεων Διαγράμματα Αντικειμένων Διαγράμματα UML στην Ανάλυση Μέρος Β Διαγράμματα Κλάσεων Διαγράμματα Αντικειμένων περιεχόμενα παρουσίασης Διαγράμματα κλάσεων Διαγράμματα αντικειμένων διαγράμματα κλάσεων Χρησιμοποιούνται στην ανάλυση

Διαβάστε περισσότερα

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07 ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07 Αλγόριθμος: Βήμα προς βήμα διαδικασία για την επίλυση κάποιου προβλήματος. Το πλήθος των βημάτων πρέπει να είναι πεπερασμένο. Αλλιώς: Πεπερασμένη

Διαβάστε περισσότερα

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

Αρχιτεκτονική Λογισμικού Αρχιτεκτονική Λογισμικού περιεχόμενα παρουσίασης Τι είναι η αρχιτεκτονική λογισμικού Αρχιτεκτονική και απαιτήσεις Σενάρια ποιότητας Βήματα αρχιτεκτονικής σχεδίασης Αρχιτεκτονικά πρότυπα Διαστρωματωμένη

Διαβάστε περισσότερα

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

Οντοκεντρικός Προγραμματισμός Οντοκεντρικός Προγραμματισμός Ενότητα 2: Η ΓΛΩΣΣΑ JAVA Βασικά Δομικά Στοιχεία ΔΙΔΑΣΚΟΝΤΕΣ: Ιωάννης Χατζηλυγερούδης, Χρήστος Μακρής Πολυτεχνική Σχολή Τμήμα Μηχανικών Η/Υ & Πληροφορικής ΔΟΜΙΚΑ ΣΤΟΙΧΕΙΑ ΔΟΜΙΚΑ

Διαβάστε περισσότερα

Γενικά (για τις γραπτές εξετάσεις)

Γενικά (για τις γραπτές εξετάσεις) Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Διάλεξη #12 η : Επανάληψη Γαβαλάς Δαμιανός dgavalas@aegean.gr Γενικά (για τις γραπτές εξετάσεις) Δεν υπάρχει αυστηρά ορισμένη «ύλη εξετάσεων» (καθώς δεν έχετε

Διαβάστε περισσότερα

Μοντελοποίηση Συστημάτων. Διαγράμματα Κλάσεων ClassDiagrams

Μοντελοποίηση Συστημάτων. Διαγράμματα Κλάσεων ClassDiagrams Μοντελοποίηση Συστημάτων Διαγράμματα Κλάσεων ClassDiagrams Διαγράμματα Κλάσεων Χρησιμοποιούνται στα βήματα: Ανάλυση απαιτήσεων Π.Σ. Σχεδιασμός Π.Σ. Είναι στατικά διαγράμματα που δείχνουν: Κλάσεις Ιδιότητες

Διαβάστε περισσότερα

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07 Πρώτοι αριθμοί ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07 Ένας ακέραιος μεγαλύτερος του 1 είναι πρώτος αν έχει ακριβώς δύο διαιρέτες (τη μονάδα και τον εαυτό του). Πρόβλημα: έλεγχος

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Κεφάλαιο 10 ο Υποπρογράµµατα Κεφάλαιο 10 ο Υποπρογράµµατα Ανάπτυξη Εφαρµογών σε Προγραµµατιστικό Περιβάλλον Η αντιµετώπιση των σύνθετων προβληµάτων και η ανάπτυξη των αντίστοιχων προγραµµάτων µπορεί να γίνει µε την ιεραρχική σχεδίαση,

Διαβάστε περισσότερα

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

Διαδικασίες παραγωγής λογισμικού. Βασικές αρχές Τεχνολογίας Λογισμικού, 8η αγγ. έκδοση Διαδικασίες παραγωγής λογισμικού Περιεχόμενα Παρουσίαση μοντέλων διεργασίας ανάπτυξης λογισμικού Περιγραφή τριών γενικών μοντέλων διεργασίας ανάπτυξης λογισμικού Γενική περιγραφή των διαδικασιών που περιλαμβάνονται

Διαβάστε περισσότερα

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES Κων. Κόκκινος Αντικειμενοστραφής Προγραμματισμός Η ιδέα του αντικειμενοστραφούς προγραμματισμού Αυτόνομες οντότητες Στιγμιότυπα οντοτήτων Παράδειγμα

Διαβάστε περισσότερα

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

Ειδικά Θέματα Προγραμματισμού Ειδικά Θέματα Προγραμματισμού Ενότητα 8: Java Swing Μιχάλας Άγγελος Τμήμα Μηχανικών Πληροφορικής ΤΕ Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό

Διαβάστε περισσότερα

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

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1 Κληρονομικότητα Παύλος Εφραιμίδης pefraimi ee.duth.gr Java Κληρονομικότητα 1 Ιεραρχίες Κλάσεων Στην Java (και γενικότερα στον αντικειμενοστραφή προγραμματισμό) μπορεί από μία να κλάση να δημιουργηθεί

Διαβάστε περισσότερα

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: -Υπερφόρτωση (Overloading), Μεθόδων (Method Overloading), Τελεστών (Operator Overloading (C++, C#))

Διαβάστε περισσότερα

Εμπειρική μελέτη χρήσης αντικειμενοστραφών προτύπων σχεδίασης σε λογισμικό ανοικτού κώδικα

Εμπειρική μελέτη χρήσης αντικειμενοστραφών προτύπων σχεδίασης σε λογισμικό ανοικτού κώδικα ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ Τμήμα Πληροφορικής Πρόγραμμα Μεταπτυχιακών Σπουδών του τμήματος Πληροφορικής Κατεύθυνση "Πληροφοριακά Συστήματα Εμπειρική μελέτη χρήσης αντικειμενοστραφών προτύπων

Διαβάστε περισσότερα

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( ) Τύποι Δεδομένων και Απλές Δομές Δεδομένων Παύλος Εφραιμίδης V1.0 (2014-01-13) Απλές Δομές Δεδομένων Στην ενότητα αυτή θα γνωρίσουμε ορισμένες απλές Δομές Δεδομένων και θα τις χρησιμοποιήσουμε για την αποδοτική

Διαβάστε περισσότερα

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

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2 Ανασκόπηση Μια εφαρμογή Java είναι ένα σύνολο από συνεργαζόμενες κλάσεις Διάλεξη #2: Αντικείμενα, Κλάσεις και Μέθοδοι Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό,, Slide 1 Εισαγωγή στον Αντικειμενοστρεφή

Διαβάστε περισσότερα

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

Αντικειμενοστρεφής Προγραμματισμός ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΙΚΑ ΜΑΘΗΜΑΤΑ Αντικειμενοστρεφής Προγραμματισμός Ενότητα 6: Σχεδίαση Κλάσεων Γρηγόρης Τσουμάκας, Επικ. Καθηγητής Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Οντοκεντρικός Προγραμματισμός Οντοκεντρικός Προγραμματισμός Ενότητα 6: C++ ΚΛΑΣΕΙΣ, ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ, ΠΟΛΥΜΟΡΦΙΣΜΟΣ Κληρονομικότητα ΔΙΔΑΣΚΟΝΤΕΣ: Ιωάννης Χατζηλυγερούδης, Χρήστος Μακρής Πολυτεχνική Σχολή Τμήμα Μηχανικών Η/Υ & Πληροφορικής

Διαβάστε περισσότερα

Αρχικοποίηση Αντικειµένων & Κλάσεων στη Java Object Instantiation & Class Initialisation Κώστας Σαΐδης saiko@di.uoa.gr http://daemon.di.uoa.gr/daemon/issue4 Μάρτιος 2004 Η Αρχή είναι το ήµισυ του Παντός

Διαβάστε περισσότερα

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

Αντικειμενοστρεφής Προγραμματισμός ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΙΚΑ ΜΑΘΗΜΑΤΑ Αντικειμενοστρεφής Προγραμματισμός Ενότητα 3: Αλληλεπίδραση Αντικειμένων Γρηγόρης Τσουμάκας, Επικ. Καθηγητής Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

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

Προγραμματισμός ΙI (Θ) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κεντρικής Μακεδονίας - Σέρρες Τμήμα Μηχανικών Πληροφορικής Προγραμματισμός ΙI (Θ) Δρ. Δημήτρης Βαρσάμης Επίκουρος Καθηγητής Μάρτιος 2017 Δρ. Δημήτρης Βαρσάμης Μάρτιος 2017

Διαβάστε περισσότερα

Κεφάλαιο 2ο. Κατανοώντας την αντικειμενοστρέφεια

Κεφάλαιο 2ο. Κατανοώντας την αντικειμενοστρέφεια Περιεχόμενα Πρόλογος... 11 Κεφάλαιο 1ο. Εισαγωγή στη γλώσσα UML 1.1 Προσθέτοντας μια νέα μέθοδο...13 1.2 Πως αναπτύχθηκε η UML...14 1.3 Κατανοώντας την UML...15 1.4 Αναγνωρίζοντας τα επί μέρους τμήματα

Διαβάστε περισσότερα

Πίνακας Περιεχομένων. μέρος A 1 Εισαγωγή στην Τεχνολογία Λογισμικού

Πίνακας Περιεχομένων. μέρος A 1 Εισαγωγή στην Τεχνολογία Λογισμικού Πρόλογος...21 μέρος A Εισαγωγή στην Τεχνολογία Λογισμικού 1 Εισαγωγή στην Τεχνολογία Λογισμικού 1.1 Το λογισμικό...25 1.1.1 Ο ρόλος και η σημασία του λογισμικού...26 1.1.2 Οικονομική σημασία του λογισμικού...28

Διαβάστε περισσότερα

Προγράμματα με δομή Κληρονομικότητας

Προγράμματα με δομή Κληρονομικότητας Προγράμματα με δομή Κληρονομικότητας Επέκταση ιεραρχίας με νέες κλάσεις Επέκταση ιεραρχίας με νέες κλάσεις Οι κλάσεις που δεν προορίζονται για δημιουργία στιγμιοτύπων, αλλά προορίζονται να χρησιμοποιηθούν

Διαβάστε περισσότερα

1 Συστήματα Αυτοματισμού Βιβλιοθηκών

1 Συστήματα Αυτοματισμού Βιβλιοθηκών 1 Συστήματα Αυτοματισμού Βιβλιοθηκών Τα Συστήματα Αυτοματισμού Βιβλιοθηκών χρησιμοποιούνται για τη διαχείριση καταχωρήσεων βιβλιοθηκών. Τα περιεχόμενα των βιβλιοθηκών αυτών είναι έντυπα έγγραφα, όπως βιβλία

Διαβάστε περισσότερα

Εισαγωγή στην εφαρμογή Βασική Σελίδα (Activity) Αναζήτηση Πελάτη... 6 Προβολή Πελάτη... 7 Επεξεργασία Πελάτη... 10

Εισαγωγή στην εφαρμογή Βασική Σελίδα (Activity) Αναζήτηση Πελάτη... 6 Προβολή Πελάτη... 7 Επεξεργασία Πελάτη... 10 Περιεχόμενα Εισαγωγή στην εφαρμογή... 2 Βασική Σελίδα (Activity)... 3 Ρυθμίσεις... 3 Πελάτες... 6 Αναζήτηση Πελάτη... 6 Προβολή Πελάτη... 7 Επεξεργασία Πελάτη... 10 Αποθήκη... 11 Αναζήτηση προϊόντος...

Διαβάστε περισσότερα

Διδάσκων: Παναγιώτης Ανδρέου

Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 6: Αφαιρετικότητα, Βιβλιοθήκες Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Αφαιρετικότητα -Βιβλιοθήκες (packages) Διδάσκων: Παναγιώτης Ανδρέου ΕΠΛ233 Αντικειμενοστρεφής Προγραμματισμός

Διαβάστε περισσότερα

Παρακάτω προτείνεται μια αλληλουχία ενεργειών την οποία ο χρήστης πρέπει να ακολουθήσει για να αξιοποιήσει τις δυνατότητες της εφαρμογής.

Παρακάτω προτείνεται μια αλληλουχία ενεργειών την οποία ο χρήστης πρέπει να ακολουθήσει για να αξιοποιήσει τις δυνατότητες της εφαρμογής. Έκδοση Παραστατικών Το συγκεκριμένο εγχειρίδιο δημιουργήθηκε για να βοηθήσει την κατανόηση της διαδικασίας Έκδοσης Παραστατικών στην εφαρμογή της Extra. Παρακάτω προτείνεται μια αλληλουχία ενεργειών την

Διαβάστε περισσότερα

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java Εξάμηνο Μάθημα Τίτλος 2017 2018 Εαρινό Αντικειμενοστραφής Προγραμματισμός Ι Ύλη εργαστηρίου, Ασκήσεις Java Ημερομηνία Εργαστήριο 5 ο Α. Ύλη εργαστηρίου 5.1 Έννοιες αντικειμενοστραφούς προγραμματισμού,

Διαβάστε περισσότερα

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

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης Δοµές Δεδοµένων 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων Ε. Μαρκάκης Περίληψη Χρήση αναδροµικών εξισώσεων στην ανάλυση αλγορίθµων Αφηρηµένοι τύποι δεδοµένων Συλλογές στοιχείων Στοίβα

Διαβάστε περισσότερα

Εργαστήριο Εισαγωγής στη Σχεδίαση Συστημάτων VLSI

Εργαστήριο Εισαγωγής στη Σχεδίαση Συστημάτων VLSI Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΕΙΣΑΓΩΓΗ ΣΤΗ ΣΧΕΔΙΑΣΗ ΣΥΣΤΗΜΑΤΩΝ VLSI

Διαβάστε περισσότερα

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

Περιεχόμενο του μαθήματος ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Η Αντικειμενοστρεφής Τεχνολογία Δρ Βαγγελιώ Καβακλή Τμήμα Πολιτισμικής Τεχνολογίας και Επικοινωνίας Πανεπιστήμιο Αιγαίου Εαρινό Εξάμηνο 202-203 Περιεχόμενο του μαθήματος Η έννοια

Διαβάστε περισσότερα

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

14η ιάλεξη. Προχωρημένα θέματα σχεδίασης 14η ιάλεξη Προχωρημένα θέματα σχεδίασης 1 ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι κ. ΠΕΤΑΛΙΔΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ 1 Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για

Διαβάστε περισσότερα

Παύλος Εφραιµίδης. Java. Κληρονοµικότητα

Παύλος Εφραιµίδης. Java. Κληρονοµικότητα κληρονοµικότητα Παύλος Εφραιµίδης 1 ιεραρχίες κλάσεων Στην (και γενικότερα στον αντικειµενοστρεφή προγραµµατισµό) µπορεί από µία κλάση να δηµιουργηθεί µια νέα κλάση απόγονος που κληρονοµεί όλα τα χαρακτηριστικά

Διαβάστε περισσότερα

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

Από τη UML στον Κώδικα. Μέρος Β Από τη UML στον Κώδικα Μέρος Β περιεχόμενα παρουσίασης Αμφίδρομες συσχετίσεις Συσσωμάτωση Σύνθεση Διαγράμματα ακολουθίας αμφίδρομες συσχετίσεις Μία αμφίδρομη συσχέτιση υλοποιείται με δύο μονόδρομες. Υπάρχει

Διαβάστε περισσότερα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΤΙΚΕΙΜΕΝΑ Κλάση Μια κλάση είναι μία αφηρημένη περιγραφή αντικειμένων

Διαβάστε περισσότερα

Εργαστήριο «Τεχνολογία Πολιτισμικού Λογισμικού» Ενότητα. Επεξεργασία πινάκων

Εργαστήριο «Τεχνολογία Πολιτισμικού Λογισμικού» Ενότητα. Επεξεργασία πινάκων Ενότητα 4 Επεξεργασία πινάκων 36 37 4.1 Προσθήκη πεδίων Για να εισάγετε ένα πεδίο σε ένα πίνακα που υπάρχει ήδη στη βάση δεδομένων σας, βάζετε τον κέρσορα του ποντικιού στο πεδίο πάνω από το οποίο θέλετε

Διαβάστε περισσότερα

Διαδικτυακό Περιβάλλον Διαχείρισης Ασκήσεων Προγραμματισμού

Διαδικτυακό Περιβάλλον Διαχείρισης Ασκήσεων Προγραμματισμού ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ ΔΙΑΤΜΗΜΑΤΙΚΟ ΜΕΤΑΠΤΥΧΙΑΚΟ ΠΡΟΓΡΑΜΜΑ ΣΤΑ ΠΛΗΡΟΦΟΡΙΑΚΑ ΣΥΣΤΗΜΑΤΑ Διπλωματική Εργασία με θέμα: Διαδικτυακό Περιβάλλον Διαχείρισης Ασκήσεων Προγραμματισμού Καραγιάννης Ιωάννης Α.Μ.

Διαβάστε περισσότερα

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1 HelloWorld Παύλος Εφραιμίδης Java Το πρόγραμμα HelloWorld 1 Το πρόγραμμα HelloWorld.java Σχόλια στη Java /** * The HelloWorld class */ class HelloWorld { public static void main(string[] args) { System.out.println("Hello

Διαβάστε περισσότερα

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

Αντικειμενοστρεφής Προγραμματισμός Αντικειμενοστρεφής Προγραμματισμός Διδάσκουσα: Αναπλ. Καθηγήτρια Ανδριάνα Πρέντζα aprentza@unipi.gr Εργαστηριακός Συνεργάτης: Δρ. Βασιλική Κούφη vassok@unipi.gr Περιεχόμενα Java Classes Java Objects Java

Διαβάστε περισσότερα

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

Δομημένος Προγραμματισμός (ΤΛ1006) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής

Διαβάστε περισσότερα

2.1. Εντολές. 2.2. Σχόλια. 2.3. Τύποι Δεδομένων

2.1. Εντολές. 2.2. Σχόλια. 2.3. Τύποι Δεδομένων 2 Βασικές Εντολές 2.1. Εντολές Οι στην Java ακολουθούν το πρότυπο της γλώσσας C. Έτσι, κάθε εντολή που γράφουμε στη Java θα πρέπει να τελειώνει με το ερωτηματικό (;). Όπως και η C έτσι και η Java επιτρέπει

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα