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
oop:introduction [2016/02/17 16:05]
doufexi Added link for toc
oop:introduction [2017/02/16 08:34] (current)
gthanos [Κληρονομικότητα]
Line 47: Line 47:
   * Υπάρχουν επιμέρους τύποι αυτοκινήτων,​ sport, 4x4, sedan, coupe, supercars, luxury cars.   * Υπάρχουν επιμέρους τύποι αυτοκινήτων,​ sport, 4x4, sedan, coupe, supercars, luxury cars.
  
-Με βάση την παραπάνω παρατήρηση,​ μπορούμε να ορίσουμε κλάσεις που περιγράφουν γενικές έννοιες και στην συνέχεια να τις εξειδικεύσουμε δημιουργώντας νέες κλάσεις που περιγράφουν πιο ειδικές έννοιες. Ο λόγος που θα θέλαμε να κάνουμε κάτι τέτοιο είναι ότι κατά την εξέλιξη του λογισμικού θέλουμε κατά το δυνατόν να επαναχρησιμοποιήσουμε κώδικα που ήδη έχουμε, δημιουργώντας πιο σύνθετα και εξελιγμένα μοντέλα του υφιστάμενου λογισμικού+Με βάση την παραπάνω παρατήρηση,​ μπορούμε να ορίσουμε κλάσεις που περιγράφουν γενικές έννοιες και στην συνέχεια να τις εξειδικεύσουμε δημιουργώντας νέες κλάσεις που περιγράφουν πιο ειδικές έννοιες. Ο λόγος που θα θέλαμε να κάνουμε κάτι τέτοιο είναι ότι κατά την εξέλιξη του λογισμικού θέλουμε κατά το δυνατόν να επαναχρησιμοποιήσουμε κώδικα που ήδη έχουμε. ​
  
 Όταν εφευρέθηκε το ποδήλατο με ταχύτητες,​ ο εφευρέτης χρησιμοποίησε το υφιστάμενο βασικό σχέδιο του ποδηλάτου για να προσθέσει τον μηχανισμό των ταχυτήτων και να δημιουργήσει ένα νέο τύπο ποδηλάτου,​ το ποδήλατο με ταχύτητες. Σε αναλογία με τον πραγματικό κόσμο, ας υποθέσουμε ότι έχουμε μία κλάση που περιγράφει το κλασσικό ποδήλατο χωρίς ταχύτητες μέσω των παρακάτω τεσσάρων μεταβλητών. Όταν εφευρέθηκε το ποδήλατο με ταχύτητες,​ ο εφευρέτης χρησιμοποίησε το υφιστάμενο βασικό σχέδιο του ποδηλάτου για να προσθέσει τον μηχανισμό των ταχυτήτων και να δημιουργήσει ένα νέο τύπο ποδηλάτου,​ το ποδήλατο με ταχύτητες. Σε αναλογία με τον πραγματικό κόσμο, ας υποθέσουμε ότι έχουμε μία κλάση που περιγράφει το κλασσικό ποδήλατο χωρίς ταχύτητες μέσω των παρακάτω τεσσάρων μεταβλητών.
Line 68: Line 68:
  
 Τα αντικείμενα στον πραγματικό κόσμο ορίζουν την διεπαφή τους με τον έξω κόσμο μέσα από συγκεκριμένα εργαλεία που καταλήγουν σε συγκεκριμένες πράξεις. Για παράδειγμα, ​ Τα αντικείμενα στον πραγματικό κόσμο ορίζουν την διεπαφή τους με τον έξω κόσμο μέσα από συγκεκριμένα εργαλεία που καταλήγουν σε συγκεκριμένες πράξεις. Για παράδειγμα, ​
-  * τα κουμπιά και η οθόνη του κινητού τηλεφώνου ​ή της τηλεόρασης ​ορίζουν τις δυνατότητες αλληλεπίδρασης με την συσκευή. ​+  * τα κουμπιά και η οθόνη του κινητού τηλεφώνου ορίζουν τις δυνατότητες αλληλεπίδρασης με την συσκευή. ​
   * Το πληκτρολόγιο,​ το ποντίκι και η οθόνη ορίζουν τις δυνατότητες αλληλεπίδρασης με έναν επιτραπέζιο υπολογιστή.   * Το πληκτρολόγιο,​ το ποντίκι και η οθόνη ορίζουν τις δυνατότητες αλληλεπίδρασης με έναν επιτραπέζιο υπολογιστή.
