Προγραμματισμός ΙΙ Ενότητα 7: Βιβλιοθήκες - Μέρος 2 Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο TEI Δυτικής Μακεδονίας και στην Ανώτατη Εκκλησιαστική Ακαδημία Θεσσαλονίκης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Βιβλιοθήκες - Μέρος 2
Σκοποί ενότητας Η ενότητα αυτή, ασχολείται με το ζήτημα των βιβλιοθηκών. 5
Περιεχόμενα ενότητας Απομόνωση μίας κλάσης στο δικό της ζεύγος αρχείων επικεφαλίδων και κώδικα. Συνδυασμός πρότυπων κλάσεων και βιβλιοθηκών. Παρατηρήσεις. Βιβλιογραφία. 6
Απομόνωση μίας κλάσης στο δικό της ζεύγος αρχείων επικεφαλίδων και κώδικα (1/4) Μια άλλη τεχνική είναι ο διαχωρισμός μιας κλάσης σε ένα ζεύγος αρχείων.h/.cpp. Αυτό σημαίνει ότι η δήλωση της κλάσης βρίσκεται στο αντίστοιχο αρχείο.h, ενώ η υλοποίησή της βρίσκεται απομονωμένη στο συνοδευτικό αρχείο.cpp. Όπως και πριν, το αρχείο επικεφαλίδων περιέχει μέσα του την κατάλληλη οδηγία προς το μεταγλωττιστή ώστε να μη συμπεριληφθούν ξανά οι δηλώσεις του. 7
Απομόνωση μίας κλάσης στο δικό της ζεύγος αρχείων επικεφαλίδων και κώδικα (2/4) Το αρχείο της υλοποίησης (.cpp) περιέχει μια εντολή #include με το όνομα του αρχείου.h, καθώς και όσες άλλες #include κρίνεται αναγκαίο. Μετά ακολουθεί ο κώδικας που αντιπροσωπεύει την υλοποίηση της κλάσης (δηλαδή όλων των μεθόδων που αναφέρονται στη δήλωση που βρίσκεται στο αντίστοιχο αρχείο.h). 8
Απομόνωση μίας κλάσης στο δικό της ζεύγος αρχείων επικεφαλίδων και κώδικα (3/4) Εδώ πρέπει να επισημάνουμε ότι αν η δήλωση της κλάσης συμπεριλαμβάνει άλλες βιβλιοθήκες, αυτές δε χρειάζεται να συμπεριληφθούν και στο αντίστοιχο αρχείο κώδικα, αφού το αρχείο κώδικα συμπεριλαμβάνει το αρχείο επικεφαλίδων. Αν όμως το αρχείο κώδικα χρειάζεται κάποιες βιβλιοθήκες που δε χρειάζονται στο αντίστοιχο αρχείο επικεφαλίδων, τότε αντενδείκνυται η συμπερίληψη αυτών των βιβλιοθηκών και στο αρχείο επικεφαλίδων. 9
Απομόνωση μίας κλάσης στο δικό της ζεύγος αρχείων επικεφαλίδων και κώδικα (4/4) Συνοψίζοντας το τελευταίο, οι αναγκαίες βιβλιοθήκες εισάγονται ακριβώς εκεί όπου χρειάζονται και όχι όλες απερίσκεπτα στο αρχείο επικεφαλίδων. 10
Συνδυασμός πρότυπων κλάσεων και βιβλιοθηκών (1/2) Όπως έχουμε εξηγήσει στην αντίστοιχη ενότητα των πρότυπων κλάσεων, η δήλωση και η υλοποίηση των πρότυπων κλάσεων πρέπει να βρίσκεται στο αρχείο επικεφαλίδων. Υπάρχουν υλοποιήσεις που διαχωρίζουν τεχνητά τα δύο, όπως φαίνεται στις πρότυπες κλάσεις δομών δεδομένων στο βιβλίο Carrano and Henry (2013). 11
Συνδυασμός πρότυπων κλάσεων και βιβλιοθηκών (2/2) Εκεί η υλοποίηση διαχωρίζεται και μεταφέρεται σε ένα αντίστοιχο αρχείο.cpp, ενώ η συμπερίληψη γίνεται στο αρχείο επικεφαλίδων, με: #include <αρχείο.cpp>. Όπου αρχείο είναι το όνομα του αντίστοιχου αρχείου κώδικα. 12
Παρατηρήσεις (1/5) Το βιβλίο Lakos (1996) (σελ. 77-79) αποτελεί μια εξαιρετική πηγή που είναι πραγματικά πολύτιμη όταν πρέπει να αναπτυχθεί λογισμικό μεγάλης κλίμακας. Ένα συμπληρωματικό βιβλίο, που είναι εξίσου χρήσιμο, είναι το Reddy (2011) (σελ. 215-217). Και στα δύο αυτά συγγράμματα γίνεται εκτενέστατη αναφορά στις βιβλιοθήκες και στις διεπαφές προγραμματισμού εφαρμογών (APIs). 13
Παρατηρήσεις (2/5) Στο Lakos (1996) προτείνεται ένας τρόπος συμπερίληψης βιβλιοθηκών που επιταχύνει πολλές φορές τη μεταγλώττιση ενός προγράμματος που αποτελείται από πολλές δεκάδες ή εκατοντάδες αρχεία. Στις δύο προαναφερθείσες αναφορές παρουσιάζονται πειράματα που δείχνουν ποσοτικά τη μείωση του συνολικού χρόνου μεταγλώττισης. 14
Παρατηρήσεις (3/5) Η τεχνική που προτείνεται φαίνεται στο παρακάτω απόσπασμα κώδικα: #ifndef COMPLEX_H #include "Complex.h" #endif 15
Παρατηρήσεις (4/5) Δηλαδή, ο έλεγχος σε επίπεδο οδηγίας προς το μεταγλωττιστή γίνεται εκτός του προς συμπερίληψη αρχείου. Αυτή η προσέγγιση αποτρέπει ακόμη και το άνοιγμα του αρχείου, όταν έχει ήδη συμπεριληφθεί σε κάποιο άλλο μέρος του προγράμματος. Το σύμβολο COMPLEX_H εισάγεται στον πίνακα συμβόλων του μεταγλωττιστή την πρώτη φορά που συναντάται το αρχείο Complex.h. 16
Παρατηρήσεις (5/5) Στη 2η αναφορά από τις παραπάνω, όμως, αναφέρεται ότι με ένα συνδυασμό του Linux και του μεταγλωττιστή GNU υπήρξε ελάχιστη διαφορά με την παραπάνω προσέγγιση. Εικάζεται ότι ο λόγος κρύβεται πίσω από την κρυφή μνήμη που χρησιμοποιεί το Linux για το σκληρό δίσκο. 17
Βιβλιογραφία (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). 18
Βιβλιογραφία (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). 19
Βιβλιογραφία (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. 20
Βιβλιογραφία (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). 21
Βιβλιογραφία (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). 22
Βιβλιογραφία (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). 23
Βιβλιογραφία (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). 24
Βιβλιογραφία (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). 25
Βιβλιογραφία (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). 26
Βιβλιογραφία (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). 27
Τέλος Ενότητας
Σημείωμα Αναφοράς Copyright ΤΕΙ Δυτικής Μακεδονίας, Σίσιας Γεώργιος. «Προγραμματισμός ΙΙ». Έκδοση: 1.0. Κοζάνη 2015. Διαθέσιμο από τη δικτυακή διεύθυνση: 29
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο. που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο. που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο. Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. 30
Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς. το Σημείωμα Αδειοδότησης. τη δήλωση Διατήρησης Σημειωμάτων. το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει). μαζί με τους συνοδευόμενους υπερσυνδέσμους. 31