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/01/20 14:48]
gthanos [Διεπαφές - Interfaces]
oop:introduction [2015/02/18 11:00]
gthanos [Κληρονομικότητα]
Line 16: Line 16:
 ===== Η Κλάση ===== ===== Η Κλάση =====
  
-Τα αντικείμενα που περιγράψαμε παραπάνω αποτελούν (εναλλακτικές) υλοποιήσεις ενός βασικού σχεδίου. Για παράδειγμα,​ όταν αγοράζει κάποιος ​ένα αυτοκίνητο,​ αυτό αποτελεί υλοποίηση του βασικού σχεδίου του αυτοκινήτου,​ έτσι όπως αυτό υλοποιείται από το εργαστάσιο κατασκευής. Μέρος του **σχεδίου** είναι η ύπαρξη κάποιων παραμέτρων όπως το χρώμα ή το επίπεδο του εξοπλισμού.+Τα αντικείμενα που περιγράψαμε παραπάνω αποτελούν (εναλλακτικές) υλοποιήσεις ενός βασικού σχεδίου. Για παράδειγμα,​ όταν ​παράγεται ένα αυτοκίνητο,​ αυτό αποτελεί υλοποίηση του βασικού σχεδίου του αυτοκινήτου,​ έτσι όπως αυτό υλοποιείται από το εργαστάσιο κατασκευής. Μέρος του **σχεδίου** είναι η ύπαρξη κάποιων παραμέτρων όπως το χρώμα ή το επίπεδο του εξοπλισμού.
  
 | Τον ρόλο του **σχεδίου** με την έννοια που αναφέρεται παραπάνω τον παίζει η **κλάση**. Η κλάση αποτελεί το σχέδιο με βάση το οποίο αντικείμενα του συγκεκριμένου τύπου της κλάσης υλοποιούνται σε ένα πρόγραμμα. Τα αντικείμενα μιας κλάσης διέπονται από τις ίδιες //​εσωτερικές μεταβλητές//​ (δεδομένα) και από τις ίδιες //​συμπεριφορές//​ (συναρτήσεις). Τα αντικείμενα της ίδιας κλάσης μπορεί να διαφέρουν ως προς το περιεχόμενο των //​εσωτερικών τους μεταβλητών//​. ​ | {{ :​oop:​class-object.png ?200|}} | | Τον ρόλο του **σχεδίου** με την έννοια που αναφέρεται παραπάνω τον παίζει η **κλάση**. Η κλάση αποτελεί το σχέδιο με βάση το οποίο αντικείμενα του συγκεκριμένου τύπου της κλάσης υλοποιούνται σε ένα πρόγραμμα. Τα αντικείμενα μιας κλάσης διέπονται από τις ίδιες //​εσωτερικές μεταβλητές//​ (δεδομένα) και από τις ίδιες //​συμπεριφορές//​ (συναρτήσεις). Τα αντικείμενα της ίδιας κλάσης μπορεί να διαφέρουν ως προς το περιεχόμενο των //​εσωτερικών τους μεταβλητών//​. ​ | {{ :​oop:​class-object.png ?200|}} |
  
-| Το διπλανό σχήμα απεικονίζει διαφορετικές υλοποιήσεις ενός αυτοκινήτου με βάση το αρχικό σχέδιο του συγκεκριμένου μοντέλου. Αντιστρέφοντας το παράδειγμα του αυτοκινήτου,​ όλα τα αυτοκίνητα του συγκεκριμένου μοντέλου αποτελούν υλοποιήσεις του ίδιου αρχικού σχεδίου. | {{:oop:car-class-object.jpg?100 }} |+| Το διπλανό σχήμα απεικονίζει διαφορετικές υλοποιήσεις ενός αυτοκινήτου με βάση το αρχικό σχέδιο του συγκεκριμένου μοντέλου. Αντιστρέφοντας το παράδειγμα του αυτοκινήτου,​ όλα τα αυτοκίνητα του συγκεκριμένου μοντέλου αποτελούν υλοποιήσεις του ίδιου αρχικού σχεδίου. | {{:oop:astra-class-object.png?250 }} |
  
 ==== Κατασκευαστές της Κλάσης (Class Constructors) ==== ==== Κατασκευαστές της Κλάσης (Class Constructors) ====
Line 41: Line 41:
     * Σύνθετους τύπους δεδομένων (Reference Types), Strings, Arrays, Objects κλπ     * Σύνθετους τύπους δεδομένων (Reference Types), Strings, Arrays, Objects κλπ
   - **Kατασκευαστές αντικειμένων**.   - **Kατασκευαστές αντικειμένων**.
-  - **Μεθόδους** (συναρτήσεις στην γλώσσα C)+  - **Μεθόδους** (το αντίστοιχο των ​συναρτήσεων στην γλώσσα C)
  
 ==== Κληρονομικότητα ==== ==== Κληρονομικότητα ====
