oop:introduction

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
oop:introduction [2015/02/18 11:00]
gthanos [Κληρονομικότητα]
oop:introduction [2015/02/18 13:02]
gthanos [Διεπαφές - Interfaces]
Line 7: Line 7:
  
 Τα "​αντικείμενα"​ στον πραγματικό κόσμο έχουν δύο βασικά χαρακτηριστικά:​ Τα "​αντικείμενα"​ στον πραγματικό κόσμο έχουν δύο βασικά χαρακτηριστικά:​
-  - **Κατάσταση (state):** Καθε αντικείμενο διέπεται από συγκεκριμένα χαρακτηριστικά που ορίζουν την κατάσταση του. Για παράδειγμα ένα αυτοκίνητο έχω συγκεκριμένο χρώμα, ανήκει σε συγκεκριμένο μοντέλο και κάθε χρονική στιγμή έχει μία ταχύτητα και μία κατεύθυνση κίνησης. Τα παραπάνω χαρακτηριστικά διέπουν όλα τα αυτοκίνητα,​ αλλά κάθε αυτοκίνητο έχει τις δικές του τιμές οι οποίες μπορεί να διαφέρουν από τις τιμές άλλων αυτοκινήτων. +  - **Κατάσταση (state):** Κάθε αντικείμενο διέπεται από συγκεκριμένα χαρακτηριστικά που ορίζουν την κατάσταση του. Για παράδειγμα ένα αυτοκίνητο έχω συγκεκριμένο χρώμα, ανήκει σε συγκεκριμένο μοντέλο και κάθε χρονική στιγμή έχει μία ταχύτητα και μία κατεύθυνση κίνησης. Τα παραπάνω χαρακτηριστικά διέπουν όλα τα αυτοκίνητα,​ αλλά κάθε αυτοκίνητο έχει τις δικές του τιμές οι οποίες μπορεί να διαφέρουν από τις τιμές άλλων αυτοκινήτων. 
-  - **Συμπεριφορά (behaviour)**:​ Κάθε αντικείμενο διέπεται από συγκεκριμένους κανόνες συμπεριφοράς. Για παράδειγμα σε ένα αυτοκίνητο εάν στρίψουμε το τιμόνι στα αριστέρά το αυτοκίνητο κινείται αριστερά. __Ο παραπάνω γενκός κανόνας ισχύει για όλα τα αυτοκίνητα__. Η σχέση μεταξύ της γωνίας στροφής του τιμονιού του αντοκινήτου και της αλλαγή πορείας που αυτή συνεπάγεται μπορεί να διαφέρει μεταξύ διαφορετικών μοντέλων.+  - **Συμπεριφορά (behaviour)**:​ Κάθε αντικείμενο διέπεται από συγκεκριμένους κανόνες συμπεριφοράς. Για παράδειγμα σε ένα αυτοκίνητο εάν στρίψουμε το τιμόνι στα αριστερά το αυτοκίνητο κινείται αριστερά. __Ο παραπάνω γενικός κανόνας ισχύει για όλα τα αυτοκίνητα__. Η σχέση μεταξύ της γωνίας στροφής του τιμονιού του αυτοκινήτου και της αλλαγή πορείας που αυτή συνεπάγεται μπορεί να διαφέρει μεταξύ διαφορετικών μοντέλων.
  
 Σε αναλογία των παραπάνω,​ τα αντικείμενα στον αντικειμενοστραφή προγραμματισμό διαθέτουν:​ Σε αναλογία των παραπάνω,​ τα αντικείμενα στον αντικειμενοστραφή προγραμματισμό διαθέτουν:​
Line 49: Line 49:
   * Υπάρχουν επιμέρους τύποι αυτοκινήτων,​ sport, 4x4, sedan, coupe, supercars, luxury cars.   * Υπάρχουν επιμέρους τύποι αυτοκινήτων,​ sport, 4x4, sedan, coupe, supercars, luxury cars.
  