-  * Η σέλα, το τιμόνι,​ τα πετάλια και τα φρένα ορίζουν τις δυνατότητες αλληλεπίδρασης με ένα ποδήλατο. 
  
-Ανάλογη είναι η λειτουργία της **διεπαφής** (interface) για τον αντικειμενοστραφή προγραμματισμό. Ορίζουμε μία **διεπαφή**,​ ως ένα σύνολο από μεθόδους ​(δηλ. τρόπους αλληλεπίδρασης με τα αντικείμενα)δίνοντας ​μόνο τους ορισμούς των μεθόδων, χωρίς την υλοποίηση τους. Εάν μία κλάση υλοποιεί ΟΛΕΣ τις μεθόδους μιας διεπαφής,​ τότε η κλάση είναι σύμφωνη με την συγκεκριμένη διεπαφή. Ο τρόπος που υλοποιεί κάθε κλάση τις μεθόδους της διεπαφής είναι εσωτερικό θέμα της κλάσης και δεν ελέγχεται από την διεπαφή. ​Επιπλέον,​ μία κλάση μπορεί να υλοποιεί ​μία ή περισσότερες διεπαφές.+Ανάλογη είναι η λειτουργία της **διεπαφής** (interface) για τον αντικειμενοστραφή προγραμματισμό. Ορίζουμε μία **διεπαφή**,​ ως ένα σύνολο από μεθόδους δίνοντας μόνο τους ορισμούς των μεθόδων,​ χωρίς την υλοποίηση τουςΟι μέθοδοι αυτές περιγράφουν τους ​τρόπους αλληλεπίδρασης ​των υπόλοιπων κλάσεων ​με τις κλάσεις που υλοποιούν τις συγκεκριμένες διεπαφές.  
 + 
 +Σε αναλογία με τον πραγματικό κόσμοσκεφτείτε ότι θέλετε ​να προτυποποιήσετε την διεπαφή ​της τηλεόρασης. Οποιαδήποτε τηλεόραση θα πρέπει ​να έχει __τουλάχιστον__ τα εξής: είσοδο για καλώδιο τροφοδοσίας ρεύματος, power button, κουμπί channel up/down, κουμπί volume up/down και μενού για τη διαχείριση ​των ​καναλιών και οθόνη. Οποιαδήποτε τηλεόραση ​μπορεί να έχει περισσότερα από τα παραπάνω,​ αλλά ​δεν μπορεί να έχει λιγότερα. Η διεπαφή επομένως ορίζει τα ελάχιστα ή απαραίτητα που πρέπει ​να υλοποιεί μία κλάση προκειμένου να είναι συγκεκριμένου τόπου. Για παράδειγμαμία τηλεόραση ​χωρίς ​κουμπί για να αλλάζουν ​τα κανάλια ή χωρίς οθόνη μάλλον δεν συγκεντρώνει όλα τα χαρακτηριστικά της τηλεόρασης. 
 + 
 +<WRAP tip 80% center round> 
 +Παρατηρήστε ότι η διεπαφή όπως την ​ορίσαμε παραπάνω δεν σας λέει τίποτα για το πως είναι φτιαγμένη εσωτερικά ​η τηλεόραση ή ποιες τεχνολογίες χρησιμοποιεί. Το μόνο που μπορεί να σας εξασφαλίσει η διεπαφή που θα προτυποιήσετε είναι να διαπιστώσετε εάν μία συσκευή που βρίσκεται μπροστά σας είναι τηλεόραση ή όχι. 
 +</​WRAP>​ 
 + 
 +Εάν μία κλάση υλοποιεί ΟΛΕΣ τις μεθόδους μιας διεπαφής,​ τότε η κλάση είναι σύμφωνη με την συγκεκριμένη διεπαφή. Ο τρόπος που υλοποιεί κάθε κλάση τις μεθόδους της διεπαφής είναι εσωτερικό θέμα της κλάσης και δεν ελέγχεται από την διεπαφή. ​Μία κλάση μπορεί να υλοποιεί περισσότερες ​από μία ​διεπαφές. 
 + 
 +=== Παράδειγμα διεπαφής ===
  
 Ας υποθέσουμε ότι ορίζεται η διεπαφή ''​MotorPropelled''​ η οποία περιγράφει ένα σύνολο μεθόδων που πρέπει να υλοποιούνται από μία κλάση προκειμένου τα αντικείμενα της κλάσης αυτής να είναι ''​MotorPropelled''​ (δηλαδή να κινούνται και με χρήση μηχανής εσωτερικής καύσης). Ας υποθέσουμε ότι οι μέθοδοι που χρειαζόμαστε είναι οι παρακάτω:​ Ας υποθέσουμε ότι ορίζεται η διεπαφή ''​MotorPropelled''​ η οποία περιγράφει ένα σύνολο μεθόδων που πρέπει να υλοποιούνται από μία κλάση προκειμένου τα αντικείμενα της κλάσης αυτής να είναι ''​MotorPropelled''​ (δηλαδή να κινούνται και με χρήση μηχανής εσωτερικής καύσης). Ας υποθέσουμε ότι οι μέθοδοι που χρειαζόμαστε είναι οι παρακάτω:​