Line 49: Line 49:
   * Υπάρχουν επιμέρους τύποι αυτοκινήτων,​ sport, 4x4, sedan, coupe, supercars, luxury cars.   * Υπάρχουν επιμέρους τύποι αυτοκινήτων,​ sport, 4x4, sedan, coupe, supercars, luxury cars.
  
-Γενικά, μπορούμε να ορίσουμε κλάσεις που περιγράφουν γενικότερες έννοιες και στην συνέχεια να τις εξειδικεύσουμε περιγράφοντας έννοιες πιο ειδικές. Για παράδειγμα, για ένα τζιπ ​επιβατικό αυτοκίνητο μπορεί να οριστεί η παρακάτω ​ιεραρχία.+Με βάση την παραπάνω παρατήρηση, μπορούμε να ορίσουμε κλάσεις που περιγράφουν γενικότερες έννοιες και στην συνέχεια να τις εξειδικεύσουμε ​δημιουργώντας νέες κλάσεις που ​περιφράφουν πιο ειδικές έννοιες. Ο λόγος που θα θέλαμε να κάνουμε κάτι τέτοιο είναι ότι κατά την ​εξέλιξη του λογισμικού θέλουμε κατά το δυνατόν να επαναχρησιμοποιήσουμε κώδικα ​που ήδη έχουμε, δημιουργώντας πιο σύνθετα και εξελιγμένα μοντέλα του υφιστάμενου λογισμικού
  
-//**Αυτοκινούμενο όχημα** --> **Τετράτροχο αυτοκινούμενο ​όχημα** --> **Επιβατικό ​τετράτροχο αυτοκινούμενο όχημα** -> **Επιβατικό τετράτροχο αυτοκινούμενο ​όχημα για χρήση εκτός δρόμου ​(τζιπ)** --> **Επιβατικό τετράτροχο αυτοκινούμενο ​όχημα για χρήση εκτός δρόμου (τζιπ) - συγκεκριμένο μοντέλο **//.+Όταν εφευρέθηκε ​το ποδήλατο με ταχύτητες, ​ο εφευρέτης ​χρησιμοποίησε το υφιστάμενο βασικό σχέδιο ​του ποδηλάτου για να προσθέσει τον μηχανισμό των ταχυτήτων ​και να δημιουργήσει ένα νέο τύπο ποδηλάτου, το ποδήλατο ​με ταχύτητες. Σε αναλογία με τον ​πραγματικό ​κόσμο, ας υποθέσουμε ότι έχουμε μία κλάση που περιγράφει ​το ποδήλατο κλασσικό ποδήλατο χωρίς ταχύτητες ​μέσω των παρακάτω τεσσάρων μεταβλητών. 
 +  - ταχύτητα ​κίνησης 
 +  - θέση 
 +  - κατεύθυνση κίνησης 
 +  - ταχύτητα περιστροφής των πεταλιών 
 +Παράλληλα υπάρχουν και κάποιες συναρτήσεις για την μεταβολή της τιμής των παραπάνω ​μεταβλητών. Ας υποθέσουμε τώρα ότι θέλουμε να σχεδιάσουμε το ποδήλατο με ταχύτητες. Θα χρειαστεί να προσθέσουμε μία νέα μεταβλητή που αντιπροσωπεύει τον αριθμό της ταχύτητας στο γρανάζι. Η ιδιότητα της κληρονομικότητας μας επιτρέπει να δημιουργήσουμε τη νέα κλάση του ποδηλάτου ​με ταχύτητες, επεκτείνοντας την κλάση του κλασσικού ποδηλάτου και προσθέτοντας την επιπλέον μεταβλητή και λειτουργικότητα. Η κληρονομικότητα ​μας επιτρέπει ​να μην γράψουμε την νέα κλάση από την αρχή αλλά να πατήσουμε πάνω σε ένα υφιστάμενο σχέδιο.
  