-Με βάση την παραπάνω παρατήρηση,​ μπορούμε να ορίσουμε κλάσεις που περιγράφουν γενικότερες έννοιες και στην συνέχεια να τις εξειδικεύσουμε δημιουργώντας νέες κλάσεις που περιφράφουν πιο ειδικές έννοιες. Ο λόγος που θα θέλαμε να κάνουμε κάτι τέτοιο είναι ότι κατά την εξέλιξη του λογισμικού θέλουμε κατά το δυνατόν να επαναχρησιμοποιήσουμε κώδικα που ήδη έχουμε,​ δημιουργώντας πιο σύνθετα και εξελιγμένα μοντέλα του υφιστάμενου λογισμικού. ​+Με βάση την παραπάνω παρατήρηση,​ μπορούμε να ορίσουμε κλάσεις που περιγράφουν γενικότερες έννοιες και στην συνέχεια να τις εξειδικεύσουμε δημιουργώντας νέες κλάσεις που περιγράφουν πιο ειδικές έννοιες. Ο λόγος που θα θέλαμε να κάνουμε κάτι τέτοιο είναι ότι κατά την εξέλιξη του λογισμικού θέλουμε κατά το δυνατόν να επαναχρησιμοποιήσουμε κώδικα που ήδη έχουμε,​ δημιουργώντας πιο σύνθετα και εξελιγμένα μοντέλα του υφιστάμενου λογισμικού. ​
  
-Όταν εφευρέθηκε το ποδήλατο με ταχύτητες,​ ο εφευρέτης χρησιμοποίησε το υφιστάμενο βασικό σχέδιο του ποδηλάτου για να προσθέσει τον μηχανισμό των ταχυτήτων και να δημιουργήσει ένα νέο τύπο ποδηλάτου,​ το ποδήλατο με ταχύτητες. Σε αναλογία με τον πραγματικό κόσμο, ας υποθέσουμε ότι έχουμε μία κλάση που περιγράφει ​το ποδήλατο κλασσικό ποδήλατο χωρίς ταχύτητες μέσω των παρακάτω τεσσάρων μεταβλητών.+Όταν εφευρέθηκε το ποδήλατο με ταχύτητες,​ ο εφευρέτης χρησιμοποίησε το υφιστάμενο βασικό σχέδιο του ποδηλάτου για να προσθέσει τον μηχανισμό των ταχυτήτων και να δημιουργήσει ένα νέο τύπο ποδηλάτου,​ το ποδήλατο με ταχύτητες. Σε αναλογία με τον πραγματικό κόσμο, ας υποθέσουμε ότι έχουμε μία κλάση που περιγράφει το κλασσικό ποδήλατο χωρίς ταχύτητες μέσω των παρακάτω τεσσάρων μεταβλητών.
   - ταχύτητα κίνησης   - ταχύτητα κίνησης
   - θέση   - θέση
   - κατεύθυνση κίνησης   - κατεύθυνση κίνησης
   - ταχύτητα περιστροφής των πεταλιών   - ταχύτητα περιστροφής των πεταλιών
