Αντικειμενοστραφής προγραμματισμός
Βιβλίο 2 Ενότητα 4 · Αντικείμενα, κλάσεις, αφαιρετικότητα, ενθυλάκωση, κληρονομικότητα, πολυμορφισμός
Σε ένα παιχνίδι υπάρχουν παίκτες, εχθροί, όπλα, πόρτες. Κάθε παίκτης έχει ιδιότητες (όνομα, ζωή, θέση) και συμπεριφορά (τρέχει, πηδά, επιτίθεται). Αντί να σκέφτεσαι «ποια βήματα εκτελούνται», σκέφτεσαι «ποια αντικείμενα υπάρχουν και τι κάνουν» — έτσι σχεδιάζονται σχεδόν όλα τα σύγχρονα προγράμματα.
Η ενότητα είναι θεωρία με ορισμούς και διαγράμματα κλάσεων — κλασική ύλη για το Θέμα Α και Β.
Ένας φυσικός τρόπος επίλυσης προβλημάτων
Στον αντικειμενοστραφή προγραμματισμό ένα πρόβλημα περιγράφεται ως ένα σύνολο αντικειμένων που αλληλεπιδρούν μεταξύ τους, όπως συμβαίνει και στον πραγματικό κόσμο.
Κάθε αντικείμενο έχει:
- ιδιότητες (χαρακτηριστικά, δεδομένα) — π.χ. ένα αυτοκίνητο έχει χρώμα, μάρκα, ταχύτητα·
- συμπεριφορά (μεθόδους, λειτουργίες) — π.χ. επιταχύνει, φρενάρει.
Τα αντικείμενα επικοινωνούν στέλνοντας μηνύματα το ένα στο άλλο: ένα μήνυμα ζητά από ένα αντικείμενο να εκτελέσει μια μέθοδό του (π.χ. ο οδηγός «στέλνει» στο αυτοκίνητο το μήνυμα «φρενάρισε»).
Σε αντίθεση με τον διαδικαστικό προγραμματισμό, όπου δεδομένα και ενέργειες είναι χωριστά, εδώ τα δεδομένα και οι λειτουργίες που τα επεξεργάζονται είναι μαζί, μέσα στο αντικείμενο.
Χτίζοντας αντικειμενοστραφή προγράμματα
Μεθοδολογία:
- Εντοπισμός των αντικειμένων του προβλήματος (συνήθως τα ουσιαστικά της περιγραφής).
- Καθορισμός των ιδιοτήτων κάθε αντικειμένου.
- Καθορισμός της συμπεριφοράς (μεθόδων) κάθε αντικειμένου (συνήθως τα ρήματα της περιγραφής).
- Καθορισμός των σχέσεων και της αλληλεπίδρασης μεταξύ των αντικειμένων.
Διαγραμματική αναπαράσταση: κάθε κλάση σχεδιάζεται ως ορθογώνιο με τρία τμήματα, από πάνω προς τα κάτω: το όνομα της κλάσης, τις ιδιότητες και τις μεθόδους.
Παράδειγμα 1: «Ο βιβλιοθηκονόμος δανείζει βιβλία στα μέλη. Κάθε βιβλίο έχει τίτλο, συγγραφέα και διαθεσιμότητα. Κάθε μέλος έχει όνομα και αριθμό μητρώου και μπορεί να δανειστεί ή να επιστρέψει βιβλίο.» Εντόπισε αντικείμενα, ιδιότητες και μεθόδους.
Λύση: Διάγραμμα κλάσεων (όνομα · ιδιότητες · μέθοδοι):
- Βιβλίο · τίτλος, συγγραφέας, διαθέσιμο · δανεισμός(), επιστροφή()
- Μέλος · όνομα, αριθμός_μητρώου · δανείσου(βιβλίο), επίστρεψε(βιβλίο)
- Βιβλιοθηκονόμος · όνομα · καταχώρισε_δανεισμό(μέλος, βιβλίο)
Αλληλεπίδραση: όταν ένα μέλος δανείζεται, στέλνει στο αντικείμενο Βιβλίο το μήνυμα δανεισμός(), που αλλάζει την ιδιότητα διαθέσιμο σε ψευδές.
Κλάσεις: αφαιρετικότητα και ενθυλάκωση
Αντικείμενα με κοινές ιδιότητες και συμπεριφορά ομαδοποιούνται σε κλάσεις. Η κλάση είναι το πρότυπο (καλούπι) που περιγράφει ποιες ιδιότητες και μεθόδους έχουν τα αντικείμενά της· κάθε αντικείμενο είναι ένα στιγμιότυπο της κλάσης με τις δικές του τιμές. Η κλάση Μαθητής είναι μία· τα αντικείμενα «Ελένη», «Γιώργος», «Σοφία» είναι πολλά.
- Αφαιρετικότητα (abstraction): κρατάμε μόνο τα χαρακτηριστικά που είναι σημαντικά για το πρόβλημα και αγνοούμε τα υπόλοιπα. Για ένα σύστημα βαθμολογίας, ο Μαθητής έχει βαθμούς — όχι χρώμα ματιών.
- Ενθυλάκωση (encapsulation): οι ιδιότητες και οι μέθοδοι «κλείνονται» μαζί στο αντικείμενο και τα εσωτερικά του δεδομένα κρύβονται από τον έξω κόσμο· η πρόσβαση γίνεται μόνο μέσω των μεθόδων του. Έτσι κανείς δεν μπορεί, π.χ., να γράψει βαθμό 25 παρακάμπτοντας τον έλεγχο της μεθόδου ορισμός_βαθμού().
Η κλάση Λογαριασμός επιτρέπει αλλαγή του υπολοίπου μόνο μέσω των μεθόδων κατάθεση() και ανάληψη(), που ελέγχουν αν το ποσό είναι έγκυρο. Ποια αρχή εφαρμόζεται;
Η αντικειμενοστραφής «οικογένεια»: κληρονομικότητα
Μια κλάση μπορεί να οριστεί ως απόγονος (υποκλάση) μιας άλλης, του προγόνου (υπερκλάσης). Ο απόγονος κληρονομεί όλες τις ιδιότητες και μεθόδους του προγόνου και μπορεί να προσθέσει δικές του ή να τροποποιήσει κληρονομημένες.
Παράδειγμα: η κλάση Όχημα (ιδιότητες: αριθμός_κυκλοφορίας, ταχύτητα · μέθοδοι: επιτάχυνε(), φρενάρισε()) έχει απογόνους Αυτοκίνητο (+ αριθμός_θέσεων) και Φορτηγό (+ μέγιστο_φορτίο, φόρτωσε()). Το Φορτηγό έχει ταχύτητα και επιταχύνει χωρίς να το ξαναγράψουμε.
Η κληρονομικότητα οδηγεί σε επαναχρησιμοποίηση κώδικα και σε ιεραρχίες κλάσεων που θυμίζουν δένδρο.
Πολυμορφισμός
Πολυμορφισμός είναι η δυνατότητα η ίδια μέθοδος (με το ίδιο όνομα) να έχει διαφορετική συμπεριφορά σε διαφορετικές κλάσεις. Η κλάση Σχήμα έχει μέθοδο εμβαδόν()· ο απόγονος Κύκλος την υλοποιεί ως , ο απόγονος Ορθογώνιο ως . Όποιο σχήμα κι αν έχουμε, του στέλνουμε το ίδιο μήνυμα, «εμβαδόν()», και κάθε αντικείμενο αντιδρά με τον δικό του τρόπο.
Η κλάση Ζώο έχει μέθοδο ήχος(). Ο Σκύλος την υλοποιεί «γαβ» και η Γάτα «νιάου». Ποια έννοια περιγράφεται;
Μέθοδος: άσκηση αντικειμενοστραφούς σχεδίασης
- Υπογράμμισε τα ουσιαστικά της εκφώνησης → υποψήφιες κλάσεις και ιδιότητες.
- Υπογράμμισε τα ρήματα → υποψήφιες μέθοδοι.
- Ό,τι είναι απλή τιμή (αριθμός, όνομα) γίνεται ιδιότητα· ό,τι έχει δικά του χαρακτηριστικά και συμπεριφορά γίνεται κλάση.
- Βρες κοινά χαρακτηριστικά → πρόγονος με απογόνους (κληρονομικότητα).
- Βρες μεθόδους με ίδιο όνομα αλλά διαφορετική υλοποίηση → πολυμορφισμός.
- Σχεδίασε κάθε κλάση ως ορθογώνιο: όνομα / ιδιότητες / μέθοδοι.
Θέμα τύπου Πανελλαδικών: Ένα σχολείο θέλει εφαρμογή για το προσωπικό του. Όλα τα πρόσωπα έχουν ονοματεπώνυμο και τηλέφωνο και μπορούν να αλλάξουν τηλέφωνο. Οι καθηγητές έχουν επιπλέον ειδικότητα και ώρες διδασκαλίας· οι μαθητές τάξη και απουσίες και μπορούν να καταχωρίσουν απουσία. Κάθε πρόσωπο μπορεί να εμφανίσει μια κάρτα στοιχείων, που για τον καθηγητή περιέχει την ειδικότητα και για τον μαθητή την τάξη. Να σχεδιαστούν οι κλάσεις και να εντοπιστούν κληρονομικότητα και πολυμορφισμός.
Λύση:
- Πρόσωπο (πρόγονος) · ονοματεπώνυμο, τηλέφωνο · αλλαγή_τηλεφώνου(), εμφάνιση_κάρτας()
- Καθηγητής (απόγονος) · + ειδικότητα, ώρες · εμφάνιση_κάρτας() με ειδικότητα
- Μαθητής (απόγονος) · + τάξη, απουσίες · καταχώριση_απουσίας(), εμφάνιση_κάρτας() με τάξη
Κληρονομικότητα: Καθηγητής και Μαθητής κληρονομούν ονοματεπώνυμο, τηλέφωνο και αλλαγή_τηλεφώνου() από το Πρόσωπο. Πολυμορφισμός: η εμφάνιση_κάρτας() έχει το ίδιο όνομα αλλά διαφορετική υλοποίηση σε κάθε απόγονο.
Ποια πρόταση για τη σχέση κλάσης και αντικειμένου είναι σωστή;
Παράδειγμα 2: Να χαρακτηρίσετε ως Σωστή ή Λάθος κάθε πρόταση.
- Μια κλάση μπορεί να έχει πολλά αντικείμενα.
- Ο απόγονος κληρονομεί τις ιδιότητες αλλά όχι τις μεθόδους του προγόνου.
- Η ενθυλάκωση κρύβει τα δεδομένα του αντικειμένου από τον έξω κόσμο.
- Πολυμορφισμός σημαίνει ότι μια κλάση έχει πολλούς προγόνους.
- Τα αντικείμενα επικοινωνούν μεταξύ τους με μηνύματα.
Λύση: 1. Σωστό · 2. Λάθος (κληρονομεί και ιδιότητες και μεθόδους) · 3. Σωστό · 4. Λάθος (πολυμορφισμός είναι η ίδια μέθοδος με διαφορετική συμπεριφορά σε διαφορετικές κλάσεις) · 5. Σωστό.
Η πρώτη αντικειμενοστραφής γλώσσα, η Simula 67, δημιουργήθηκε στη Νορβηγία από τους Ole-Johan Dahl και Kristen Nygaard για προσομοιώσεις — εκεί εμφανίστηκαν για πρώτη φορά οι κλάσεις και η κληρονομικότητα. Για αυτή τη δουλειά τιμήθηκαν το 2001 με το βραβείο Turing, το «Νόμπελ της Πληροφορικής».
Οι τέσσερις έννοιες με ένα κινητό: αφαιρετικότητα — στην εφαρμογή επαφών σε νοιάζει το τηλέφωνο, όχι το βάρος της συσκευής· ενθυλάκωση — πατάς κουμπιά, δεν αγγίζεις τα κυκλώματα· κληρονομικότητα — κάθε νέο μοντέλο κάνει ό,τι το προηγούμενο και κάτι παραπάνω· πολυμορφισμός — το «άνοιξε» σε μια φωτογραφία, ένα τραγούδι ή ένα PDF κάνει κάτι διαφορετικό.
Ένας συμμαθητής σου σχεδιάζει: κλάση Αυτοκίνητο με ιδιότητα «τροχός_1, τροχός_2, τροχός_3, τροχός_4», και κλάση Τροχός ως απόγονο του Αυτοκινήτου, «αφού ο τροχός ανήκει στο αυτοκίνητο». Τι είναι λάθος;
Δοκίμασε πρώτα μόνος σου — μετά δες τη λύση
Η κληρονομικότητα εκφράζει σχέση «είναι» (το Φορτηγό είναι Όχημα), όχι σχέση «έχει». Ο τροχός δεν είναι αυτοκίνητο — δεν έχει αριθμό θέσεων ούτε «επιταχύνει» — άρα δεν μπορεί να κληρονομεί από αυτό. Το σωστό: ο Τροχός είναι χωριστή κλάση (ιδιότητες: διάσταση, πίεση · μέθοδος: φούσκωσε()) και το Αυτοκίνητο έχει αντικείμενα Τροχός ως ιδιότητες. Ένα απλό τεστ: αν η φράση «ο Χ είναι ένα είδος Υ» ακούγεται παράλογη, δεν υπάρχει κληρονομικότητα.
- Σύγχυση ενθυλάκωσης (απόκρυψη δεδομένων, πρόσβαση μέσω μεθόδων) με αφαιρετικότητα (επιλογή σημαντικών χαρακτηριστικών).
- Κληρονομικότητα για σχέσεις «έχει» αντί για «είναι».
- Σύγχυση κλάσης (πρότυπο) με αντικείμενο (στιγμιότυπο).
- Στο διάγραμμα κλάσης, λάθος σειρά τμημάτων: πρώτα όνομα, μετά ιδιότητες, τέλος μέθοδοι.
- Αντικείμενο: ιδιότητες + συμπεριφορά (μέθοδοι)· τα αντικείμενα επικοινωνούν με μηνύματα.
- Μεθοδολογία: αντικείμενα → ιδιότητες → μέθοδοι → σχέσεις· διάγραμμα όνομα / ιδιότητες / μέθοδοι.
- Κλάση = πρότυπο, αντικείμενο = στιγμιότυπο.
- Αφαιρετικότητα: μόνο τα σημαντικά χαρακτηριστικά· ενθυλάκωση: απόκρυψη δεδομένων, πρόσβαση μέσω μεθόδων.
- Κληρονομικότητα: ο απόγονος «είναι» πρόγονος και κληρονομεί· πολυμορφισμός: ίδια μέθοδος, διαφορετική συμπεριφορά.