-Με βάση ​την παραπάνω ιεραρχίαμπορούμε να ορίσουμε την αρχική κλάση του αυτοκινούμενου οχήματος, την οποία στη συνέχεια να εξειδικεύσουμε σε πιο ειδικές κλάσεις. Οι γλώσσες αντικειμενοστραφούς προγραμματισμού δίνουν την δυνατότητα να δημιουργηθούν ιεραρχίες κλάσεων (//σχεδίων//)όπου οι πιο ειδικές κλάσεις ​(**υποκλάσεις - __Sub Classes__**) ​κληρονομούν τα χαρακτηριστικά των **γονικών (__Super Classes__)** κλάσεων, τα οποία εξειδικεύουν περαιτέρω+Επεκτείνοντας ​την παραπάνω ​συλλογιστική μπορούμε να έχουμε πολλαπλές ​ιεραρχίες κλάσεων. Για παράδειγμα, από το ποδήλατο με ταχύτητας ​μπορεί να οριστεί το ποδήλατο για δύο άτομα με ταχύτητες ή το ποδήλατο για δύο ​άτομα με ταχύτητες και αμορτισέρ. 
 + 
 +//​**ποδήλατο** --> **ποδήλατο με ταχύτητες** --> **ποδήλατο ​με ταχύτητες για δύο άτομα** -> **ποδήλατο με ταχύτητες ​και αμορτισέρ για δύο άτομα**//​. 
 + 
 +Για το **ποδήλατο ​με ταχύτητες** η κλάση **ποδήλατο** αποτελεί την γονική κλάση (__Super Classes__). Αντίστοιχα για το **ποδήλατο**, το **ποδήλατο με ταχύτητες** αποτελεί υποκλάση (__Sub Class__) αυτού. 
 + 
 +| Στο διπλανή εικόνα παρουσιάζεται ​εποπτικά ένα παράδειγμα ​κληρονομικότητας της κλάσης του ​ποδηλάτου. Από την γενική κλάση του ποδηλάτου προκύπτουν δύο ​επιμέρους κλάσεις **α)** το ποδήλατο για δύο ​επιβάτες (χωρίς ταχύτητες) **β)** το ποδήλατο με ταχύτητες. | {{:​oop:​bicycle-hierarchy.png?​300 |}} | 
 + 
 +=== Επαναχρησιμοποίηση κώδικα με βάση την ιδιότητα της κληρονομικότητας === 
 + 
 +Η ιδιότητα της κληρονομικότητας μας επιτρέπει ​να επαναχρησιμοποιούμε και να επεκτείνουμε υφιστάμενο κώδικαδημιουργώντας ​πιο ​σύνθετες κλάσεις. Στο παράδειγμα του παραπάνω σχήματος η βασική ​κλάση του ποδηλάτου ​επεκτείνεται στην ​κλάση του ποδηλάτου με ταχύτητες προσθέτοντας  
 +  - μία μεταβλητή που αποθηκεύει ​την τρέχουσα ταχύτητα του ποδηλάτου 
 +  - και 3 μεθόδους:​ μία μέθοδο που αυξάνει την ταχύτητα του ποδηλάτου κατά μία θέση στο γρανάζιμία μέθοδο που μειώνει την ταχύτητα ποδηλάτου κατά μία θέση στο γρανάζι και μία μέθοδο ​που επιστρέφει την τρέχουσα ταχύτητα ποδηλάτου.
  
-| Στο διπλανή εικόνα παρουσιάζεται το παράδειγμα κληρονομικότητας της κλάσης του ποδηλάτου. Από την γενική κλάση του ποδηλάτου προκύπτουν δύο επιμέρους κλάσεις **α)** το ποδήλατο για δύο επιβάτες **β)** το ποδήλατο με ταχύτητες. | {{:​oop:​bicycle-hierarchy.png?​200 |}} | 
  
 ==== Διεπαφές - Interfaces ==== ==== Διεπαφές - Interfaces ====
Line 111: Line 127:
   * **Επεκτασιμότητα:​** Η κλάση μπορεί να επεκταθεί μέσω της κληρονομικότητας σε πιο ειδικές κλάσεις.   * **Επεκτασιμότητα:​** Η κλάση μπορεί να επεκταθεί μέσω της κληρονομικότητας σε πιο ειδικές κλάσεις.
   * **Ευκολότερη αποσφαλμάτωση:​** Κατά την αποσφαλμάτωση ο αρχικός έλεγχος μπορεί να γίνει σε επίπεδο κλάσης (**Unit testing**). Αλλαγές σε μία κλάση δεν συνεπάγονται αλλαγές και σε άλλα σημεία του προγράμματος που χρησιμοποιούν την κλάση αυτή.   * **Ευκολότερη αποσφαλμάτωση:​** Κατά την αποσφαλμάτωση ο αρχικός έλεγχος μπορεί να γίνει σε επίπεδο κλάσης (**Unit testing**). Αλλαγές σε μία κλάση δεν συνεπάγονται αλλαγές και σε άλλα σημεία του προγράμματος που χρησιμοποιούν την κλάση αυτή.
 +  * **Μία ομάδα προγραμματιστών μπορεί να εργαστεί παράλληλα:​**
 +    * Ορίζονται τα κατάλληλα interfaces που πρέπει να υλοποιηθούν
 +    * Κάθε προγραμματιστής ή ομάδα υλοποιεί τις επιμέρους κλάσεις που του/​της ανατίθενται.
 +    * Ο έλεγχος και η αποσφαλμάτωση του κώδικα σε μεγάλο βαθμό γίνεται διακριτά ανά κλάση ή ομάδα κλάσεων.
 +    * Εάν μία κλάση δεν είναι καλά σχεδιασμένη ή υλοποιημένη μπορούμε να την ξαναγράψουμε από την αρχή χωρίς να επηρεαστεί ο υπόλοιπος κώδικας.
 +  * Στον αντικειμενοστραφή προγραμματισμό η φάση του σχεδιασμού είναι εξαιρετικά σημαντική. Καλός σχεδιασμός σημαίνει συντηρήσιμος,​ ευκολότερος στην ανάπτυξη κώδικας.
 +
 +| Επόμενο:​ [[:​java:​class | Η κλάση]]|
 +
 +
  
  
oop/introduction.txt · Last modified: 2017/02/16 08:34 by gthanos