-Παράλληλα ​υπάρχουν ​και κάποιες συναρτήσεις για την μεταβολή της τιμής των παραπάνω μεταβλητών. Ας υποθέσουμε τώρα ότι θέλουμε να σχεδιάσουμε το ποδήλατο με ταχύτητες. Θα χρειαστεί να προσθέσουμε μία νέα μεταβλητή που αντιπροσωπεύει τον αριθμό της ​ταχύτητας στο γρανάζι. Η ιδιότητα της κληρονομικότητας μας επιτρέπει να δημιουργήσουμε τη νέα κλάση του ποδηλάτου με ταχύτητες,​ επεκτείνοντας την κλάση του κλασσικού ποδηλάτου και προσθέτοντας την επιπλέον μεταβλητή και λειτουργικότητα. Η κληρονομικότητα μας επιτρέπει να μην γράψουμε την νέα κλάση από την αρχή αλλά να πατήσουμε πάνω σε ένα υφιστάμενο σχέδιο.+Παράλληλα ​η κλάση μας έχει και κάποιες συναρτήσεις για την μεταβολή της τιμής των παραπάνω μεταβλητών ​στις οποίες δεν θα επεκταθούμε σε αυτό το σημείο. Ας υποθέσουμε τώρα ότι θέλουμε να σχεδιάσουμε το ποδήλατο με ταχύτητες. Θα χρειαστεί να προσθέσουμε μία νέα μεταβλητή που αντιπροσωπεύει την θέση (αριθμότης αλυσίδας στο γρανάζι. Η ιδιότητα της κληρονομικότητας μας επιτρέπει να δημιουργήσουμε τη νέα κλάση του ποδηλάτου με ταχύτητες,​ επεκτείνοντας την κλάση του κλασσικού ποδηλάτου και προσθέτοντας την επιπλέον μεταβλητή και ​ανάλογη ​λειτουργικότητα ​μέσω συναρτήσεων. Η κληρονομικότητα μας επιτρέπει να μην γράψουμε την νέα κλάση από την αρχή αλλά να πατήσουμε πάνω σε ένα υφιστάμενο σχέδιο.
  
-Επεκτείνοντας την παραπάνω συλλογιστική μπορούμε να έχουμε πολλαπλές ιεραρχίες κλάσεων. Για παράδειγμα,​ από το ποδήλατο με ταχύτητας μπορεί να οριστεί το ποδήλατο για δύο άτομα ​με ταχύτητες ή το ποδήλατο για δύο άτομα ​με ταχύτητες και αμορτισέρ.+Επεκτείνοντας την παραπάνω συλλογιστική μπορούμε να έχουμε πολλαπλές ιεραρχίες κλάσεων. Για παράδειγμα,​ από το ποδήλατο με ταχύτητες μπορεί να οριστεί το ποδήλατο για δύο ​επιβάτες με ταχύτητες ή το ποδήλατο για δύο ​επιβάτες με ταχύτητες και αμορτισέρ.
  
-//​**ποδήλατο** --> **ποδήλατο με ταχύτητες** --> **ποδήλατο με ταχύτητες για δύο άτομα** -> **ποδήλατο με ταχύτητες και αμορτισέρ για δύο άτομα**//.+//​**ποδήλατο** --> **ποδήλατο με ταχύτητες** --> **ποδήλατο με ταχύτητες για δύο ​επιβάτες** -> **ποδήλατο με ταχύτητες και αμορτισέρ για δύο ​επιβάτες**//.
  
 Για το **ποδήλατο με ταχύτητες** η κλάση **ποδήλατο** αποτελεί την γονική κλάση (__Super Classes__). Αντίστοιχα για το **ποδήλατο**,​ το **ποδήλατο με ταχύτητες** αποτελεί υποκλάση (__Sub Class__) αυτού. Για το **ποδήλατο με ταχύτητες** η κλάση **ποδήλατο** αποτελεί την γονική κλάση (__Super Classes__). Αντίστοιχα για το **ποδήλατο**,​ το **ποδήλατο με ταχύτητες** αποτελεί υποκλάση (__Sub Class__) αυτού.
  
 | Στο διπλανή εικόνα παρουσιάζεται εποπτικά ένα παράδειγμα κληρονομικότητας της κλάσης του ποδηλάτου. Από την γενική κλάση του ποδηλάτου προκύπτουν δύο επιμέρους κλάσεις **α)** το ποδήλατο για δύο επιβάτες (χωρίς ταχύτητες) **β)** το ποδήλατο με ταχύτητες. | {{:​oop:​bicycle-hierarchy.png?​300 |}} | | Στο διπλανή εικόνα παρουσιάζεται εποπτικά ένα παράδειγμα κληρονομικότητας της κλάσης του ποδηλάτου. Από την γενική κλάση του ποδηλάτου προκύπτουν δύο επιμέρους κλάσεις **α)** το ποδήλατο για δύο επιβάτες (χωρίς ταχύτητες) **β)** το ποδήλατο με ταχύτητες. | {{:​oop:​bicycle-hierarchy.png?​300 |}} |
- 
-=== Επαναχρησιμοποίηση κώδικα με βάση την ιδιότητα της κληρονομικότητας === 
- 
-Η ιδιότητα της κληρονομικότητας μας επιτρέπει να επαναχρησιμοποιούμε και να επεκτείνουμε υφιστάμενο κώδικα,​ δημιουργώντας πιο σύνθετες κλάσεις. Στο παράδειγμα του παραπάνω σχήματος η βασική κλάση του ποδηλάτου επεκτείνεται στην κλάση του ποδηλάτου με ταχύτητες προσθέτοντας ​ 
-  - μία μεταβλητή που αποθηκεύει την τρέχουσα ταχύτητα του ποδηλάτου 
-  - και 3 μεθόδους:​ μία μέθοδο που αυξάνει την ταχύτητα του ποδηλάτου κατά μία θέση στο γρανάζι,​ μία μέθοδο που μειώνει την ταχύτητα ποδηλάτου κατά μία θέση στο γρανάζι και μία μέθοδο που επιστρέφει την τρέχουσα ταχύτητα ποδηλάτου. 
- 
  
 ==== Διεπαφές - Interfaces ==== ==== Διεπαφές - Interfaces ====