Line 83: Line 92:
 Αν οποιαδήποτε κλάση υλοποιεί τις παραπάνω μεθόδους τότε μπορούμε να πούμε ότι υλοποιεί το συγκεκριμένο interface, δηλ. τα αντικείμενα της κλάσης αυτής είναι //​MotorPropelled//​. Η νέα κλάση μπορεί να είναι κάποια υποκλάση μιας ήδη γνωστής κλάσης (π.χ. μία υποκλάση της κλάσης //​Bicycle//​) αλλά μπορεί να είναι και οποιαδήποτε άλλη κλάση αυτοκινούμενου οχήματος ακόμη και μία κλάση που ορίζεται εξ' αρχής. ​ Αν οποιαδήποτε κλάση υλοποιεί τις παραπάνω μεθόδους τότε μπορούμε να πούμε ότι υλοποιεί το συγκεκριμένο interface, δηλ. τα αντικείμενα της κλάσης αυτής είναι //​MotorPropelled//​. Η νέα κλάση μπορεί να είναι κάποια υποκλάση μιας ήδη γνωστής κλάσης (π.χ. μία υποκλάση της κλάσης //​Bicycle//​) αλλά μπορεί να είναι και οποιαδήποτε άλλη κλάση αυτοκινούμενου οχήματος ακόμη και μία κλάση που ορίζεται εξ' αρχής. ​
  
-Στον αντικειμενοστραφή προγραμματισμό,​ όσες κλάσεις υλοποιούν όλες τις παραπάνω μεθόδους,​ υλοποιούν συνολικά το interface. Ως εκ τούτου υποστηρίζουν τις ιδιότητες του interface ​αυτού.+Στον αντικειμενοστραφή προγραμματισμό,​ όσες κλάσεις υλοποιούν όλες τις παραπάνω μεθόδους,​ υλοποιούν συνολικά το interface. Ως εκ τούτου υποστηρίζουν τις ιδιότητες του interface.
  
 ==== Πλεονεκτήματα του Αντικ/​στραφούς Προγραμματισμού ==== ==== Πλεονεκτήματα του Αντικ/​στραφούς Προγραμματισμού ====
 +
   * **Αρθρωτή Δομή (Modularity):​** O κώδικας μίας κλάσης μπορεί να σχεδιαστεί και να αναπτυχθεί εντελώς ανεξάρτητα από τον κώδικα άλλης κλάσης. Η υλοποίηση μίας κλάσης μπορεί να αλλάξει ριζικά χωρίς να επηρεαστεί ο κώδικας των κλάσεων που χρησιμοποιούν τη συγκεκριμένη κλάση.   * **Αρθρωτή Δομή (Modularity):​** O κώδικας μίας κλάσης μπορεί να σχεδιαστεί και να αναπτυχθεί εντελώς ανεξάρτητα από τον κώδικα άλλης κλάσης. Η υλοποίηση μίας κλάσης μπορεί να αλλάξει ριζικά χωρίς να επηρεαστεί ο κώδικας των κλάσεων που χρησιμοποιούν τη συγκεκριμένη κλάση.
