User Tools

Site Tools


oop:introduction

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

Κεντρικό στοιχείο του Αντικειμενοστραφούς Προγραμματισμού είναι η χρήση αντικειμένων. Τα αντικείμενα στον αντικειμενοστραφή προγραμματισμό τείνουν να προσομοιάσουν ευρύτερες έννοιες που υφίστανται στον πραγματικό κόσμο. Παραδείγματα αντικειμένων μπορεί να είναι το αυτοκίνητο, το ποδήλατο, η τηλεόραση, ο υπολογιστής κλπ.

Τα “αντικείμενα” στον πραγματικό κόσμο έχουν δύο βασικά χαρακτηριστικά:

  1. Κατάσταση (state): Κάθε αντικείμενο διέπεται από συγκεκριμένα χαρακτηριστικά που ορίζουν την κατάσταση του. Για παράδειγμα ένα αυτοκίνητο έχει συγκεκριμένο χρώμα, ανήκει σε συγκεκριμένο μοντέλο και κάθε χρονική στιγμή έχει μία ταχύτητα και μία κατεύθυνση κίνησης. Τα παραπάνω χαρακτηριστικά διέπουν όλα τα αυτοκίνητα, αλλά κάθε αυτοκίνητο έχει τις δικές του τιμές οι οποίες μπορεί να διαφέρουν από τις τιμές άλλων αυτοκινήτων.
  2. Συμπεριφορά (behaviour): Κάθε αντικείμενο διέπεται από συγκεκριμένους κανόνες συμπεριφοράς. Για παράδειγμα σε ένα αυτοκίνητο εάν στρίψουμε το τιμόνι στα αριστερά το αυτοκίνητο κινείται αριστερά. Ο παραπάνω γενικός κανόνας ισχύει για όλα τα αυτοκίνητα. Η σχέση μεταξύ της γωνίας στροφής του τιμονιού ενός αυτοκινήτου και της αλλαγή πορείας που αυτή συνεπάγεται μπορεί να διαφέρει μεταξύ διαφορετικών μοντέλων.

Σε αναλογία των παραπάνω, τα αντικείμενα στον αντικειμενοστραφή προγραμματισμό διαθέτουν:

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

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

Η Κλάση

Τα παραδείγματα αντικειμένων που αναφέρθηκαν παραπάνω μπορεί κάποιος να τα δει με δύο διαφορετικούς τρόπους: α) το σχέδιο του κάθε αντικειμένου και β) το αντικείμενο αυτό καθ' αυτό.

Για παράδειγμα, όταν παράγεται ένα αυτοκίνητο, αυτό αποτελεί υλοποίηση του βασικού σχεδίου του αυτοκινήτου, έτσι όπως αυτό υλοποιείται από το εργοστάσιο κατασκευής. Μέρος του σχεδίου είναι η ύπαρξη κάποιων παραμέτρων όπως το χρώμα ή το επίπεδο του εξοπλισμού.

Στον αντικειμενοστραφή προγραμματισμό, το ρόλο του σχεδίου με την έννοια που αναφέρεται παραπάνω τον παίζει η κλάση. Η κλάση αποτελεί το σχέδιο με βάση το οποίο αντικείμενα του τύπου της συγκεκριμένης κλάσης υλοποιούνται σε ένα πρόγραμμα.

Όλα τα αντικείμενα της ίδιας κλάσης διέπονται από τις ίδιες εσωτερικές μεταβλητές (που αποτελούν τα δεδομένα ή πεδία της κλάσης) και από τις ίδιες συμπεριφορές (μεθόδους ή συναρτήσεις). Τα αντικείμενα της ίδιας κλάσης μπορεί να διαφέρουν ως προς τις τιμές των εσωτερικών τους μεταβλητών.

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

Κατασκευαστές της Κλάσης (Class Constructors)

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

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

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

Στον αντικειμενοστραφή προγραμματισμό τα αντικείμενα υλοποιούνται από μία ειδικίη μέθοδο που καλείται κατασκευαστής (constructor). Ο κατασκευαστής της κλάσης μπορεί να κληθεί για διαφορετικά αντικείμενα με διαφορετικές παραμέτρους, οδηγώντας τελικά σε διαφοροποιημένα αντικείμενα ως προς τα επιμέρους χαρακτηριστικά τους.

Μία κλάση έχει τουλάχιστον ένα κατασκευαστή. Συνοπτικά, οι κατασκευαστές είναι μέθοδοι (συναρτήσεις) που κάνουν τα εξής:

  1. Δεσμεύουν την απαραίτητη μνήμη για το νέο αντικείμενο.
  2. Αρχικοποιούν το αντικείμενο με βάση τις αρχικές τιμές των παραμέτρων με τις οποίες καλούνται.

Περιεχόμενα της Κλάσης