Line 79: Line 72:
   * το τιμόνι του ποδηλάτου ορίζει την πορεία του και η ταχύτητα κίνησης των πεταλιών ορίζει την ταχύτητα κίνησης του ποδηλάτου στον δρόμο.   * το τιμόνι του ποδηλάτου ορίζει την πορεία του και η ταχύτητα κίνησης των πεταλιών ορίζει την ταχύτητα κίνησης του ποδηλάτου στον δρόμο.
  
-Ανάλογη είναι η λειτουργία της **διεπαφής** για τον αντικειμενοστραφή προγραμματισμό. Ορίζουμε μία **διεπαφή**,​ ως ένα σύνολο από μεθόδους,​ δίνοντας μόνο τους ορισμούς των μεθόδων,​ χωρίς την υλοποίηση τους. Εάν μία κλάση υλοποιεί ΟΛΕΣ τις μεθόδους μιας διεπαφής,​ τότε η κλάση είναι σύμφωνη με την συγκεκριμένη διαπεφή. Ο τρόπος που υλοποιεί κάθε κλάση τις μεθόδους της διεπαφής,​ είναι εσωτερικό θέμα της κλάσης και δεν ελέγχεται από την διεπαφή. Επιπλέον,​ μία κλάση μπορεί να υλοποιεί μία ή περισσότερες διεπαφές.+Ανάλογη είναι η λειτουργία της **διεπαφής** για τον αντικειμενοστραφή προγραμματισμό. Ορίζουμε μία **διεπαφή**,​ ως ένα σύνολο από μεθόδους,​ δίνοντας μόνο τους ορισμούς των μεθόδων,​ χωρίς την υλοποίηση τους. Εάν μία κλάση υλοποιεί ΟΛΕΣ τις μεθόδους μιας διεπαφής,​ τότε η κλάση είναι σύμφωνη με την συγκεκριμένη διεπαφή. Ο τρόπος που υλοποιεί κάθε κλάση τις μεθόδους της διεπαφής,​ είναι εσωτερικό θέμα της κλάσης και δεν ελέγχεται από την διεπαφή. Επιπλέον,​ μία κλάση μπορεί να υλοποιεί μία ή περισσότερες διεπαφές.
  
-<WRAP tip> Στη γλώσσα Java o μεταγλωτιστής απαιτεί τη υλοποίηση όλων των μεθόδων που ​ορίζει η διεπαφή από ​την ​κλάση που την υλοποιεί. </​WRAP>​+Ας υποθέσουμε ότι ορίζεται ​η διεπαφή ''​MotorPropelled'' ​η οποία περιγράφει ένα ​σύνολο ​μεθόδων που ​πρέπει να υλοποιούνται από ​μία ​κλάση προκειμένου τα αντικείμενα της κλάσης αυτής να είναι ''​MotorPropelled''​ (δηλαδή να κινούνται και με χρήση μηχανής εσωτερικής καύσης). Ας υποθέσουμε ότι οι μέθοδοι που χρειαζόμαστε ​είναι οι παρακάτω:​ 
 +  * engineStart 
 +  * engineStop 
 +  * accelerate 
 +  * getFuelConsumption 
 +  * addFuel
  
-Για παράδειγμα στη γλώσσα ​Java μπορεί να οριστεί η παρακάτω διεπαφή+Αν οποιαδήποτε κλάση υλοποιεί τις ​παραπάνω μεθόδους τότε μπορούμε να πούμε ότι υλοποιεί το συγκεκριμένο interface, δηλ τα αντικείμενα της κλάσης αυτής είναι MotorPropelled. Η νέα κλάση μπορεί να είναι κάποια υποκλάση μιας ήδη γνωστής κλάσης (π.χ. μία υποκλάση της κλάσης ''​Bicycle''​) ​αλλά ​μπορεί να είναι και οποιαδήποτε άλλη κλάση αυτοκινούμενου οχήματος ακόμη και μία κλάση που ορίζεται εξ' ​αρχής. 
  
