FORTRAN & Αντικειμενοστραφής Προγραμματισμός ΣΝΜΜ 2017 M8 Αντικειμενοστραφής Προγραμματισμός - Ασκήσεις Γεώργιος Παπαλάμπρου Επικ. Καθηγητής ΕΜΠ Εργαστήριο Ναυτικής Μηχανολογίας george.papalambrou@lme.ntua.gr ΕΜΠ/ΣΝΜΜ Εργαστήριο Ναυτικής Μηχανολογίας 1
Εισαγωγή Το αντικείμενο OOP είναι ευρύ και ειδικευμένο. Παρουσιάζονται εδώ οι βασικές αρχές με περιγραφικό τρόπο. Ο αναγνώστης μπορεί να βρεί περισσότερα στοιχεία στις εξής πηγές: 1. Metcalf et al., κεφ. 14. 2. Holcomb, K., SCIENTIFIC PROGRAMMING IN FORTRAN 2003, A tutorial Including Object-Oriented Programming, [https://wiki.uiowa.edu/download/attachments/109785161/fortran-novella- Holcomb.pdf, sec. 11] 3. Akin, E., Object Oriented Programming via Fortran 90/95 [pdf από web, sec. 3, 5, 6] - προτείνεται 4. FORTRAN Wiki: http://fortranwiki.org/fortran/show/objectoriented+programming 2
Τύποι Δεδομένων Akin, E., Object Oriented Programming via Fortran 90/95 [pdf από web] 3
Τύποι Δεδομένων Συχνά χρειάζεται να δημιουργήσουμε δικούς μας τύπους δεδομένων, βασισμένους σε τύπους δεδομένων που διαθέτει η γλώσσα Fortran. Οι τύποι οριζόµενοι από τον χρήστη είναι χρήσιµοι στις περιπτώσεις που θέλουµε να δηµιουργήσουµε λίστες με ανόµοια δεδοµένα (διαφορετικού τύπου) ή κατά το Object Oriented Programming. 4
Τύποι Δεδομένων - Παράδειγμα ΜΣ Ως παράδειγμα θεωρούμε συγκέντρωση στοιχείων από µετεωρολογικούς σταθµούς. Τότε έχουµε πλήθος από µετεωρολογικούς σταθµούς σε κάθε νοµό και συλλέγουμε από τον κάθε ένα στοιχεία για το πρόγραµµα πρόβλεψης καιρού. Από κάθε σταθµό παίρνουµε ένα σετ από δεδοµένα διαφορετικού τύπου: τον κωδικό (ακέραιος), το όνοµα (χαρακτήρας), το γεωγραφικό µήκος, πλάτος, το υψόµετρο (πραγµατικοί) και τη θερµοκρασία, υγρασία και βροχόπτωση του 24ώρου (πραγµατικά διανύσµατα 24 θέσεων). Κανονικά θα έπρεπε να δηλωθεί κάθε τύπος χωριστά και µάλιστα σαν µητρώο ή διάνυσµα µε µέγεθος ίσο µε το πλήθος των σταθµών. 5
Τύποι Δεδομένων - Παράδειγμα ΜΣ Από τη στιγµή που το σετ των ανόµοιων δεδοµένων επαναλαµβάνεται για κάθε σταθµό, δηµιουργούµε σε ένα Module προγράμματος ένα νέο τύπο µεταβλητής, τον τύπο Station ως εξής: MODULE NewType TYPE Station INTEGER:: code CHARACTER(LEN=15):: name REAL:: latitude, longitude, altitude! Gplatos, Gmikos, Ypsometro REAL, DIMENSION(24):: temperature, humidity, rain END TYPE END MODULE NewType Ο νέος τύπος µπορεί να περιέχει τα δεδοµένα ενός σταθµού. Αν τον δηλώσουµε σαν µητρώο κάθε στοιχείο του θα αντιστοιχεί σε έναν σταθµό και θα περιέχει 8 διαφορετικά είδη δεδοµένων. Στο κυρίως πρόγραµµα θέτουμε USE NewType ώστε να µπορούµε να δηλώσουµε µε το νέο τύπο Station όσες µεταβλητές απαιτούνται 6
Μονάδες προγράμματος (modules) Δεν είναι απαραίτητο για ένα module να είναι στο δικό του αρχείο, αλλά αυτή είναι η συνήθης πρακτική, εκτός εάν η μονάδα είναι πολύ μικρή Ο compiler πρέπει να γνωρίζει την μονάδα πριν από οποιαδήποτε άλλο τμήμα του προγράμματος μπορεί να το χρησιμοποιήσει. Η χρήση στο κυρίως πρόγραμμα γίνεται μέσω της δήλωσης use: Πρόγραμμα circle_test.f95 program circle_test use class_circle implicit none... Πρόγραμμα class_circle.f95 module class_circle implicit none private real :: pii = 23.14!constant end module class_circle 7
Τύποι Δεδομένων - Παράδειγμα ΜΣ Η δήλωση γίνεται µε την εντολή TYPE(Station) και η ανάγνωση των δεδοµένων γίνεται µε ένα απλό impled DO. Προσοχή θα χρειαστεί στο FORMAT όπου θα εµφανίζονται µε τη σειρά κωδικοί περιγραφής για όλες τις µεταβλητές που περιέχονται στον τύπο STATHMOS. Πράγµατι, ηεντολή 20 διαβάζει: 1 ακέραιο, 1 σειρά χαρακτήρων, 3 πραγµατικούς & 3 διανύσµατα των 24 πραγµατικών PROGRAM Kairos USE NewType IMPLICIT NONE... INTEGER, PARAMETER:: Nattiki=200, Nviotia=130, Nevoia=150... TYPE(Station):: attiki(nattiki), viotia(nviotia), evoia(nevoia)... READ(10,20) (attiki(i), i=1,nattiki) 20 FORMAT(I5,A15,3F6.1,3(24F8.2))... 8
Τύποι Δεδομένων - Παράδειγμα ΜΣ Κατά την εκτέλεση του προγράµµατος όταν αναφερόµαστε σε ένα από τα περιεχόµενα του τύπου χρησιµοποιούµε το σύµβολο % για να χωρίσουµε το όνοµα της µεταβλητής από τα ονόµατα των περιεχοµένων. Έτσι το attiki(78)%rain(10:14) θα δώσει από τον σταθµό 78 της Αττικής ένα διάνυσµα µε 5 τιµές βροχόπτωσης. Το ηµερήσιο άθροισµα βροχόπτωσης για τους σταθμούς Αττικής και Βοιωτίας θα είναι: DO i = 1, Nattiki attiki_raindaily(i)=sum(attiki(i)%rain(1:24)) END DO DO i = 1, Nviotia viotia_raindaily(i)=sum(viotia(i)%rain(1:24)) END DO Τέλος, για κάθε τύπο δεδοµένων µπορούν να οριστούν και πράξεις ή συναρτήσεις που ισχύουν µόνο για τον συγκεκριµένο τύπο (χρήση στο OOP). 9
Έννοιες ΟOP Akin, E., Object Oriented Programming via Fortran 90/95 [pdf από web] Sec. 2, Data types Sec. 3, Object Oriented Programming Concepts Sec. 5, Object Oriented Methods Sec. 6, Inheritance and Polymorphism 10
Έννοιες ΟOP Οι σύγχρονες γλώσσες OO παρέχουν στον προγραμματιστή τρείς δυνατότητες που βελτιώνουν και απλοποιούν το σχεδιασμό προγραμμάτων OOP: ενθυλάκωση, κληρονομικότητα και πολυμορφισμός (encapsulation, inheritance, polymorphism) Σχετικά θέματα περιλαμβάνουν αντικείμενα, κλάσεις και απόκρυψη δεδομένων (objects, classes, data hiding). Ένα αντικείμενο συνδυάζει διάφορους κλασικούς τύπους δεδομένων σε μια ομάδα που ορίζει ένα νέο τύπο μεταβλητής ή δομή. Μια κλάση ενοποιεί τους νέους τύπους οντοτήτων και υποστηρίζει δεδομένα με ρουτίνες (λειτουργίες και υπορουτίνες) που έχουν πρόσβαση ή / και τροποποιούν αυτά δεδομένα. Κάθε αντικείμενο που δημιουργείται από μια κλάση, παρέχοντας τα απαραίτητα δεδομένα, καλείται υλοποίηση (instance) της κλάσης. από Akin (2003), παρ. 3.1, σελ. 3 11
Έννοιες ΟOP Σε παλαιότερες γλώσσες, όπως C και F77, τα δεδομένα και οι λειτουργίες είναι ξεχωριστές οντότητες. Μια σύγχρονη γλώσσα OO (όπως C++, Python, Java) παρέχει τρόπο σύζευξης ή ενθυλάκωσης των δεδομένων και των λειτουργιών τους σε μια ενιαία οντότητα. Αυτός είναι ένας περισσότερο φυσικός τρόπο να μοντελοποιήσουμε πραγματικές οντότητες που έχουν δεδομένα και λειτουργικότητα. από Akin (2003), παρ. 3.1, σελ. 33 12
Έννοιες ΟOP Η ενθυλάκωση γίνεται με ένα μπλοκ «module» στην F90 και με ένα μπλοκ «class» στη C ++. Αυτή η ενθυλάκωση περιλαμβάνει επίσης ένας μηχανισμό με τον οποίο ορισμένα ή όλα τα δεδομένα και οι ρουτίνες υποστήριξης μπορούν να αποκρύπτονται από το χρήστη. Η προσβασιμότητα των προδιαγραφών και των ρουτινών μιας τάξης συνήθως ελέγχεται από δηλώσεις «public» και «private». Η απόκρυψη δεδομένων επιτρέπει σε καάποιον να προστατεύει πληροφορίες σε ένα μέρος ενός προγράμματος από την πρόσβαση και ειδικά από την αλλαγή σε άλλα μέρη του προγράμματος. Στην C ++ η προεπιλογή είναι ότι τα δεδομένα και οι λειτουργίες είναι τύπου «private» εκτός εάν δηλωθούν ως «public», ενώ η F90 κάνει την αντίθετη επιλογή προεπιλεγμένης λειτουργία προστασίας. Σε μια ενότητα "F90" η δήλωση «contains» μεταξύ άλλων συνδυάζει τα δεδομένα, τις προδιαγραφές και τους χειριστές πριν από τις λειτουργίες και τις υπορουτίνες που την ακολουθούν. από Akin (2003), παρ. 3.1, σελ. 33 13
Έννοιες ΟOP Οι ιεραρχίες των τάξεων μπορούν να απεικονιστούν όταν συνειδητοποιήσουμε ότι μπορούμε να χρησιμοποιήσουμε μία ή περισσότερες προηγούμενες κλάσεις (για δεδομένα και λειτουργικότητα) για την οργάνωση πρόσθετων κλάσεων. Έτσι λειτουργικότητα προγραμματισμένη σε προηγούμενες κλάσεις ενδέχεται να μην χρειάζεται να επαναληφθεί για να είναι εφαρμόσιμη στις μεταγενέστερες κλάσεις. Ο μηχανισμός αυτός στην OOP ονομάζεται κληρονομικότητα (inheritance). από Akin (2003), παρ. 3.1, σελ. 33 14
Παράδειγμα 1 FTN-OOP Για παράδειγμα, εάν έχουμε ορίσει μια κλάση Employee, τότε μια κλάση Manager θα κληρονομήσει όλα τα δεδομένα και τη λειτουργικότητα της Employee. Θα χρειαζόταν μόνο να προσθέσουμε μόνο τα εντελώς νέα δεδομένα και λειτουργίες που απαιτούνται για έναν Manager. Μπορεί επίσης να χρειαστούμε έναν μηχανισμό για να επαναπροσδιορίσουμε συγκεκριμένες λειτουργίες κλάσης Employee που διαφέρουν για μια κλάση Manager. Χρησιμοποιώντας την έννοια iεραρχίας κλάσης, απαιτείται λιγότερος προγραμματισμός για την δημιουργία του τελικού προγράμματος. Στην F90 η αρχική κλάση μεταφέρεται στην ιεραρχία της επόμενης κλάσης με τη χρήση «use» ακολουθούμενη από το όνομα του module που καθορίζει την κλάση. Employee: όνομα, επίθετο, θέση, μισθός -> Manager: από Employee + νέα χαρακτηριστικά, πχ bonus από Akin (2003), παρ. 3.1, σελ. 33 15
Παράδειγμα 2 FTN-OOP Δίνεται πρόγραμμα γεωμετρίας που χρησιμοποιεί δύο διαφορετικές κλάσεις: class circle και class rectangle, όπως αναπαρίσταται γραφικά στα Σχήματα 3.1, 3.2. Ο κώδικας σε F90 όπως φαίνεται στο Σχ. 3.3 Κάθε εμφανιζόμενη κλάση έχει τους τύπους δεδομένων και τις προδιαγραφές για τον ορισμό του αντικειμένου και της λειτουργικότητας Ο τελεστής % χρησιμοποιείται για την επιλογή συγκεκριμένων στοιχείων ενός καθορισμένου τύπου. από Akin (2003), παρ. 3.2, σελ. 34 Σχ. 3.3 16
Παράδειγμα 2 FTN-OOP Μέσα στο κυρίως πρόγραμμα geometry, καλείται η ρουτίνα compute_area (γραμμή 40) για να επιστρέψει την επιφανεια για οποιαδήποτε από τις καθορισμένες κλάσεις γεωμετρίας. Δηλαδή, ένα γενικό όνομα ρουτίνας χρησιμοποιείται για όλες τις κλάσεις και με τη σειρά του δίνει την αντίστοιχη λειτουργικότητα. Για να επιτευχθεί αυτή η διακλάδωση το πρόγραμμα κάνει χρήση του use για κάθε κλάση (γραμμές 25 και 26). από Akin (2003), παρ. 3.2, σελ. 34 17
Παράδειγμα 2 FTN-OOP Σε αυτό το παράδειγμα έχουμε χρησιμοποιήσει διαφορετικά ονόματα, rectangular area and circle area, στα δικά τους modules κλάσης, αλλά αυτό δεν είναι απαραίτητο. Η δήλωση use επιτρέπει σε κάποιον να μετονομάσει τηις ρουτίνες της κλάσης ή / και να φέρει μόνο επιλεγμένα μέλη της λειτουργικότητας. από Akin (2003), παρ. 3.2, σελ. 34 18
Παράδειγμα 2 FTN-OOP από Akin (2003), παρ. 3.2, σελ. 34 19
Παράδειγμα 2 FTN-OOP Αρχείο <circle_test1.f95> στο dropbox../m8_codes FORTRAN Wiki: http://fortranwiki.org/fortran/show/objectoriented+programming, προσαρμοσμένο από Akin (2003), σελ. 34 20
Περισσότερα στοιχεία OOP από Akin (2003), κεφ. 5 21
Περισσότερα στοιχεία OOP από Akin (2003), κεφ. 5 22
Περισσότερα στοιχεία OOP από Akin (2003), κεφ. 5 Για την χρήση των interfaces: http://www.cs.mtu.edu/~shene/courses/c s201/notes/chap06/interface.html 23
Περισσότερα στοιχεία OOP από Akin (2003), κεφ. 5 24
Περισσότερα στοιχεία OOP από Akin (2003), κεφ. 5 25
Περισσότερα στοιχεία OOP από Akin (2003), κεφ. 6 26
Περισσότερα στοιχεία OOP από Akin (2003), κεφ. 6 27
Περισσότερα στοιχεία OOP από Akin (2003), κεφ. 6 28
Περισσότερα στοιχεία OOP από Akin (2003), κεφ. 6 29
Περισσότερα στοιχεία OOP από Akin (2003), κεφ. 6 30