Προγραμματισμός ΙΙ Ενότητα 3: Εισαγωγή στις κλάσεις, στα μέλη δεδομένων και στις μεθόδους - Μέρος 1 Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο TEI Δυτικής Μακεδονίας και στην Ανώτατη Εκκλησιαστική Ακαδημία Θεσσαλονίκης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Εισαγωγή στις κλάσεις, στα μέλη δεδομένων και στις μεθόδους - Μέρος 1
Σκοποί ενότητας Σκοπός της ενότητας είναι η εισαγωγή στις κλάσεις, στα μέλη δεδομένων και στις μεθόδους. 5
Περιεχόμενα ενότητας Εισαγωγή. Ενθυλάκωση. Κληρονομικότητα. Πολυμορφισμός. Βιβλιογραφία. 6
Εισαγωγή (1/9) Σε αντίθεση με το δομημένο προγραμματισμό (structured programming) όπου το μοντέλο προγραμματισμού βασίζεται σε δομές και συναρτήσεις που λειτουργούν σε αυτές, το αντικειμενοστρεφές μοντέλο (object-oriented model) βασίζεται στην ιδέα του αντικειμένου. Ένα αντικείμενο έχει ιδιότητες (properties/attributes ή data members) και μεθόδους (methods ή member functions) που χειρίζονται αυτές τις ιδιότητες. 7
Εισαγωγή (2/9) Θεμελιώδης όρος του αντικειμενοστρεφούς προγραμματισμού είναι αυτός της κλάσης (class), ή τάξης (όπως εμφανίζεται σε μερικά ελληνικά εγχειρίδια). Ένας τρόπος να εξηγηθεί ο όρος «κλάση» είναι εάν λάβουμε υπ όψιν ένα σύνολο από αντικείμενα που ανήκουν στην ίδια κατηγορία και αντιστοιχίσουμε την κατηγορία αυτών των αντικειμένων με μια κλάση. 8
Εισαγωγή (3/9) Ένα παράδειγμα κλάσης θα μπορούσε να είναι η κατηγορία των «επιβατικών αυτοκινήτων». Αντικείμενα (ή «στιγμιότυπα») αυτής της κλάσης θα ήταν τα διάφορα μοντέλα αυτοκινήτων των διαφόρων κατασκευαστών που κυκλοφορούν στο δρόμο. Συνεπώς, στο παραπάνω παράδειγμα, ο όρος κλάση αναφέρεται στην έννοια του επιβατικού αυτοκινήτου και ο όρος στιγμιότυπο σε ένα συγκεκριμένο υπαρκτό αντικείμενο. 9
Εισαγωγή (4/9) Ιδιότητες της κλάσης του παραδείγματος θα ήταν τα κοινά χαρακτηριστικά όλων των επιβατικών αυτοκινήτων, όπως ο κυβισμός, αριθμός κυλίνδρων, αριθμός θέσεων, όνομα κατασκευαστή, μοντέλο κατασκευαστή, αριθμός κυκλοφορίας, κα. Τα στιγμιότυπα της κλάσης του παραδείγματος είναι τα διάφορα αυτοκίνητα που κυκλοφορούν στο δρόμο, όπου είναι απολύτως πιθανό να υπάρχουν δύο ή και παραπάνω ολόιδια αυτοκίνητα σε κυκλοφορία (και συνεπώς να έχουν τις ίδιες ιδιότητες) αλλά να διαφέρουν σε ένα κύριο χαρακτηριστικό (π.χ. τον αριθμό κυκλοφορίας). 10
Εισαγωγή (5/9) Σε θεωρητικό επίπεδο τα στιγμιότυπα μιας κλάσης διαφέρουν μεταξύ τους κατ ελάχιστο στη διεύθυνση μνήμης στην οποία υπάρχουν. Όλες οι υπόλοιπες ιδιότητές τους μπορούν να είναι οι ίδιες. Η ιδιότητα αυτή της διεύθυνσης μνήμης δίνεται από το μεταγλωττιστή ή το διαχειριστή μνήμης, ανάλογα εάν η δήλωση του στιγμιότυπου γίνεται στατικά (στη στοίβα) ή δυναμικά (στο σωρό). 11
Εισαγωγή (6/9) Δηλαδή, ένα στιγμιότυπο έχει: Κατάσταση. Στατικές ιδιότητες και τρέχουσες δυναμικές τιμές για κάθε ιδιότητα. Συμπεριφορά. Συμπεριφορά ενός στιγμιότυπου στην αλλαγή κατάστασης (ιδιοτήτων). Ταυτότητα. Ιδιότητα με βάση την οποία ένα στιγμιότυπο ξεχωρίζει από τα άλλα στιγμιότυπα. 12
Εισαγωγή (7/9) Συνοψίζοντας, «αντικειμενοστρεφής προγραμματισμός» είναι μια μέθοδος υλοποίησης όπου τα προγράμματα είναι οργανωμένα ως συνεργαζόμενες συλλογές στιγμιοτύπων, καθένα από τα οποία αναπαριστά ένα στιγμιότυπο κάποιας κλάσης, οι οποίες κλάσεις είναι όλες μέλη μιας ιεραρχίας κλάσεων που ενώνονται με σχέσεις κληρονομικότητας. 13
Εισαγωγή (8/9) Για να θεωρηθεί ένα πρόγραμμα ότι είναι αντικειμενοστρεφές, είναι απαραίτητο να: a. Το βασικό δομικό στοιχείο του είναι το αντικείμενο/στιγμιότυπο και όχι ο αλγόριθμος. b. Κάθε αντικείμενο αποτελεί στιγμιότυπο μιας κλάσης. c. Οι κλάσεις σχετίζονται μεταξύ τους με σχέσεις κληρονομικότητας. 14
Εισαγωγή (9/9) Συγκεκριμένα, προγραμματισμός χωρίς κληρονομικότητα είναι καθαρά μη αντικειμενοστρεφής προγραμματισμός, και καλείται προγραμματισμός με αφηρημένους τύπους δεδομένων. Μια γλώσσα για να θεωρηθεί «αντικειμενοστρεφής», πρέπει να πληροί κάποιες κύριες προϋποθέσεις: Ενθυλάκωση (Encapsulation). Κληρονομικότητα (Inheritance). Πολυμορφισμός (Polymorphism). 15
Ενθυλάκωση (1/3) Στη συντριπτική πλειοψηφία των κλάσεων τα μέλη μιας κλάσης (είτε ιδιότητες είτε μέθοδοι) μπορεί να χρειάζεται να προστατευτούν από μη αποδεκτούς τρόπους πρόσβασης. Ως παράδειγμα μπορεί να αναφερθεί η περίπτωση όπου στη C έχετε ορίσει ένα τύπο δεδομένων για «πελάτη». 16
Ενθυλάκωση (2/3) Ο συγκεκριμένος τύπος δεδομένων μπορεί να έχει διάφορα πεδία (ιδιότητες στην ορολογία του αντικειμενοστρεφούς προγραμματισμού) που ο χρήστης αυτού του τύπου δεδομένων (εσείς πάλι ή κάποιος άλλος προγραμματιστής) μπορεί να μεταβάλει. Σε πολλούς τύπους δεδομένων, πλην των πιο απλών, υπάρχουν περιπτώσεις όπου η αλλαγή μιας ιδιότητας πρέπει να συνδυαστεί με αλλαγή και άλλων ιδιοτήτων που εξαρτώνται από αυτή, είτε άμεσα είτε έμμεσα (π.χ. με κάποιον υπολογισμό). 17
Ενθυλάκωση (3/3) Φυσικά μπορεί να συμβαίνει και το αντίστροφο, όπου κάποιο πεδίο δε θα πρέπει να αλλαχτεί γιατί υπολογίζεται με βάση την τιμή κάποιου άλλου. Ο μηχανισμός στον οποίο βασίζεται μια αντικειμενοστρεφής γλώσσα προγραμματισμού για να προσφέρει προστασία από μη αποδεκτούς τρόπους πρόσβασης στα μέλη μιας κλάσης είναι η ενθυλάκωση. Συνεπώς ο όρος «ενθυλάκωση» αναφέρεται στη συμπερίληψη των ιδιοτήτων μιας κλάσης και των μεθόδων της για το χειρισμό αυτών των ιδιοτήτων. 18
Κληρονομικότητα (1/6) Σε μια αντικειμενοστρεφή γλώσσα προγραμματισμού: Είναι δυνατόν να δημιουργηθεί μια ιεραρχία κλάσεων. Όπου η αρχική κλάση έχει ιδιότητες ή και μεθόδους που μπορούν καθ ολοκληρίαν ή εν μέρη να κληρονομηθούν σε υποκλάσεις ή παράγωγες κλάσεις (subclasses ή derived classes). Οι οποίες διαφέρουν από τη βασική/γονική/πρόγονη κλάση (base class ή parent class ή ancestor class) λόγω του ότι «εξειδικεύουν» περισσότερο την ιδέα της βασικής κλάσης. 19
Κληρονομικότητα (2/6) Ως παράδειγμα μιας βασικής κλάσης μπορεί να είναι το «γεωμετρικό σχήμα». Αυτή η κλάση μπορεί να έχει δύο βασικές ιδιότητες: «εμβαδόν σχήματος» και «περίμετρο σχήματος». Επίσης, δύο βασικές μέθοδοι της βασικής κλάσης μπορεί να είναι οι «υπολόγισε εμβαδόν» και «υπολόγισε περίμετρο». Παράγωγες κλάσεις (ή υποκλάσεις) μπορεί να είναι οι «τετράγωνο», «τρίγωνο» και «κύκλος». 20
Κληρονομικότητα (3/6) Το εμβαδόν και η περίμετρος και των τριών αυτών γεωμετρικών αντικειμένων ορίζεται, αλλά με διαφορετικό τρόπο σε καθένα από αυτούς. Επίσης το καθένα από τα παραπάνω σχήματα έχει και διαφορετικές ιδιότητες: την «ακμή» για το τετράγωνο, τις «κορυφές» για το τρίγωνο και τα «κέντρο» και «ακτίνα» για τον κύκλο. Οι ιδιότητες της βασικής κλάσης μπορούν να κληρονομηθούν στις υποκλάσεις, αλλά ο υπολογισμός όχι, διότι εξαρτάται από το κάθε ένα σχήμα. 21
Κληρονομικότητα (4/6) Συνεπώς ο υπολογισμός του εμβαδού και της περιμέτρου θα είναι στην ευθύνη των υποκλάσεων, αλλά ο ορισμός των συγκεκριμένων ιδιοτήτων στη βασική κλάση. Επίσης, οι τρεις υποκλάσεις θα πρέπει να ορίσουν και τις επιμέρους ιδιότητες των γεωμετρικών αντικειμένων, όπως περιγράψαμε πιο πάνω. 22
Κληρονομικότητα (5/6) Ορίζοντας στιγμιότυπα των παράγωγων κλάσεων και ζητώντας τον υπολογισμό του εμβαδού ή της περιμέτρου αυτών: Θα έχει ως αποτέλεσμα ο μεταγλωττιστής να παράγει κώδικα που θα καλεί την κατάλληλη μέθοδο για τον υπολογισμό του εμβαδού ή της περιμέτρου. Ανάλογα με ποιανού στιγμιότυπου τη μέθοδο καλούμε. 23
Κληρονομικότητα (6/6) Η βασική ιδέα της κληρονομικότητας είναι η ελαχιστοποίηση του κώδικα που πρέπει να γραφεί ώστε να λυθεί ένα πρόβλημα. Κοινές ιδιότητες και μέθοδοι «μεταφέρονται» στις ανώτερες ιεραρχικά κλάσεις και οι εξειδικεύσεις στις κατώτερες. 24
Πολυμορφισμός (1/3) Σχεδιάζοντας μια ιεραρχία κλάσεων, πολλές φορές προκύπτει η περίπτωση όπου μια ανώτερη κλάση και μια κατώτερη χρειάζεται να έχουν μια μέθοδο που κατά βάση εκτελεί την ίδια λειτουργία, αλλά η υλοποίησή της εξαρτάται από την κλάση της οποίας η μέθοδος καλείται. Είναι δυνατόν και οι δύο κλάσεις να περιέχουν μια μέθοδο με το ίδιο όνομα και στις δύο περιπτώσεις, αλλά με διαφορετική υλοποίηση. 25
Πολυμορφισμός (2/3) Είναι, επίσης, δυνατόν η συγκεκριμένη μέθοδος να έχει βέβαια το ίδιο όνομα, αλλά να διαφέρει όχι μόνο στην υλοποίηση (επικάλυψη) αλλά και στη λίστα των παραμέτρων που μπορεί να δέχεται (αριθμό και τύπο) (υπερφόρτωση). Σε μια διαδικαστική γλώσσα προγραμματισμού όπως η C, κάτι τέτοιο θα προκαλούσε την έξοδο μηνύματος λάθους από το μεταγλωττιστή και τον τερματισμό της διαδικασίας μεταγλώττισης, με μηνύματα όπως "duplicate identifier declaration" ή "previously declared identifier" ή κάτι παρόμοιο. 26
Πολυμορφισμός (3/3) Στο παράδειγμα των γεωμετρικών σχημάτων ας αντικαταστήσουμε την κλάση για το «τρίγωνο» με μια άλλη όπως «κυρτό πολύγωνο». Η κλάση αυτή θα μπορούσε να αναφέρεται σε σχήματα με τουλάχιστον τρεις κορυφές. Υποκλάση του κυρτού πολυγώνου θα μπορούσε να είναι το «τετράγωνο». Ο ορισμός μιας μεθόδου «υπολόγισε περίμετρο» με το ίδιο ακριβώς όνομα αλλά διαφορετική υλοποίηση για το «κυρτό πολύγωνο» και το «τετράγωνο» θα ήταν απολύτως δυνατός. 27
Βιβλιογραφία (1/10) 1. Alexandrescu A. (2001) Modern C++ design: generic programming and design patterns applied. USA, Addison-Wesley Publishing Company. 323 pp. ISBN-13 978-0-201-70431-0. ( 22.85, 27,42). 2. Bennett S, McRobb S and R Farmer. (2002) Object-oriented systems analysis and design using UML. 2nd Edition. McGraw- Hill Education. ISBN 0-07-709864-1. 3. Booch G, Maksimchuk RA, Engle MW, Young BJ, Conallen J and Houston KA. (2007) Object-oriented analysis and design with applications. 3rd ed. USA, Addison-Wesley. 691 pp. ISBN10 0-201-89551-X. ISBN13 978-0-201-89551-3. ( 43.44, 52.56). 28
Βιβλιογραφία (2/10) 4. Carrano FM and Henry T. (2013) Data abstraction and problem solving with C++: walls and mirrors. 6th ed. UK, Pearson Education Limited. 833 pp. ISBN10 0-273-76841-7, ISBN13 978-0-76841-8. 5. Deitel HM and Deitel PJ. (2010) C++ προγραμματισμός. 6η Έκδοση. Ελλάδα, Εκδόσεις Μ. Γκιούρδα. 1448 σελ. ISBN13 978-960-512-591-2. 6. Fowler M. (1999) Refactoring: improving the design of existing code. USA, Addison Wesley Longman, Inc. 431 pp. ISBN13 978-0-201-48567-7. ( 38.62, 49.05). 29
Βιβλιογραφία (3/10) 7. Fowler M. (2004) UML distilled: a brief guide to the standard object modeling language. 3rd ed. USA, Pearson Education, Inc. 175 pp. ISBN13 978-0-321-19368-1. ( 30.10, 38.23). 8. Kruse RL and Ryba AJ. (1999) Data structures and program design in C++. USA, Prentice Hall. 717 pp. ISBN 0-13- 082640-5. ( 40.74). 9. Lafore R. (2006) Αντικειμενοστρεφής προγραμματισμός με τη C++. Ελλάδα, Εκδόσεις Κλειδάριθμος. 1040 σελ. ISBN10 960-209-904-6. 30
Βιβλιογραφία (4/10) 10. Lafore, R. (2002) Object-oriented programming in C++. 4th ed. USA, Sams Publishing. 1012 pp. ISBN-10 0-672-32308-7. ISBN-13 978-0-672-32308-9. ( 29.60, 33.35). 11. Lakos, J. (1996) Large-Scale Software Design in C++. USA, Addison-Wesley. 852 pp. ISBN-10 0-201-63362-0. ISBN-13 978-0-201-63362-7. ( 26.26, 30.20). 12. MacLennan BJ. (1987) Principles of programming languages: design, evaluation, and implementation. 2nd ed. USA, CBS College Publishing. 568 pp. ISBN 0-03-021999-X. ( 8.00). 31
Βιβλιογραφία (5/10) 13. Martin RC. (2012) Agile software development: principles, patterns, and practices. USA, Pearson Education, Inc. 529 pp. ISBN10 0-13-276068-4. ISBN13 978-0-13-276058-4. ( 54.21, 65.59). 14. McConnell S. (1993) Code complete: a practical handbook of software construction. USA, Microsoft Press. 857 pp. ( 25.99). 15. McConnell S. (1996) Rapid development: taming wild software schedules. USA, Microsoft Press. 647 pp. ISBN 1-55615-900-5. ( 25.99). 32
Βιβλιογραφία (6/10) 16. McConnell S. (2004) Professional software development: shorter schedules, higher quality products, more successful projects, enhanced careers. USA, Addison-Wesley. 243 pp. ISBN 0-321-19367-9. ( 19.79, 29.08). 17. McDermid J, ed. (1991) Software engineer s reference book. Great Britain, Butterworth-Heinemann Ltd. 1140 pp. ISBN 0-7506-0813-7. ( 40.00). 18. Meyers S. (1996) More effective C++: 35 new ways to improve your programs and designs. USA, Addison-Wesley. 318 pp. ISBN 0-201-63371-X. ( 25.29, 36.90). 33
Βιβλιογραφία (7/10) 19. Meyers S. (2005) Effective C++: 55 specific ways to improve your programs and designs. 3rd ed. USA, Pearson Education, Inc. 297 pp. ISBN 0-321-33487-6. ( 18.52, 27.01). 20. Pressman RS. (2005) Software engineering: a practitioner s approach. 6th int. ed. Singapore, McGraw-Hill. 912 pp. ISBN 007-123840-9. ( 45.06, 65.83). 21. Reddy M. (2011) API design for C++. USA, Morgan Kaufmann Publishers. 441 pp. ISBN13 978-0-12-385003-4. ( 28.01, 32.21). 22. Sahni S. (2004) Δομές δεδομένων, αλγόριθμοι, και εφαρμογές στη C++. Ελλάδα/ΗΠΑ, Εκδόσεις Τζιόλα/McGraw-Hill. 852 σελ. ISBN10 960-418-030-4. ( 66.56). 34
Βιβλιογραφία (8/10) 23. Savitch W and Mock K. (2013) Πλήρης C++. 4η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 1024 σελ. ISBN13 978-960-418-358-6. ( 76.14). 24. Savitch W. (2015) Java: and introduction to problem solving and programming. 7th ed. USA, Pearson Education, Inc. 989 pp (+204 pp web chapters). ISBN10 0-13-376626-8. ISBN13 978-0- 376626-4. ( 83.99, 97.85 104.75, $122.68). 25. Schildt H. (2000) Ο οδηγός της C++. 3η Έκδοση, Εκδόσεις Μ. Γκιούρδα. 748 σελ. ISBN10 960-512-229-4. ( 29.00). 26. Schildt H. (2004) Μάθετε τη C++ από το μηδέν. 3η Έκδοση. Ελλάδα, Εκδόσεις Κλειδάριθμος. 660 σελ. ISBN10 960-209-731-0. ( 46.90). 35
Βιβλιογραφία (9/10) 27. Sommerville I. (2004) Software Engineering. 7th ed. USA, Addison-Wesley. 759 pp. ISBN 0-321-21026-3. ( 40.95, 60.17). 28. Stroustrup B. (2000) The C++ programming language. Special Edition. USA, Addison-Wesley Longman, Inc. 1020 pp. ISBN 0-201-70073-5. ( 37.20, 54.26). 29. Sutter H and Alexandrescu A. (2005) C++ coding standards: 101 rules, guidelines, and best practices. USA, Pearson Education, Inc. 220 pp. ISBN10 0-321-11358-6. ISBN13 978-0-321-11358-0. ( 19.71, 22.67). 36
Βιβλιογραφία (10/10) 30. Sutter H. (2000) Exceptional C++: 47 engineering puzzles, programming problems, and solutions. USA, Addison- Wesley Longman, Inc. 215 pp. ISBN10 0-201-61562-2. ISBN13 978-0-201-61562-3. ( 24.32, 27.97). 31. Sutter H. (2002) More exceptional C++: 40 new engineering puzzles, programming problems, and solutions. USA, Pearson Education, Inc. 279 pp. ISBN10 0-201-70434-X. ISBN13 978-0-201-70434-1. ( 28.05, 32.26). 32. Χατζηγιαννάκης ΝΜ. (2014) Η γλώσσα C++ σε βάθος. 2η αναθεωρημένη έκδοση. Ελλάδα, Εκδόσεις Κλειδάριθμος. 974 σελ. ISBN13 978-960-461-620-6. ( 89.00). 37
Σημείωμα Αναφοράς Copyright ΤΕΙ Δυτικής Μακεδονίας, Σίσιας Γεώργιος. «Προγραμματισμός ΙΙ». Έκδοση: 1.0. Κοζάνη 2015. Διαθέσιμο από τη δικτυακή διεύθυνση: 38
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο. που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο. που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο. Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. 39
Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς. το Σημείωμα Αδειοδότησης. τη δήλωση Διατήρησης Σημειωμάτων. το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει). μαζί με τους συνοδευόμενους υπερσυνδέσμους. 40