Προγραμματισμός ΙΙ Ενότητα 8: Πρότυπες συναρτήσεις και πρότυπες κλάσεις - Μέρος 1 Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο TEI Δυτικής Μακεδονίας και στην Ανώτατη Εκκλησιαστική Ακαδημία Θεσσαλονίκης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Πρότυπες συναρτήσεις και πρότυπες κλάσεις - Μέρος 1
Σκοποί ενότητας Η ενότητα αυτή, ασχολείται με το ζήτημα των πρότυπων συναρτήσεων και των πρότυπων κλάσεων. 5
Περιεχόμενα ενότητας Εισαγωγή. Πρότυπες συναρτήσεις. Βιβλιογραφία. 6
Εισαγωγή (1/6) Οι πρότυπες συναρτήσεις και οι πρότυπες κλάσεις βοηθούν στο διαχωρισμό των αλγορίθμων και των δεδομένων τα οποία επεξεργάζονται. Ας υποθέσουμε ότι θέλετε να τρέξετε κάποιον αλγόριθμο που επεξεργάζεται κάποια δεδομένα. Ο αλγόριθμος αυτός, ίσως, ταξινομεί μια λίστα αριθμών. Αυτοί οι αριθμοί μπορεί να είναι ακέραιοι ή κινητής υποδιαστολής. 7
Εισαγωγή (2/6) Από τεχνικής άποψης η λίστα μπορεί να περιέχει τα στοιχεία φοιτητών τα οποία πρέπει να ταξινομηθούν βάσει του Αριθμού Μητρώου (ΑΜ) των φοιτητών. Σε κάθε μία από αυτές τις περιπτώσεις η ταξινόμηση γίνεται με πανομοιότυπο τρόπο. Αν δεν υπήρχε ο μηχανισμός των πρότυπων συναρτήσεων ή κλάσεων, θα έπρεπε να υλοποιήσετε τον αλγόριθμο ταξινόμησης σε πλήθος ξεχωριστών συναρτήσεων όπου η κάθε μία λειτουργεί με διαφορετικούς τύπους δεδομένων. 8
Εισαγωγή (3/6) Η δύναμη αλλά και η ανάγκη ύπαρξης των πρότυπων κλάσεων γίνεται πιο εύκολα αντιληπτή όταν σκεφτούμε πώς θα αντιμετωπίσουμε το ενδεχόμενο να έχουμε συνδεδεμένες λίστες (ή οποιαδήποτε άλλη δομή δεδομένων) που λειτουργούν με διαφορετικούς τύπους δεδομένων. Παραδείγματος χάριν, χρειαζόμαστε μια συνδεδεμένη λίστα για ακέραιους, για αριθμούς κινητής υποδιαστολής, για πληροφορίες των νημάτων και διεργασιών ενός λειτουργικού συστήματος, ή κάτι άλλο. 9
Εισαγωγή (4/6) Όπως και πριν, αν δεν υπήρχαν οι πρότυπες κλάσεις, θα έπρεπε να υλοποιήσουμε την κάθε μία δομή δεδομένων ξεχωριστά, για τον κάθε ένα διαφορετικό τύπο δεδομένων που θέλουμε να χρησιμοποιήσουμε. Οι πρότυπες κλάσεις μάς επιτρέπουν να κατασκευάσουμε την απαιτούμενη κλάση μία φορά, αλλά όταν τη χρησιμοποιούμε να ορίζουμε κάθε φορά διαφορετικό τύπο δεδομένων, σύμφωνα με τις ανάγκες μας. 10
Εισαγωγή (5/6) Στην παρούσα ενότητα θα εξετάσουμε την παρακάτω θεματολογία: Πρότυπες συναρτήσεις. Πρότυπες κλάσεις. Πρότυπες κλάσεις και υπερφόρτωση τελεστών. Τεχνικά ζητήματα σχετικά με τις πρότυπες συναρτήσεις και κλάσεις. 11
Εισαγωγή (6/6) Προτείνεται οι παραπάνω ενότητες να εξεταστούν με τη σειρά που εμφανίζονται. Ο αναγνώστης δε θα πρέπει να παραλείψει τα τεχνικά ζητήματα που σχετίζονται με τη θεματολογία της παρούσας ενότητας, αφού αφορούν στις επιπτώσεις της χρήσης τους. Κάποια από τα ζητήματα που συζητούμε στις πρότυπες συναρτήσεις ισχύουν και στην περίπτωση των πρότυπων κλάσεων. 12
Πρότυπες συναρτήσεις (1/9) Ας υποθέσουμε ότι χρειάζεται να υλοποιήσουμε μια συνάρτηση που επιστρέφει την ελάχιστη τιμή των δύο παραμέτρων της. Ο αλγόριθμος των συναρτήσεων που εκτελούν την ίδια λειτουργία πρέπει να υπάρχει μόνο μία φορά, αλλά να μπορούμε να τον χρησιμοποιήσουμε με διαφορετικούς τύπους δεδομένων, όποτε χρειαστεί. Αυτό γίνεται με τη βοήθεια πρότυπων συναρτήσεων. 13
Πρότυπες συναρτήσεις (2/9) Οι πρότυπες συναρτήσεις συντάσσονται λίγο διαφορετικά από τις απλές. Πρέπει, κάπως, να δηλώσουμε ότι μια συνάρτηση είναι πρότυπη. Αυτό συνεπάγεται το δεύτερο: Κατά τη δήλωση και υλοποίηση της συνάρτησης δεν μπορούμε να χρησιμοποιήσουμε κάποιο συγκεκριμένο τύπο, αλλά κάτι άλλο στη θέση του, το οποίο θα συγκεκριμενοποιηθεί κατά τη χρήση της συνάρτησης. 14
Πρότυπες συναρτήσεις (3/9) Ας δούμε τη δήλωση και υλοποίηση μιας πρότυπης συνάρτησης, στα πλαίσια του προηγούμενου παραδείγματος, του οποίου θα δούμε την πλήρη υλοποίηση σε λίγο. 15
Πρότυπες συναρτήσεις (4/9) Πριν από την επικεφαλίδα της συνάρτησης υπάρχουν οι λέξεις: template <class T> Η λέξη template λέει ότι ακολουθεί πρότυπη συνάρτηση (template function) (ή κλάση). Μέσα στα σύμβολα < και > υπάρχει η λέξη class, συνοδευόμενη από το όνομα του γενικού τύπου που για την ώρα δεν ξέρουμε ποιος είναι, αλλά θα τον υποδείξουμε αργότερα, κατά τη χρήση της συνάρτησης. 16
Πρότυπες συναρτήσεις (5/9) Το όνομα του γενικού τύπου εδώ είναι το Τ, αλλά μπορεί να είναι οποιοδήποτε, όπως Χ, Υ, MY_TYPE, κλπ. Ακολουθεί η επικεφαλίδα της συνάρτησης: T Min(const T &a, const T &b) Το όνομα της συνάρτησης είναι το Min, οι δύο παράμετροι είναι οι a και b, οι οποίες δε μεταβάλλονται από τον κώδικα της συνάρτησης και έχουν το const πριν από τον τύπο τους, και τον τύπο τους, εδώ το Τ, ο οποίος είναι ο ίδιος όπως στην προηγούμενη από την επικεφαλίδα γραμμή. 17
Πρότυπες συναρτήσεις (6/9) Ο επιστρεφόμενος τύπος είναι πάλι το Τ, αφού συγκρίνουμε δύο αριθμούς που είναι του ίδιου τύπου (και συνεπώς ο τύπος των a και b είναι και στις δύο περιπτώσεις ο Τ), και φυσικά ο μικρότερός τους θα είναι πάλι του ίδιου τύπου, δηλαδή του τύπου Τ. Η δήλωση μπορεί να γραφτεί κάπως πιο απλά:. T Min(T a, T b) 18
Πρότυπες συναρτήσεις (7/9) Από αυτήν, την πιο απλή δήλωση, μπορείτε να δείτε ότι ο συγκεκριμένος τύπος (int, float, ή οτιδήποτε άλλο) έχει αντικατασταθεί από το Τ. Στο παραπάνω παράδειγμα απλά προσθέσαμε το const και το & πριν από τον τύπο κάθε μίας παραμέτρου. Επαναλαμβάνουμε ότι το & λέει ότι στην περίπτωση που το όρισμα κατά την κλήση της συνάρτησης είναι σύνθετος τύπος, θα περάσει μόνο η διεύθυνσή του και όχι ολόκληρη η τιμή. 19
Πρότυπες συναρτήσεις (8/9) Αν θέλετε μπορείτε να συνδυάσετε μαζί την 1η και τη 2η γραμμή της δήλωσης: template <class T> T Min(const T &a, const T &b) Ο συγκεκριμένος τρόπος συγγραφής της επικεφαλίδας μιας πρότυπης συνάρτησης είναι πιο πολύπλοκος και δυσκολότερος στην απομνημόνευση. 20
Πρότυπες συναρτήσεις (9/9) Προτείνεται η συγγραφή σε δύο γραμμές, όπως φαίνεται παραπάνω και επαναλαμβάνουμε εδώ άλλη μία φορά, το πλεονέκτημα της οποίας είναι ότι η πρώτη γραμμή υποδηλώνει ότι πρόκειται για πρότυπη συνάρτηση που δουλεύει με τον γενικό και απροσδιόριστο τύπο Τ, και η δεύτερη γραμμή μοιάζει με μια απλή δήλωση συνάρτησης. template <class T> T Min(const T &a, const T &b) 21
Βιβλιογραφία (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). 22
Βιβλιογραφία (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). 23
Βιβλιογραφία (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. 24
Βιβλιογραφία (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). 25
Βιβλιογραφία (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). 26
Βιβλιογραφία (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). 27
Βιβλιογραφία (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). 28
Βιβλιογραφία (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). 29
Βιβλιογραφία (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). 30
Βιβλιογραφία (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). 31
Σημείωμα Αναφοράς Copyright ΤΕΙ Δυτικής Μακεδονίας, Σίσιας Γεώργιος. «Προγραμματισμός ΙΙ». Έκδοση: 1.0. Κοζάνη 2015. Διαθέσιμο από τη δικτυακή διεύθυνση: 32
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο. που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο. που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο. Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. 33
Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς. το Σημείωμα Αδειοδότησης. τη δήλωση Διατήρησης Σημειωμάτων. το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει). μαζί με τους συνοδευόμενους υπερσυνδέσμους. 34