Κάθε κλάση περιέχει κατά βάση τρία τις παρακάτω βασικές κατηγορίες πληροφορίας

  1. Δεδομένα ή πεδία. Τα πεδία διακρίνονται σε:
    • Βασικούς τύπους δεδομένων (Primitive Types), char, int, long, float, double, arrays κλπ.
    • Σύνθετους τύπους δεδομένων (Reference Types), Strings, Arrays, Objects κλπ.
  2. Kατασκευαστές αντικειμένων.
  3. Μεθόδους: Συναρτήσεις οι οποίες μπορεί να λαμβάνουν τυπικές παραμέτρους, αλλά σε κάθε περίπτωση έχουν πρόσβαση σε όλα τα πεδία (δεδομένα) της κλάσης.

Κληρονομικότητα

Στον πραγματικό κόσμο πολλά πράγματα μοιράζονται κοινά χαρακτηριστικά. Για παράδειγμα:

  • Υπάρχουν επιμέρους τύποι ποδηλάτων, όπως mountain, street, bmx κλπ.
  • Υπάρχουν επιμέρους τύποι αυτοκινήτων, sport, 4×4, sedan, coupe, supercars, luxury cars.

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

Ένα σύντομο παράδειγμα κληρονομικότητας

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

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

  • ο μεταγλωττιστής της γλώσσας ενσωματώνει αυτόματα στη νέα κλάση τα χαρακτηριστικά της γονικής κλάσης και
  • ο προγραμματιστής αρκεί να προσθέσει ότι επιπλέον χρειάζεται προκειμένου να δημιουργηθεί η νέα κλάση. Η νέα κλάση αποτελεί επέκταση της αρχικής καθώς ενσωματώνει όλα τα χαρακτηριστικά της, αλλά παράγει αντικείμενα του νέου τύπου.

Επεκτείνοντας την παραπάνω λογική μπορούμε να έχουμε πολλαπλές ιεραρχίες κλάσεων. Για παράδειγμα, από το ποδήλατο με ταχύτητες μπορεί να οριστεί το ποδήλατο για δύο επιβάτες με ταχύτητες ή το ποδήλατο για δύο επιβάτες με ταχύτητες και αμορτισέρ.

ποδήλατο –> ποδήλατο με ταχύτητες –> ποδήλατο με ταχύτητες για δύο επιβάτεςποδήλατο με ταχύτητες και αμορτισέρ για δύο επιβάτες.

Συμβάσεις: Για το ποδήλατο με ταχύτητες η κλάση ποδήλατο αποτελεί την γονική κλάση (Super Class). Αντίστοιχα για το ποδήλατο, το ποδήλατο με ταχύτητες αποτελεί υποκλάση (Sub Class) αυτού.

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

Επίσης, καθώς κάθε υποκλάση ενσωματώνει τα χαρακτηριστικά της βασικής της κλάσης οφείλουμε να πούμε τα τα αντικείμενα της υποκλάσης είναι αντικείμενα και της γονικής κλάσης. Για παράδειγμα, ένα αντικείμενο του τύπου “ποδήλατο με ταχύτητες” που προκύπτει από την γονική κλάση “ποδήλατο”, είναι και του τύπου “ποδήλατο”. Ο παραπάνω συλλογισμός φαίνεται προφανής στον πραγματικό κόσμο και διατηρείται και στο αντικειμενοστραφή προγραμματισμό.

Στην παρακάτω εικόνα παρουσιάζεται εποπτικά ένα παράδειγμα κληρονομικότητας της κλάσης του ποδηλάτου. Από την γενική κλάση του ποδηλάτου προκύπτουν δύο επιμέρους κλάσεις α) το ποδήλατο για δύο επιβάτες (χωρίς ταχύτητες) β) το ποδήλατο με ταχύτητες.

Μπορείτε να προτείνετε κάποια άλλη ιεραρχία κλάσεων για κάποια άλλη οντότητα (π.χ. το αυτοκίνητο) σε αναλογία με αυτή που περιγράψαμε για το ποδήλατο;

Διεπαφές - Interfaces

Τα αντικείμενα στον πραγματικό κόσμο ορίζουν την διεπαφή τους με τον έξω κόσμο μέσα από συγκεκριμένα εργαλεία που καταλήγουν σε συγκεκριμένες πράξεις. Για παράδειγμα,

  • τα κουμπιά και η οθόνη του κινητού τηλεφώνου ορίζουν τις δυνατότητες αλληλεπίδρασης με την συσκευή.
  • Το πληκτρολόγιο, το ποντίκι και η οθόνη ορίζουν τις δυνατότητες αλληλεπίδρασης με έναν επιτραπέζιο υπολογιστή.

Ανάλογη είναι η λειτουργία της διεπαφής (interface) για τον αντικειμενοστραφή προγραμματισμό. Ορίζουμε μία διεπαφή, ως ένα σύνολο από μεθόδους δίνοντας μόνο τους ορισμούς των μεθόδων, χωρίς την υλοποίηση τους. Οι μέθοδοι αυτές περιγράφουν τους τρόπους αλληλεπίδρασης των υπόλοιπων κλάσεων με τις κλάσεις που υλοποιούν τις συγκεκριμένες διεπαφές.