-  * **Απόκρυψη πληροφορίας:​** Στον αντικειμενοστραφή προγραμματισμό δεν μας ενδιαφέρει η εσωτερική υλοποίηση κάθε κλάσης αλλά μόνο οι δημόσιες (public) μέθοδοι που υλοποιεί. +  * **Απόκρυψη πληροφορίας ​(Information Hiding):** Στον αντικειμενοστραφή προγραμματισμό δεν μας ενδιαφέρει η εσωτερική υλοποίηση κάθε κλάσης αλλά μόνο οι δημόσιες (public) μέθοδοι που υλοποιεί. 
-  * **Επαναχρησιμοποίηση κώδικα:​** Η κλάση σχεδιάζεται έτσι ώστε να μπορεί να επαναχρησιμοποιηθεί και σε άλλα προγράμματα. +  * **Επαναχρησιμοποίηση κώδικα ​(Code Reuse):** Η κλάση σχεδιάζεται έτσι ώστε να μπορεί να επαναχρησιμοποιηθεί και σε άλλες κλάσεις. Η επαναχρησιμοποίηση κώδικα βρίσκει εφαρμογή μέσω της κληρονομικότητας
-  * **Επεκτασιμότητα:​** ​Η κλάση μπορεί να επεκταθεί μέσω της κληρονομικότητας σε πιο ειδικές κλάσεις.+  * **Επεκτασιμότητα ​(Extensibility):** Οποιαδήποτε ​κλάση μπορεί να επεκταθεί μέσω της κληρονομικότητας σε πιο ειδικές κλάσεις.
   * **Ευκολότερη αποσφαλμάτωση:​** Κατά την αποσφαλμάτωση ο αρχικός έλεγχος μπορεί να γίνει σε επίπεδο κλάσης (**Unit testing**). Αλλαγές σε μία κλάση δεν συνεπάγονται αλλαγές και σε άλλα σημεία του προγράμματος που χρησιμοποιούν την κλάση αυτή.   * **Ευκολότερη αποσφαλμάτωση:​** Κατά την αποσφαλμάτωση ο αρχικός έλεγχος μπορεί να γίνει σε επίπεδο κλάσης (**Unit testing**). Αλλαγές σε μία κλάση δεν συνεπάγονται αλλαγές και σε άλλα σημεία του προγράμματος που χρησιμοποιούν την κλάση αυτή.
-  * **Μία ομάδα προγραμματιστών ​μπορεί να εργαστεί παράλληλα:** +  * **Σχεδιασμός:** Στον ​αντικειμενοστραφή προγραμματισμό η φάση του ​σχεδιασμού είναι εξαιρετικά σημαντική. Καλός σχεδιασμός σημαίνει συντηρήσιμος, ευκολότερος στην ανάπτυξη κώδικας. Αντίθετα ο κακός σχεδιασμός οδηγεί διαρκώς σε προβλήματα που ανακύπτουν στην φάση ​της ανάπτυξης. 
-    * Ορίζεται ο τρόπος με τον ​οποίο επικοινωνούν οι κλάσεις μεταξύ τους. + 
-    * Κάθε ​προγραμματιστής ή ομάδα υλοποιεί τις επιμέρους κλάσεις που του/της ανατίθενται. + 
-    * Ο έλεγχος και η αποσφαλμάτωση του ​κώδικα σε μεγάλο βαθμό γίνεται διακριτά ανά ​κλάση ​ή ομάδα κλάσεων+| Προηγούμενο: [[java:​break_loop_statements |Εντολές τερματισμού ​και ελέγχου ​της ανακύκλωσης]] | [[:toc | Περιεχόμενα ]]| | Επόμενο: [[:​java:​class | Η κλάση ]]|
-    * Εάν μία κλάση δεν είναι καλά σχεδιασμένη ή υλοποιημένη μπορούμε να την ξαναγράψουμε από την αρχή χωρίς ​να επηρεαστεί ο υπόλοιπος ​κώδικας, με την προϋπόθεση ότι δεν αλλάζει ο τρόπος με τον ​οποίο επικοινωνεί με τις υπόλοιπες κλάσεις. +
-  * Στον αντικειμενοστραφή προγραμματισμό η φάση του σχεδιασμού ​είναι εξαιρετικά σημαντική. Καλός σχεδιασμός σημαίνει συντηρήσιμος, ευκολότερος ​στην ανάπτυξη κώδικας.+
  
-| [[:toc | Περιεχόμενα ]]|| Επόμενο:​ [[:​java:​install | Εγκατάσταση του περιβάλλοντος ανάπτυξης JDK ]]| 
  
  
oop/introduction.1455725153.txt.gz · Last modified: 2016/02/26 11:15 (external edit)