-<code java> +Όσες κλάσεις υλοποιούν όλες τις παραπάνω μεθόδους,​ υλοποιούν συνολικά το interface. Ως εκ τούτου υποστηρίζουν τις ιδιότητες του interface αυτού.
-interface ​Bicycle {  +
-  void changeCadence(int newValue);  +
-  void changeGear(int newValue);  +
-  void speedUp(int increment);  +
-  void applyBrakes(int decrement);  +
-+
-</​code>​+
  
-Η παρακάτω κλάση υλοποιεί ​το interface Bicycle ως εξής: +<WRAP tip> Στη γλώσσα Java o μεταγλωτιστής απαιτεί τη υλοποίηση όλων των μεθόδων που ορίζει η διεπαφή από ​την κλάση ​που την ​υλοποιεί</WRAP>
- +
-<code java> +
-class ACMEBicycle implements Bicycle {+
  
-    int cadence = 0; int speed = 0; int gear = 1; 
-    
-    void changeCadence(int newValue) { 
-         ​cadence = newValue; 
-    } 
-    void changeGear(int newValue) { 
-         gear = newValue; 
-    } 
-    void speedUp(int increment) { 
-         speed = speed + increment; ​   
-    } 
-    void applyBrakes(int decrement) { 
-         speed = speed - decrement; 
-    } 
-    void printStates() { 
-         ​System.out.println("​cadence:"​ + 
-             ​cadence + " speed:"​ +  
-             speed + " gear:" + gear); 
-    } 
-} 
-</​code>​ 
  
 ==== Πλεονεκτήματα του Αντικ/​στραφούς Προγραμματισμού ==== ==== Πλεονεκτήματα του Αντικ/​στραφούς Προγραμματισμού ====
Line 128: Line 95:
   * **Ευκολότερη αποσφαλμάτωση:​** Κατά την αποσφαλμάτωση ο αρχικός έλεγχος μπορεί να γίνει σε επίπεδο κλάσης (**Unit testing**). Αλλαγές σε μία κλάση δεν συνεπάγονται αλλαγές και σε άλλα σημεία του προγράμματος που χρησιμοποιούν την κλάση αυτή.   * **Ευκολότερη αποσφαλμάτωση:​** Κατά την αποσφαλμάτωση ο αρχικός έλεγχος μπορεί να γίνει σε επίπεδο κλάσης (**Unit testing**). Αλλαγές σε μία κλάση δεν συνεπάγονται αλλαγές και σε άλλα σημεία του προγράμματος που χρησιμοποιούν την κλάση αυτή.
   * **Μία ομάδα προγραμματιστών μπορεί να εργαστεί παράλληλα:​**   * **Μία ομάδα προγραμματιστών μπορεί να εργαστεί παράλληλα:​**
-    * Ορίζονται ​τα κατάλληλα interfaces που πρέπει να υλοποιηθούν+    * Ορίζεται ο τρόπος με τον οποίο επικοινωνούν ​οι κλάσεις μεταξύ τους.
     * Κάθε προγραμματιστής ή ομάδα υλοποιεί τις επιμέρους κλάσεις που του/​της ανατίθενται.     * Κάθε προγραμματιστής ή ομάδα υλοποιεί τις επιμέρους κλάσεις που του/​της ανατίθενται.
     * Ο έλεγχος και η αποσφαλμάτωση του κώδικα σε μεγάλο βαθμό γίνεται διακριτά ανά κλάση ή ομάδα κλάσεων.     * Ο έλεγχος και η αποσφαλμάτωση του κώδικα σε μεγάλο βαθμό γίνεται διακριτά ανά κλάση ή ομάδα κλάσεων.
-    * Εάν μία κλάση δεν είναι καλά σχεδιασμένη ή υλοποιημένη μπορούμε να την ξαναγράψουμε από την αρχή χωρίς να επηρεαστεί ο υπόλοιπος κώδικας.+    * Εάν μία κλάση δεν είναι καλά σχεδιασμένη ή υλοποιημένη μπορούμε να την ξαναγράψουμε από την αρχή χωρίς να επηρεαστεί ο υπόλοιπος κώδικας, με την προϋπόθεση ότι δεν αλλάζει ο τρόπος με τον οποίο επικοινωνεί με τις υπόλοιπες κλάσεις.
   * Στον αντικειμενοστραφή προγραμματισμό η φάση του σχεδιασμού είναι εξαιρετικά σημαντική. Καλός σχεδιασμός σημαίνει συντηρήσιμος,​ ευκολότερος στην ανάπτυξη κώδικας.   * Στον αντικειμενοστραφή προγραμματισμό η φάση του σχεδιασμού είναι εξαιρετικά σημαντική. Καλός σχεδιασμός σημαίνει συντηρήσιμος,​ ευκολότερος στην ανάπτυξη κώδικας.
  
oop/introduction.txt · Last modified: 2017/02/16 08:34 by gthanos