ΠΛΗΡΟΦΟΡΙΚΗ ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Κ.ΑΛΑΦΟΔΗΜΟΣ καθηγητής Δ.Παπαχρήστος μέλος ΕΔΙΠ ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΠΑΝΕΠΙΣΤΗΜΙΟ Α ΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ 7 η Διάλεξη
Σκοπός Διάλεξης η παράθεση βασικών εννοιών & ορισμών τoυ Αντικειμενοστραφή Προγραμματισμού
Αντικειμενοστραφής Προγραμματισμός Δομημένος Προγραμματισμός Ο δομημένος προγραμματισμός (structured programming) βασίζεται στην οργάνωση του προγράμματος σε μικρές, αυτόνομα κατανοητές, οντότητες Για να επιτευχθεί αυτό κάθε οντότητα έχει ένα σημείο εισόδου και ένα σημείο εξόδου Η δομή του προγράμματος βασίζεται σε τρεις μόνο λογικές δομές: – ακολουθία (sequence) – επιλογή (condition) – επανάληψη (repetition) Με τη χρήση των παραπάνω δομών μπορεί να εκφραστεί οποιοσδήποτε αλγόριθμος Σε περιπτώσεις που η σχολαστική τήρηση των παραπάνω κάνει το πρόγραμμα δυσανάγνωστο πρέπει οι εξαιρέσεις να κωδικοποιούνται δομημένα, τεκμηριωμένα, με οικονομία στη χρήση τους, και με τάξη
Αντικειμενοστραφής Προγραμματισμός
Μειονεκτήματα (-) Η πολυπλοκότητα Τα δεδομένα έχουν υποεκτιμηθεί Η τοπικότητα των μεταβλητών Υπάρχουν οι καθολικές αλλά τότε αυξάνει η πολ υπλοκότητα Αυξημένη πιθανότητα λάθους Αυξημένη πολυπλοκότητα και στη διαχείριση των δεδομένων Η δημιουργία νέων τύπων δεδομένων είναι δύσ κολη
Αντικειμενοστραφής Προγραμματισμός Αντικειμενοστρεφής Προγραμματισμός, ΑΠ (object oriented programming, ΟΟΡ) Αντικειμενοστρεφής Προγραμματισμός, ΑΠ (object oriented programming, ΟΟΡ) προγραμματιστική τεχνική έμφαση στη δημιουργία μονάδων οι οποίες θα περιλαμβάνουν τα δεδομένα αλλά και τις εντολές που τα διαχειρίζονται βασίζεται στα αντικείμενα (object) και στις αλληλεπιδράσεις μεταξύ τους
Αντικειμενοστραφής Προγραμματισμός Ο κόσμος αποτελείται από αντικείμενα απλά ή σύνθε τα, που αλληλεπιδρούν μεταξύ τους που αλληλεπιδρούν μεταξύ τους Για κάθε αντικείμενο του φυσικού κόσμου μπορούμε να ορίσουμε, μια αφηρημένη έννοια που περιγράφει: τον τρόπο με τον οποίο το αντικείμενο επικοινωνεί μετο περιβάλλον του - τον τρόπο με τον οποίο το αντικείμενο επικοινωνεί μετο περιβάλλον του - το πώς αυτό είναι οργανωμένο εσωτερικά στιγμιότυπα (instances) κλάσεις (classes) ο ΑΠ ονομάζει στιγμιότυπα (instances) τα πραγματικά αντικείμενα και κλάσεις (classes) τις αφηρημένες έννο ιες που τα περιγράφουν.
Αντικειμενοστραφής Προγραμματισμός Κλάσειςαντικείμενα Κλάσεις κα αντικείμενα είναι οι δύο κύριες πτυχές του αντικειμενοστραφή προγραμματισμού τύπο, στιγμιότυπα Η κλάση δημιουργεί ένα νέο τύπο, όπου τα αντικείμενα είναι στιγμιότυπα της κλάσης Κλάση: Προγραμματιστής Η/Υ Στιγμιότυπο: Δ.Παπαχρήστος Κλάση: Γλώσσα Προγραμματισμού Στιγμιότυπο: Python
Αντικειμενοστραφής Προγραμματισμός Κλάσεις Κλάσεις Αντικείμενα ή στιγμιότυπα Αντικείμενα ή στιγμιότυπα
Αντικειμενοστραφής Προγραμματισμός μηχανισμούς Διαθέτει μηχανισμούς: απόκρυψης πληροφορίας περάσματος μηνυμάτων δημιουργίας και καταστροφής στιγμιοτύπων αναπαράστασης ιεραρχίας κληρονομικότητας
Αντικειμενοστραφής Προγραμματισμός Οι μηχανισμοί αυτοί βελτιώνουν την ποιότητα του λογισμικού ως προς τα χαρακτηριστικά του: επαναχρησιμοποίηση (reusability) επαναχρησιμοποίηση (reusability) επεκτασιμότητα (extendibility) επεκτασιμότητα (extendibility) ορθότητα (correctness) ορθότητα (correctness) ευρωστία (robustness) ευρωστία (robustness) συντηρησιμότητα (maintainability) συντηρησιμότητα (maintainability)
Αντικειμενοστραφής Προγραμματισμός Βασικά χαρακτηριστικά ΑΠ Βασικά χαρακτηριστικά ΑΠ
Αντικειμενοστραφής Προγραμματισμός Κλάση στην Python: H κλάση card() αφορά «θεωρητικά» μια τράπουλα: Τα c1 & c2 είναι μεταβλητές που παίρνουν ως τιμή αυτό που επιστρέφει η card() Η card() είναι μια «μηχανή» που φτιάχνει τραπουλόχαρτα
Αντικειμενοστραφής Προγραμματισμός Για να αποκτήσουν τα τραπουλόχαρτα τιμή – αξία πρέπει να γραφτεί πάνω τους μέσω dot notation ορίζοντας χαρακτηριστικά (ιδιότητες) και τιμές: c1 c1: 5 καρώ (d=diamond), κόκκινο (R=red) όχι φιγούρα (c1.fig=False) c2 c2: 5 ρήγας (K=King), σπαθί (c=club) μαύρο (B- black) & φιγούρα (c2.fig=True)
Αντικειμενοστραφής Προγραμματισμός Πλέον μπορεί να χρησιμοποιηθούν αυτές οι τιμές: τραπουλομηχανής Πρόγραμμα «τραπουλομηχανής» όπου κάνουμε χρήση συνάρτησης (def) όπου δέχεται τις δύο παραμέτρους (value, symbol) και υπολογίζει τις άλλες δύο (color, fig):
Αντικειμενοστραφής Προγραμματισμός Όνομα συνάρτησης: _init_ (ειδικές συναρτήσεις) Καθορίζει πως θα συμπεριφέρονται τα αντικείμενα που θα δημιουργεί η κλάση Ορίζει επακριβώς τι γίνεται μόλις δημιουργηθεί ένα αντικείμενο Η ονομασία “self” χρησιμοποιείται γιατί δεν γνωρίζει πως θα ονομασθεί το αντικείμενο (c1 ή c2) Συνεπώς : c1=card(‘5’,’d’) -> self=c1, val=‘5’, sym = ‘d c1=card(‘5’,’d’) -> self=c1, val=‘5’, sym = ‘d ’
Αντικειμενοστραφής Προγραμματισμός στη συνέχεια θα εκτελεστούν οι 2 πρώτες εντολές της συνάρτησης _init_ : και θα δοθούν τιμές στην c1.value & c1.symbol έτσι στις επόμενες εντολές υπολογίζονται οι τμές των c1.color & c1.fig: η κλάση card() δεν περιλαμβάνει τις παραμέτρους κατά τον ορισμό της κλάσης γιατί χρησιμοποιείται για άλλο σκοπό δηλ. να ορίσει κληρονομικότητα από άλλες κλάσεις
Αντικειμενοστραφής Προγραμματισμός Μπορούμε να τυπώνουμε τις τμές όλων των ιδιοτήτων των αντικειμένων που ορίζουμε: Αν τυπώσουμε το ίδιο το αντικείμενο, παίρνουμε μόνο αναφορές στις διευθύνσεις μνήμης σην οποία βρίσκονται:
Αντικειμενοστραφής Προγραμματισμός κουτί Κάθε αντικείμενο μπορούμε να το φανταστούμε σαν ένα κουτί που περιέχει τιμές για διάφορες ιδιότητες, ενδεχομένως συναρτήσεις/μεθόδους, ακόμα και άλλα αντικείμενα/κουτιά
Αντικειμενοστραφής Προγραμματισμός Η __str__ δεν χρειάζεται άλλη παράμετρο παρά μόνο το αντικείμενο (self) πάντα επιστρέφει ένα αλφαριθμητικό (string) self.value+self.symbol Εδώ επιστρέφει το self.value+self.symbol Συνεπώς μπορούμε πλέον να δώσουμε:
Αντικειμενοστραφής Προγραμματισμός εκτός από τις ειδικές συναρτήσεις μπορούμε να προσθέσουμε μέσα στην κλάση δικές μας συναρτήσεις οι οποίες θα καλούνται ως μέθοδοι με dot notation:
Αντικειμενοστραφής Προγραμματισμός Δημιουργία νέας κλάσης που θα δημιουργεί πλήρεις τράπουλες με όλα τα τραπουλόχαρτα Μια κλάση μπορεί να καλέσει αντικείμενα άλλης κλάσης
Αντικειμενοστραφής Προγραμματισμός 4 μεταβλητές μέσα στην κλάση deck αλλά έξω από τις μεθόδους (για να τις προσπελάσει μια μέθοδος θα πρέπει να τις καλέσει με dot notation από το αντικείμενο self, πχ. self.values) Η values περιέχει σε ένα αλφαριθμητικό όλες (13) τις πιθανές αξίες ενός τραπουλόχαρτου στην __init__συνδυάζουμε τις 13 αξίες με τα 4 σύμβολα για να φτιάξουμε όλα τα 13x4=52 τραπουλόχαρτα τα αποθηκεύουμε σε μία λίστα (content) που γεμίζει από την __init__ η λίστα pile χρησιμοποιείται ως μνήμη για να «θυμάται» η τράπουλα ποιά φύλλα έχει μοιράσει (δεν είναι απαραίτητη, όμως διευκολύνει όταν τελειώσει ένα παιχνίδι και θα πρέπει να ξανασυγκεντρωθούν όλα τα χαρτιά στην τράπουλα για να αρχίσει το επόμενο η μέθοδος collect() μαζεύει τα τραπουλόχαρτα από την pile
Αντικειμενοστραφής Προγραμματισμός Η __init__ έχει μόνο ένα όρισμα, το self για να δημιουργήσουμε μια τράπουλα δεν δίνουμε καμμία παράμετρο στην deck: >>> d=deck() Το πρώτο for περνάει από όλα τα σύμβολα, το δεύτερο από όλες τις αξίες, και η c=card(v,s) δημιουργεί ένα τραπουλόχαρτο το οποίο μπαίνει στο τέλος της content με την κλήση self.content.append(c) Όταν τελειώσουν οι δύο for όλα τα τραπουλόχαρτα θα είναι με τη σειρά στη λίστα content τον τρόπο εκτύπωσης καθορίζει η __str__:
Αντικειμενοστραφής Προγραμματισμός Ανακάτεμα τράπουλας Ανακάτεμα τράπουλας (καλεί μια μέθοδο με όμοιο όνομα από το module random για αυτό δηλώνουμε import την random στην αρχή του κώδικα) Μοίρασμα φύλου Μοίρασμα φύλου (χρήση μεθόδου draw() που έχει προγραμματιστεί στην κλάση και όταν καλείται επιστρέφει το φύλλο που βρίσκεται πρώτο (self.content[0]) στην τράπουλα, εκτός αν είναι άδεια, οπότε επιστρέφει «empty». Το φύλλο αφαιρείται από τη λίστα content και ένα αντίγραφό του αποθηκεύεται στην pile)
Αντικειμενοστραφής Προγραμματισμός μέθοδος collect() Η μέθοδος collect() προσθέτει την pile στο τέλος της content και μετά αδειάζει την pile Με αυτόν τον τρόπο ξανασυγκεντρώνει όλα τα φύλλα της τράπουλας για να ξεκινήσει νέο παιχνίδι
Αντικειμενοστραφής Προγραμματισμός κληρονομικότητα (inheritance) βολικό μηχανισμό Η κληρονομικότητα (inheritance) παρέχει έναν βολικό μηχανισμό για την κατασκευή ομάδων συσχετισμένων αφαιρέσεων ιεραρχία τύπων Επιτρέπει στους προγραμματιστές να δημιουργούν μια ιεραρχία τύπων στην οποία κάθε τύπος κληρονομεί ιδιότητες από τους τύπους που βρίσκονται ψηλότερα από αυτόν στην ιεραρχία
Αντικειμενοστραφής Προγραμματισμός Person TEI Person Student Undergr graduat
Αντικειμενοστραφής Προγραμματισμός TEIPerson class TEIPerson (Person): nextIdNum = 0 # αναγνωριστικός αριθμός def __init__(self,name): Person.__init__(self,name) TEIPerson self.idNum = TEIPerson.nextIdNum TEIPerson TEIPerson.nextIdNum+=1 def getIdNum(self): return self.idNum def __It__(self,other): return self.idNum < other.idNum
Αντικειμενοστραφής Προγραμματισμός class Student (TEIPerson): pass class Undergr(Student): def __init__(self, name, ClassYear): TEIPerson.__init__(self, name) self.year = clasYear def getClass(self): return self.year class Graduat(Student): pass
Αντικειμενοστραφής Προγραμματισμός
Αρχή αντικατάστασης Οι υποκλάσεις επεκτείνουν την συμπεριφορά των υπερκλάσεων τους Επιτυγχάνεται με την προσθήκη νέων ιδιοτήτων ή την υποσκέλιση ιδιοτήτων που κληρονομούνται από μια υπερκλάση
Αντικειμενοστραφής Προγραμματισμός class TransferStudent(Student): def __init__(self, name, fromschool): TEIPerson.__init__(self, name) self.fromschool = fromSchool def get0ldSchool(self): return self.fromschool
Αντικειμενοστραφής Προγραμματισμός UML & OOP διάγραμμα κλάσης Το διάγραμμα κλάσης είναι ένας γράφος που περιέχει διασυνδέσεις, πακέτα, σχέσεις & στιγμιότυπα (αντικείμενα, συνδέσμους) διάγραμμα αντικειμένων Το διάγραμμα αντικειμένων είναι ένας γράφος στιγμιότυπων (αντικειμένων, τιμών δεδομένων) διαγράμματα κλάσεων (Class diagrams) Τα διαγράμματα κλάσεων (Class diagrams) βοηθούν τον εντοπισμό των κυρίαρχων εννοιών και συνεπώς την κατανόηση του πεδίου εφαρμογής (πολύ βασικό στην αρχή ενός έργου)
Αντικειμενοστραφής Προγραμματισμός UML & OOP
Αντικειμενοστραφής Προγραμματισμός UML & OOP
Αντικειμενοστραφής Προγραμματισμός UML & OOP
Αντικειμενοστραφής Προγραμματισμός UML & OOP
Αντικειμενοστραφής Προγραμματισμός UML & OOP
Αντικειμενοστραφής Προγραμματισμός UML & OOP
Αντικειμενοστραφής Προγραμματισμός UML & OOP
Σας ευχαριστώ για την προσοχή σας…