Τεχνολογία Λογισµικού II Εισαγωγή στον Αντικειµενοστρεφή Προγραµµατισµό Πάνος Βασιλειάδης pvassil@dbnet.ece.ntua.gr Σεπτέµβρης 2001
Θεµατολόγιο Πληροφορίες σχετικά µε το µάθηµα Εισαγωγή στον αντικειµενοστρεφή προγραµµατισµό 2
Σχετικά µε το µάθηµα Αντικείµενο Βαθµολογία Web: http://www.dbnet.ece.ntua.gr/~pvassil/tuc/log201/ 3
Βιβλιογραφία B. Eckel, Thinking in C++. F.B. Brokken, C++ Annotations Version 5.1.0a S. Qualline, Practical C++ Programming, O Reilly. Stroustrup, Ηγλώσσα προγραµµατισµού C++. 4
Οι γλώσσες προγραµµατισµού λύνουν προβλήµατα Λάθος!!! Πρόβληµα: Βγάλε τιµολόγιο στον κ. Χ που αγόρασε τα αντικείµενα Υ και Ζ Λύση: Ο υπάλληλος χτυπάει 3 κουµπιά σε µια µηχανή και βγαίνει το τιµολόγιο Πρόβληµα: Βγάλε τιµολόγιο στον τυχαίο πελάτη που αγόρασε το τυχαίο τιµολόγιο Λύση: Ολογιστήςσκέφτεταιµια διαδικασία έκδοσης τιµολογίου και ο προγραµµατιστής την απεικονίζει σε ένα πρόγραµµα στον υπολογιστή. 5
Λύσεις στον πραγµατικό κόσµο? Οι γλώσσες προγραµµατισµού είναι απεικονίσεις πραγµατικών λύσεων στον υπολογιστή, και όχι λύσεις αυτές καθεαυτές. Πριν προγραµµατίσουµε µια λύση στον υπολογιστή, πρέπει να έχουµε στο µυαλό µας τη λύση στον πραγµατικό κόσµο! 6
Οι γλώσσες είναι αφαιρετικά µέσα και όχι λύσεις... 7
Oι γλώσσες προγραµµατισµού είναι αφαιρέσεις Assembly: αφαίρεση σε σχέση µετηγλώσσα µηχανής. C, Basic, Fortran: αφαίρεση σε σχέση µετην Assembly. Καιπούείναιηαφαίρεσησεσχέσηµετηλύση των πραγµατικών προβληµάτων? 8
Αντικειµενοστρεφής Προγραµµατισµός Αντικειµενοστρεφής Προγραµµατισµός: Απεικόνιση των αντικειµένων του προβλήµατος σε αντικείµενα του προγράµµατος Προσοχή!!! αντικειµενοστρεφής και όχι αντικειµενοστραφής 9
Καιπούείναιηαφαίρεσησεσχέσηµε τον υπολογιστή? Κάθε αντικείµενο είναι ένας µικρός «υπολογιστής»: έχει µια κατάσταση (µεταβλητές, δηλ., που την χαρακτηρίζουν) και λειτουργίες (που παίρνουν το αντικείµενο από µια αρχική κατάσταση, το τροποποιούν, και καταλήγουν σε µια νέα κατάσταση), τις οποίες και θα αποκαλούµε µεθόδους. 10
Παράδειγµα my L a mp -id : int = 1 -status : int = 1 +getstatus() : int +on() : void +off() : void Όπως βλέπουµε στο παράδειγµα, το αντικείµενο my_lamp έχει τιµές µεταβλητών που εκφράζουν την κατάστασή του λειτουργίες που επηρρεάζουν την κατάσταση αυτή 11
Κλάσεις αντικειµένων Ενδιαφέρουσα παρατήρηση: όλες οι λάµπες που µας ενδιαφέρει να κατασκευάσουµεέχουντιςίδιες µεταβλητές κατάστασης και λειτουργίες. Κλάση είναι µια οµάδα από αντικείµενα µε παρόµοια σηµασιολογία, δοµή και λειτουργίες. Κάθε αντικείµενο είναι µοναδικό, αλλά ταυτόχρονα ανήκει και σε µια κλάση (οµοειδών) αντικειµένων. Λέµε ότι το αντικείµενο είναι στιγµιότυπο της εν λόγω κλάσης. 12
Αποστολή Μηνύµατος Πώς ζητάω, όµως, από ένα αντικείµενο να αλλάξει κατάσταση? Του ζητώ να εκτελέσει µια από τις λειτουργίες του («τρέχω µια συνάρτησή του» στην ορολογία του διαδικαστικού προγραµµατισµού). Λέµεότι πρόκειται για την αποστολή µηνύµατος στο αντικείµενο αυτό. Παράδειγµα: mylamp.on(); 13
ιαπροσωπεία κλάσης Τι µπορώ να ζητήσω από ένα αντικείµενο? Μπορώ να ζητήσω µόνο ότι λειτουργία είναι δηλωµένη. Το σύνολο των λειτουργιών που µπορώ να χρησιµοποιήσω για να επικοινωνήσω µε έναστιγµιότυπο µιας κλάσης ονοµάζεται διαπροσωπεία της κλάσης. Παράδειγµα: on() off() getstatus() 14
[Αφηρηµένοι] Τύποι εδοµένων Μια κλάση είναι και αυτή ένας τύπος δεδοµένων. Έχει εσωτερική κατάσταση και λειτουργίες όπως και ένας ακέραιος (ο οποίος έχει και αυτός µια κατάσταση, την αναπαράστασή του σε bytes και λειτουργίες (όπως πρόσθεση, ολίσθηση, κλπ). Η διαφορά είναι ότι οι κλάσεις βρίσκονται ένα επίπεδο πιο ψηλά από τους κλασικούς τύπους δεδοµένων σε ότι αφορά τη σηµασιολογία τους. Έτσι, τις κλάσεις τις ονοµάζουµεκαιαφηρηµένους τύπους δεδοµένων. 15
Σύνθεση αντικειµένων Σύνθεση Αντικειµένων: σχέση «ΕΧΕΙ» (HAS-A) και «ΕΙΝΑΙ ΜΕΡΟΣ» (PART-OF) µεταξύ των αντικειµένων. Room Co u r s e Bu i l d i n g 16
Απόκρυψη εδοµένων Σε ένα σύνθετο αντικείµενο, δε µας ενδιαφέρει η πλήρης γνώση των λεπτοµερειών του κάθε συστατικού. Αντιθέτως, µας ενδιαφέρει ένα υποσύνολο των λειτουργιών που είναι χρήσιµο για τους σκοπούς της σύνθεσης. 17
Απόκρυψη δεδοµένων ηλώνουµε ως... ηµόσια (public) δεδοµένα/λειτουργίες: αυτά που µπορούν να χρησιµοποιηθούν (κληθούν/ προσπελαστούν) από τα άλλα αντικείµενα. Ιδιωτικά (private) δεδοµένα/λειτουργίες: αυτά που χρησιµοποιούνται µόνο από το ίδιο το αντικείµενο. 18
Απόκρυψη εδοµένων Παράδειγµα... La mp - i d : i n t - s t a t u s : i n t +get St at us() : i nt + o n ( ) : v o i d + o f f ( ) : v o i d Private members Public members 19
Κληρονοµικότητα Επαναχρησιµοποίηση δεδοµένων και λειτουργιών. Κλάση Βάσης (ή βασική κλάση) είναι η κλάση από την οποία κληρονοµούνται τα χαρακτηριστικά Εξαγόµενη κλάση είναι η κλάση που κληρονοµεί την κλάση βάσης. 20
Κληρονοµικότητα S h a p e + d r a w ( ) : v o i d + m o v e ( ) : v o i d C i r c l e S q u a r e T r i a n g l e 21
Κληρονοµικότητα Οποιοδήποτε στιγµιότυπο της εξαγόµενης κλάσης µπορεί να χρησιµοποιηθεί σα στιγµιότυπο της βασικής κλάσης. Έτσι, µπορούµε να στείλουµε όλα τα µηνύµατα που θα έπαιρνε η βασική κλάση, στην εξαγόµενη κλάση. Ο κώδικας για τα µηνύµατα αυτά Επαναχρησιµοποιείται ως έχει, αν δε χρειάζονται αλλαγές Τροποποιείται στην εξαγόµενη κλάση, αν χρειάζεται Υπερκέραση λειτουργιών 22
Κληρονοµικότητα - Παράδειγµα Shape +dr aw( ) : voi d +move( ) : voi d Ci rcl e Square Tr i a ng l e +dr aw( ) : voi d +dr aw( ) : voi d +draw() : void +flip() : void 23
Κληρονοµικότητα Σχέση «ΕΙΝΑΙ» (IS-A) µεταξύ εξαγόµενης και βασικής κλάσης Το καλύτερο τεστ για το αν πρέπει να χρησιµοποιήσουµε σχέση «ΕΙΝΑΙ», είναι να σκεφτούµε αν στον πραγµατικό κόσµο, ένα στιγµιότυπο της εξαγόµενης κλάσης είναι όντως και στιγµιότυπο της βασικής. 24
Πολυµορφισµός Shape +dr aw( ) : voi d +move( ) : voi d Έστω ότι κάθε σχήµα ζωγραφίζεται διαφορετικά... Ci rcl e Square Tr i a ng l e +dr aw( ) : voi d +dr aw( ) : voi d +draw() : void +flip() : void 25
Πολυµορφισµός Circle mycircle; Square mysquare; Triangle mytriangle;... randommove(mycircle); randommove(mysquare); randommove(mytriangle);... void randommove(shape &myshape){ myshape.move(); myshape.draw();... } Κάθε σχηµατάκι θα ζωγραφιστεί µε βάση τη δική του µέθοδο 26
Πολυµορφισµός Πολυµορφισµός είναι η δυνατότητα να µπορώ να δηλώσω ένα αντικείµενο της βασικής κλάσης στον κώδικα και στο runtime να αποφασίζεται ποια µέθοδος της εξαγόµενης κλάσης θα τρέξει για αυτό. Απαραίτητη προϋπόθεση για αυτό είναι να δηλωθεί η µέθοδος της βασικής κλάσης ως virtual. Τότε, για ένα όνοµα µεθόδου, εξετάζεται πρώτα αν υπάρχει στην εξαγόµενη κλάση, και µόνο αν δεν υπάρχει εκτελείται η µέθοδος της βασικής κλάσης. 27
Τα πάντα είναι θέµα στυλ... Ονόµατα µεταβλητών και µεθόδων: ξεκινούν µε µικρό, συγχωνεύουν τις επιµέρους λέξεις. Π.χ. mycompositevariable. Μπορείτε επίσης να χρησιµοποιείτε και _ γιαναενώσετετιςεπίµέρους λέξεις του ονόµατος της µεταβλητής, π.χ. my_composite_variable Ονόµατα κλάσεων: ξεκινούν µε κεφαλαίο γράµµα. Π.χ. MyClassDefinition Σταθερές όπως ορίζονται µε δηλώσειςτύπουconst ή #define γράφονται µε όλαταγράµµατα κεφαλαία. Π.χ. MY_CONSTANT_VALUE Ηβασικότερησυµβουλή είναι πάντως, όποιο συµβολισµό κι αν ακολουθήσετε, να το κάνετε µε συνέπεια παντού, χωρίς να αλλάζετε στυλ. 28
Τα πάντα είναι θέµα σχολίων... /* *************************************************** * Program: simple program that prints a simple message * * Author: Nicko McBrain * * Purpose: As an example of a commented program * * Usage: No parameters required! * * Created: 1 Jan 2001 * * Modified: 2 Jan 2001: wrote the code * * 3 Jan 2001: wrote the comments * * File: hello.cpp * ***************************************************** */ #include <iostream.h> main(){ //This is a simple, single line comment cout << "Hello world\n"; } 29
Όποιος βιάζεται, σκοντάφτει! Να είστε απλοί και σαφείς!!! Keep It Simple Stupid (KISS)!!! Γράψτε το πρόγραµµα ώστε να το καταλαβαίνει και ο πιο απλοϊκός, µη-σχετικός, µηπρογραµµατιστής! ώστε ονόµατα στις µεταβλητές µε βάσητονρόλοτους(και όχι µε βάση το πόσο γρήγορα πληκτρολογούνται)! Think Small!!! Γράψτε µικρές µεθόδους, µικρές if εντολές, µικρές κλάσεις! Να θυµάστε ότι ένα κοµµάτι κώδικα, είναι τόσο πιο απλό, όσο πιο µικρό το σκεφτείτε! Στοιχίστε σωστά το κείµενο! Πρώτα το στοιχίζουµε καιµετά το γράφουµε... Η αξία του προγραµµατιστή είναι ο κώδικάς του να είναι επαναχρησιµοποιήσιµος (ήτοι απλός) και συντηρήσιµος (ήτοι αναγνώσιµος)!!! 30
Συνοψίζοντας... Ένα αντικείµενο αποτελείται από δεδοµένα, λογική και τη διαπροσωπεία που τα ενθυλακώνει και που καθορίζει τη συµπεριφορά του αντικειµένου. Τα αντικείµενα επικοινωνούν µε µηνύµατα. Μια µέθοδος είναι η υλοποίηση ενός µηνύµατος Αντικείµενα οµοειδή ανήκουν στην ίδια κλάση Ο µόνος τρόπος για να υπάρξει επικοινωνία µε ένα αντικείµενο είναι µέσω της διαπροσωπείας του. ύο αντικείµενα µπορεί να υλοποιούν το ίδιο µήνυµα µέσω διαφορετικών µεθόδων. Τα αντικείµενα οργανώνονται σε ιεραρχίες κληρονοµικότητας 31