This shows you the differences between two versions of the page.
|
oop:introduction [2017/01/27 14:38] gthanos [Διεπαφές - Interfaces] |
oop:introduction [2020/02/21 11:17] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Εισαγωγή στον Αντικειμενοστραφή Προγραμματισμό ====== | ||
| - | |||
| - | Κεντρικό στοιχείο του Αντικειμενοστραφούς Προγραμματισμού είναι η χρήση αντικειμένων. Τα αντικείμενα στον αντικειμενοστραφή προγραμματισμό τείνουν να προσομοιάσουν ευρύτερες έννοιες που υφίστανται στον πραγματικό κόσμο. Παραδείγματα αντικειμένων μπορεί να είναι το αυτοκίνητο, | ||
| - | |||
| - | Τα " | ||
| - | - **Κατάσταση (state):** Κάθε αντικείμενο διέπεται από συγκεκριμένα χαρακτηριστικά που ορίζουν την κατάσταση του. Για παράδειγμα ένα αυτοκίνητο έχει συγκεκριμένο χρώμα, ανήκει σε συγκεκριμένο μοντέλο και κάθε χρονική στιγμή έχει μία ταχύτητα και μία κατεύθυνση κίνησης. Τα παραπάνω χαρακτηριστικά διέπουν όλα τα αυτοκίνητα, | ||
| - | - **Συμπεριφορά (behaviour)**: | ||
| - | |||
| - | Σε αναλογία των παραπάνω, | ||
| - | * **Δεδομένα // | ||
| - | * **Μεθόδους // | ||
| - | |||
| - | <WRAP tip 80% center round> | ||
| - | Ο αντικειμενοστραφής προγραμματισμός αποτελεί εξέλιξη του διαδικαστικού προγραμματισμού (που υποστηρίζεται από την γλώσσα C). Με την έννοια αυτή τα βασικά εργαλεία του διαδικαστικού προγραμματισμού, | ||
| - | </ | ||
| - | |||
| - | ===== Η Κλάση ===== | ||
| - | |||
| - | Τα παραδείγματα αντικειμένων που αναφέρθηκαν παραπάνω μπορεί κάποιος να τα δει με δύο διαφορετικούς τρόπους: | ||
| - | |||
| - | Για παράδειγμα, | ||
| - | |||
| - | Τον ρόλο του **σχεδίου** με την έννοια που αναφέρεται παραπάνω τον παίζει η **κλάση**. Η κλάση αποτελεί το σχέδιο με βάση το οποίο αντικείμενα του συγκεκριμένου τύπου (της συγκεκριμένης κλάσης) υλοποιούνται σε ένα πρόγραμμα. | ||
| - | |||
| - | Όλα τα αντικείμενα της ίδιας κλάσης διέπονται από τις ίδιες // | ||
| - | |||
| - | | Το διπλανό σχήμα απεικονίζει διαφορετικές υλοποιήσεις ενός αυτοκινήτου με βάση το αρχικό σχέδιο του συγκεκριμένου μοντέλου. Αντιστρέφοντας το παράδειγμα του αυτοκινήτου, | ||
| - | |||
| - | ==== Κατασκευαστές της Κλάσης (Class Constructors) ==== | ||
| - | |||
| - | Στον πραγματικό κόσμο μπορούμε να έχουμε διαφορετικές υλοποιήσεις ενός σχεδίου, | ||
| - | |||
| - | Ανάλογα, | ||
| - | |||
| - | Κάθε αντικείμενο υλοποιείται από μία μέθοδο που καλείται κατασκευαστής (// | ||
| - | |||
| - | Μία κλάση έχει τουλάχιστον ένα κατασκευαστή. Οι κατασκευαστές είναι μέθοδοι (// | ||
| - | - Δεσμεύουν την απαραίτητη μνήμη για το νέο αντικείμενο. | ||
| - | - Αρχικοποιούν το αντικείμενο με βάση τις αρχικές τιμές των παραμέτρων με τις οποίες καλείται ο κατασκευαστής της κλάσης. | ||
| - | |||
| - | ==== Περιεχόμενα της Κλάσης ==== | ||
| - | |||
| - | Κάθε κλάση περιέχει κατά βάση τρία τις παρακάτω βασικές κατηγορίες πληροφορίας | ||
| - | - **Δεδομένα ή πεδία**. Τα πεδία διακρίνονται σε: | ||
| - | * Βασικούς τύπους δεδομένων (Primitive Types), char, int, long, float, double, arrays κλπ. | ||
| - | * Σύνθετους τύπους δεδομένων (Reference Types), Strings, Arrays, Objects κλπ. | ||
| - | - **Kατασκευαστές αντικειμένων**. | ||
| - | - **Μεθόδους**: | ||
| - | |||
| - | === Αντικείμενα ως πεδία της κλάσης === | ||
| - | |||
| - | Κάθε κλάση στον αντικειμενοστραφή προγραμματισμό δηλώνει ένα τύπο δεδομένων. Με την έννοια αυτή τα πεδία της κλάσης μπορεί να είναι του τύπου μιας άλλης κλάσης, | ||
| - | |||
| - | Σε επίπεδο αντικειμένων η παραπάνω σχέση ορίζει ότι το αντικείμενο της κλάσης θα περιέχει πεδία που είναι αντικείμενα άλλων κλάσεων. Με τη σειρά τους τα αντικείμενα αυτά μπορεί να περιέχουν πεδία άλλων κλάσεων κ.ο.κ. Δείτε το παρακάτω παράδειγμα κώδικα που εξηγεί τη σχέση μεταξύ διαφορετικών κλάσεων | ||
| - | |||
| - | <code java> | ||
| - | class Colour { | ||
| - | int r, b, g; | ||
| - | } | ||
| - | |||
| - | class Box { | ||
| - | int width, length, height; | ||
| - | } | ||
| - | |||
| - | class Ribbon { | ||
| - | Colour colour; | ||
| - | int length; | ||
| - | } | ||
| - | |||
| - | class ColouredBox { | ||
| - | Colour colour; | ||
| - | Box box; | ||
| - | } | ||
| - | |||
| - | class ColouredBoxWithRibbon { | ||
| - | ColouredBox cbox; | ||
| - | Ribbon ribbon; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Δείτε την παραπάνω σχέση κλάσεων, | ||
| - | |||
| - | Αντίστοιχα η κλάση ColouredBoxWithRibbon (χρωματιστό κουτί με κορδέλα), | ||
| - | |||
| - | <WRAP tip 80% center round> | ||
| - | Δεν υπάρχει κανένας περιορισμός για το " | ||
| - | </ | ||
| - | |||
| - | === Διάκριση στην προσβασιμότητα των πεδίων και των μεθόδων από άλλες κλάσεις === | ||
| - | |||
| - | Βασικό χαρακτηριστικό όλων των γλωσσών προγραμματισμού είναι ότι επιτρέπουν τον περιορισμό της πρόσβασης σε συγκεκριμένες μεθόδους ή πεδία της κλάσης από άλλες κλάσεις. Ας υποθέσουμε ότι έχουμε τις παρακάτω κλάσεις (ελαφρά διαφοροποιημένες σε σχέση με το προηγούμενο παράδειγμα). | ||
| - | |||
| - | <code java> | ||
| - | class Colour { | ||
| - | private: | ||
| - | int r, g, b; | ||
| - | | ||
| - | public: | ||
| - | int getRed() { return r; } | ||
| - | int getGreen() { return g; } | ||
| - | int getBlue() { return b; } | ||
| - | void setRed(int v) { r = v; } | ||
| - | void setGreen(int v) { g = v; } | ||
| - | void setBlue(int v) { g = v; } | ||
| - | } | ||
| - | |||
| - | class ColouredBox { | ||
| - | private: | ||
| - | int width, length, height; | ||
| - | Colour colour; | ||
| - | | ||
| - | public: | ||
| - | void setColour(int vr, int vg, int vb) { | ||
| - | colour.setRed(vr); | ||
| - | colour.setGreen(vg); | ||
| - | colour.setRed(vr); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Παρατηρήστε ότι η μέθοδος setColour που επιχειρεί να αλλάξει το χρώμα στο κουτί μπορεί να το κάνει μόνο χρησιμοποιώντας τις public μεθόδους setRed, setGreen, setBlue της κλάσης Colour και όχι απευθείας τα πεδία r, g, b της κλάσης αυτής. Ο λόγος που συμβαίνει αυτό είναι διότι τα συγκεκριμένα πεδία είναι δηλωμένα ως private, κατά συνέπεια είναι αδύνατο να προσπελαστούν από την κλάση ColouredBox. | ||
| - | |||
| - | |||
| - | Εύλογα διερωτάται κανείς την σκοπιμότητα χρήσης προσδιοριστών που περιορίζουν την πρόσβαση στα πεδία μία κλάσης. Ο λόγος είναι ότι μέσω των περιορισμών στην προσβασιμότητα, | ||
| - | |||
| - | <WRAP tip 80% center round> | ||
| - | Η παραπάνω ιδιότητα του αντικειμενοστραφή προγραμματισμού ονομάζεται ενθυλάκωση (encapsulation) και είναι βασικό δομικό χαρακτηριστικό των γλωσσών αντικειμενοστραφή προγραμματισμού. Μέσω της ενθυλάκωσης επιτυγχάνεται η " | ||
| - | - είναι ευκολότερες οι μελλοντικές του επεκτάσεις ή αλλαγές | ||
| - | - είναι ευκολότερο να αποσφαλματωθεί. Η αποσφαλμάτωση του μπορεί να χωρισθεί σε σαφή και διακριτά μεταξύ τους τμήματα. | ||
| - | </ | ||
| - | |||
| - | ==== Κληρονομικότητα ==== | ||
| - | |||
| - | Στον πραγματικό κόσμο πολλά πράγματα μοιράζονται κοινά χαρακτηριστικά. Για παράδειγμα: | ||
| - | * Υπάρχουν επιμέρους τύποι ποδηλάτων, | ||
| - | * Υπάρχουν επιμέρους τύποι αυτοκινήτων, | ||
| - | |||
| - | Με βάση την παραπάνω παρατήρηση, | ||
| - | |||
| - | === Ένα σύντομο παράδειγμα === | ||
| - | |||
| - | Όταν εφευρέθηκε το ποδήλατο με ταχύτητες, | ||
| - | |||
| - | Δείτε τα παρακάτω σχηματικά παραδείγματα: | ||
| - | |||
| - | Στον αντικειμενοστραφή προγραμματισμό η ιδιότητα της κληρονομικότητας μας επιτρέπει να δημιουργήσουμε νέες κλάσεις με αφετηρία υφιστάμενες κλάσεις. Η ιδιότητα της κληρονομικότητας δηλώνει ότι δεν θα χρειαστεί να ξαναγράψουμε το σύνολο της νέας κλάσης από την αρχή. Αντίθετα, | ||
| - | * ο μεταγλωττιστής της γλώσσας ενσωματώνει αυτόματα στη νέα κλάση τα χαρακτηριστικά της γονικής κλάσης και | ||
| - | * ο προγραμματιστής αρκεί να προσθέσει ότι επιπλέον χρειάζεται προκειμένου να δημιουργηθεί η νέα κλάση. Η νέα κλάση αποτελεί επέκταση της αρχικής καθώς ενσωματώνει όλα τα χαρακτηριστικά της, αλλά παράγει αντικείμενα του νέου τύπου. | ||
| - | |||
| - | Επεκτείνοντας την παραπάνω συλλογιστική μπορούμε να έχουμε πολλαπλές ιεραρχίες κλάσεων. Για παράδειγμα, | ||
| - | |||
| - | // | ||
| - | |||
| - | Για το **ποδήλατο με ταχύτητες** η κλάση **ποδήλατο** αποτελεί την γονική κλάση (__Super Class__). Αντίστοιχα για το **ποδήλατο**, | ||
| - | |||
| - | <WRAP tip 80% center round> | ||
| - | Μέσω της κληρονομικότητας υλοποιείται μία από τις βασικές αρχές του αντικειμενοστραφή προγραμματισμού που είναι η αρχή της επαναχρησιμοποίησης κώδικα. | ||
| - | |||
| - | Επίσης, | ||
| - | </ | ||
| - | |||
| - | | Στο διπλανή εικόνα παρουσιάζεται εποπτικά ένα παράδειγμα κληρονομικότητας της κλάσης του ποδηλάτου. Από την γενική κλάση του ποδηλάτου προκύπτουν δύο επιμέρους κλάσεις **α)** το ποδήλατο για δύο επιβάτες (χωρίς ταχύτητες) **β)** το ποδήλατο με ταχύτητες. <WRAP todo round> | ||
| - | |||
| - | |||
| - | ==== Διεπαφές - Interfaces ==== | ||
| - | |||
| - | Τα αντικείμενα στον πραγματικό κόσμο ορίζουν την διεπαφή τους με τον έξω κόσμο μέσα από συγκεκριμένα εργαλεία που καταλήγουν σε συγκεκριμένες πράξεις. Για παράδειγμα, | ||
| - | * τα κουμπιά και η οθόνη του κινητού τηλεφώνου ορίζουν τις δυνατότητες αλληλεπίδρασης με την συσκευή. | ||
| - | * Το πληκτρολόγιο, | ||
| - | |||
| - | Ανάλογη είναι η λειτουργία της **διεπαφής** (interface) για τον αντικειμενοστραφή προγραμματισμό. Ορίζουμε μία **διεπαφή**, | ||
| - | |||
| - | Ας υποθέσουμε ότι ορίζεται η διεπαφή '' | ||
| - | * push: εισαγωγή στοιχείου στην κορυφή της στοίβας. | ||
| - | * pop: αφαίρεση στοιχείου από την κορυφή της στοίβας. | ||
| - | * top: επιστροφη της τιμής του κορυφαίου στοιχείου της στοίβας (χωρίς να αφαιρεθεί). | ||
| - | |||
| - | Αν οποιαδήποτε κλάση υλοποιεί τις παραπάνω μεθόδους τότε μπορούμε να πούμε ότι υλοποιεί την διεπαφή της στοίβας (interface Stack). | ||
| - | |||
| - | Στον αντικειμενοστραφή προγραμματισμό, | ||
| - | |||
| - | |||
| - | |||
| - | ==== Πλεονεκτήματα του Αντικ/ | ||
| - | * **Αρθρωτή Δομή (Modularity): | ||
| - | * **Απόκρυψη πληροφορίας: | ||
| - | * **Επαναχρησιμοποίηση κώδικα: | ||
| - | * **Επεκτασιμότητα: | ||
| - | * **Ευκολότερη αποσφαλμάτωση: | ||
| - | * **Μία ομάδα προγραμματιστών μπορεί να εργαστεί παράλληλα: | ||
| - | * Ορίζεται ο τρόπος με τον οποίο επικοινωνούν οι κλάσεις μεταξύ τους. | ||
| - | * Κάθε προγραμματιστής ή ομάδα υλοποιεί τις επιμέρους κλάσεις που του/ | ||
| - | * Ο έλεγχος και η αποσφαλμάτωση του κώδικα σε μεγάλο βαθμό γίνεται διακριτά ανά κλάση ή ομάδα κλάσεων. | ||
| - | * Εάν μία κλάση δεν είναι καλά σχεδιασμένη ή υλοποιημένη μπορούμε να την ξαναγράψουμε από την αρχή χωρίς να επηρεαστεί ο υπόλοιπος κώδικας, | ||
| - | * Στον αντικειμενοστραφή προγραμματισμό η φάση του σχεδιασμού είναι εξαιρετικά σημαντική. Καλός σχεδιασμός σημαίνει συντηρήσιμος, | ||
| - | |||
| - | | Προηγούμενο: | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||