Σε αναλογία με τον πραγματικό κόσμο, σκεφτείτε ότι θέλετε να προτυποποιήσετε την διεπαφή της τηλεόρασης. Οποιαδήποτε τηλεόραση θα πρέπει να έχει τουλάχιστον τα εξής: είσοδο για καλώδιο τροφοδοσίας ρεύματος, power button, κουμπί channel up/down, κουμπί volume up/down και μενού για τη διαχείριση των καναλιών και οθόνη. Οποιαδήποτε τηλεόραση μπορεί να έχει περισσότερα από τα παραπάνω, αλλά δεν μπορεί να έχει λιγότερα. Η διεπαφή επομένως ορίζει τα ελάχιστα ή απαραίτητα που πρέπει να υλοποιεί μία κλάση προκειμένου να είναι συγκεκριμένου τύπου. Για παράδειγμα, μία τηλεόραση χωρίς κουμπί για να αλλάζουν τα κανάλια ή χωρίς οθόνη μάλλον δεν συγκεντρώνει όλα τα χαρακτηριστικά της τηλεόρασης.

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

Εάν μία κλάση υλοποιεί ΟΛΕΣ τις μεθόδους μιας διεπαφής, τότε η κλάση είναι σύμφωνη με την συγκεκριμένη διεπαφή. Ο τρόπος που υλοποιεί κάθε κλάση τις μεθόδους της διεπαφής είναι εσωτερικό θέμα της κλάσης και δεν ελέγχεται από την διεπαφή. Μία κλάση μπορεί να υλοποιεί περισσότερες από μία διεπαφές.

Παράδειγμα διεπαφής

Ας υποθέσουμε ότι ορίζεται η διεπαφή Stack (στοίβα) η οποία περιγράφει ένα σύνολο μεθόδων που πρέπει να υλοποιούνται από μία κλάση προκειμένου τα αντικείμενα της κλάσης αυτής να ικανοποιούν τη στοίβα. Ως γνωστόν οι μέθοδοι που απαιτείται να υλοποιεί μία στοίβα είναι οι παρακάτω:

  • push: εισαγωγή στοιχείου στην κορυφή της στοίβας.
  • pop: αφαίρεση στοιχείου από την κορυφή της στοίβας.
  • top: επιστροφη της τιμής του κορυφαίου στοιχείου της στοίβας (χωρίς να αφαιρεθεί).

Αν οποιαδήποτε κλάση υλοποιεί τις παραπάνω μεθόδους τότε μπορούμε να πούμε ότι υλοποιεί την διεπαφή της στοίβας.

Στον αντικειμενοστραφή προγραμματισμό, όσες κλάσεις υλοποιούν ΟΛΕΣ τις μεθόδους μίας διεπαφής, υλοποιούν συνολικά τη διεπαφή. Εάν έστω και μία μέθοδος δεν υλοποιείται, δεν υλοποιείται και η διεπαφή.

Πλεονεκτήματα του Αντικ/στραφούς Προγραμματισμού

  • Αρθρωτή Δομή (Modularity): O κώδικας μίας κλάσης μπορεί να σχεδιαστεί και να αναπτυχθεί εντελώς ανεξάρτητα από τον κώδικα άλλης κλάσης. Η υλοποίηση μίας κλάσης μπορεί να αλλάξει ριζικά χωρίς να επηρεαστεί ο κώδικας των κλάσεων που χρησιμοποιούν τη συγκεκριμένη κλάση.
  • Απόκρυψη πληροφορίας: Στον αντικειμενοστραφή προγραμματισμό δεν μας ενδιαφέρει η εσωτερική υλοποίηση κάθε κλάσης αλλά μόνο οι δημόσιες (public) μέθοδοι που υλοποιεί.
  • Επαναχρησιμοποίηση κώδικα: Η κλάση σχεδιάζεται έτσι ώστε να μπορεί να επαναχρησιμοποιηθεί και σε άλλες κλάσεις. Η επαναχρησιμοποίηση κώδικα βρίσκει εφαρμογή μέσω της κληρονομικότητας.
  • Επεκτασιμότητα: Οποιαδήποτε κλάση μπορεί να επεκταθεί μέσω της κληρονομικότητας σε πιο ειδικές κλάσεις.
  • Ευκολότερη αποσφαλμάτωση: Κατά την αποσφαλμάτωση ο αρχικός έλεγχος μπορεί να γίνει σε επίπεδο κλάσης (Unit testing). Αλλαγές σε μία κλάση δεν συνεπάγονται αλλαγές και σε άλλα σημεία του προγράμματος που χρησιμοποιούν την κλάση αυτή.
  • Σχεδιασμός: Στον αντικειμενοστραφή προγραμματισμό η φάση του σχεδιασμού είναι εξαιρετικά σημαντική. Καλός σχεδιασμός σημαίνει συντηρήσιμος, ευκολότερος στην ανάπτυξη κώδικας. Αντίθετα ο κακός σχεδιασμός οδηγεί διαρκώς σε προβλήματα που ανακύπτουν στην φάση της ανάπτυξης.
oop/introduction.txt · Last modified: 2020/02/21 11:17 (external edit)