Το θέμα της σημερινής διάλεξης ήταν development process με έμφαση στο System integration. Χρησιμοποιήσαμε πρώτα ως παράδειγμα για το system integration το πρόγραμμα ObjectState για να σχολιάσουμε μέσα από αυτό και τα παραδοτέα σας. Επαναλάβαμε σύντομα την διαδικασία αναγνώρισης αντικειμένων από την περιγραφή της άσκησης και πως αυτό μας οδηγεί στην δομή της εφαρμογής που την εκφράσαμε με το διάγραμμα κλάσεων. Αναθέσαμε αρμοδιότητες (responsibilities) στα αντικείμενα της εφαρμογής και περάσαμε στο system integration. Ορίσαμε έτσι της κλάση ObjectState. Στη συνέχεια περιγράψαμε την λειτουργικότητα της εφαρμογής χρησιμοποιώντας το sequence diagram. Σχεδιάσαμε βήμα-βήμα το διάγραμμα ακολουθίας (sequence diagram) που περιγράφει τον τρόπο που τα αντικείμενα της εφαρμογής συνεργάζονται (object collaboration) για να υλοποιήσουν την λειτουργικότητα που η εφαρμογή μας θέλουμε να υλοποιεί. Η παραγωγή του κώδικα με βάση τα δύο αυτά διαγράμματα είναι μηχανική δουλειά. Τονίσαμε ότι ο κώδικας θα πρέπει να είναι σύμφωνος με τα διαγράμματα όπως και τα δύο διαγράμματα θα πρέπει να είναι συμβατά μεταξύ τους.
Περάσαμε σε πιο συνθέτες αλληλεπιδράσεις αντικειμένων χρησιμοποιώντας την εργαστηριακή άσκηση RPN Calculator με συνιστώσες, την οποία θα δουλέψετε τις επόμενες 2 εβδομάδες. Είναι μια καλή άσκηση για εξάσκηση στην incremental development τεχνική που θα μας δώσει και την δυνατότητα να δούμε τις γραφικές διεπαφές. Σε πρώτη φάση θα δουλέψετε με μια γραφική διεπαφή που θα σας δώσουμε με την μορφή jar αρχείου. Σε επόμενο στάδιο θα αναπτύξετε την δική σας γραφική διεπαφή. Ξεκινήσαμε την διαδικασία ανάπτυξης αναγνωρίζοντας τα αντικείμενα με τα οποία θα συνθέσουμε την εφαρμογή μας και δημιουργήσαμε ένα πρώτο διάγραμμα κλάσεων. Τονίσαμε πως η γραφική διεπαφή δεν θα υλοποιεί καμιά λειτουργικότητα. Θα επιτρέπει απλά στον χρήστη να επικοινωνεί με τα αντικείμενα που απαρτίζουν την καρδιά της αριθμομηχανής. Αυτό μας μεταφέρει σε ένα άλλο παράδειγμα προγραμματισμού το event-driven. Πρέπει να ορίσουμε λειτουργικότητα για κάθε ένα συμβάν που θα κοινοποιείται στην αριθμομηχανή μέσα από την γραφική διεπαφή. Λειτουργικότητα για το πάτημα του πλήκτρου ψηφίου, το πάτημα του πλήκτρου ENTER, το πάτημα του πλήκτρου Backspace, το πάτημα του πλήκτρου +. Αυτό μας οδήγησε στην ανάθεση αρμοδιοτήτων στα αντικείμενα που απαρτίζουν την καρδία της αριθμομηχανής (engine της αριθμομηχανής την ονομάσαμε για να την διακρίνουμε από τα αντικείμενα της γραφικής διεπαφής). Οι αρμοδιότητες αυτές μας οδήγησαν στον ορισμό των υπογραφών των μεθόδων των κλάσεων. Εστιάσαμε στην αλληλεπίδραση της γραφικής διαπαφής με το στιγμιότυπο της Operand. Περιγράψαμε δύο εναλλακτικές υλοποιήσεις της Operand. Μία με μεταβλητή στιγμιοτύπου πρωτογενή τύπο int. Και μια με StringBuffer καθώς η String είναι immutable. Στα πλαίσια της εργαστηριακής άσκησης θα πρέπει να υλοποιήσετε και τις δύο επιλογές. Σε επόμενο βήμα μπορείτε να αναβαθμίσετε την αριθμομηχανή σας να υποστηρίζει αριθμούς κινητής υποδιαστολής. (αρχείο developmentProcess&systemIntegration)
Αναγνωρίσαμε στην συνέχεια την ύπαρξη σχέσης γενίκευσης/εξειδίκευσης (gen/spec) στις έννοιες του προβλήματος. Adder, Multiplier, κ.λ.π. είναι εξειδικεύσεις της έννοιας Τελεστής. Ορίσαμε έτσι την κλάση Operator και την καταγράψαμε στο διάγραμμα κλάσεων. Αναζητήσαμε κοινή δομή και συμπεριφορά που θα πρέπει να περιληφθεί σε αυτή. Παρατηρήσαμε πώς όλοι οι τελεστές έχουν μία μέθοδο με υπογραφή void operate(). Παρατηρήσαμε όμως ότι τα σώματα των μεθόδων είναι διαφορετικά. Άρα το κοινό είναι μόνο η υπογραφή της μεθόδου. Αυτήν περιλάβαμε στην κλάση Operator και αυτή ήταν η αφορμή να δώσουμε τον ορισμό της abstract μεθόδου και της abstract κλάσης. (αρχείο Ch7-Inheritance)
Ολοκληρώσαμε την σημερινή διάλεξη με μια πρώτη αναφορά σε Shadowed variables και την σημασία της λέξης κλειδί super.
Κάναμε μια σύντομη αναφορά στις abstract μεθόδους και abstract κλάσεις καθώς και τις επισκιαζόμενες μεταβλητές (shadowed variables) που είχαμε περιγράψει στην προηγούμενη συνάντηση μας, για να περάσουμε στις επικαλυπτόμενες μεθόδους (overriding methods). Δώσαμε ένα απλό αλλά πολύ καλό παράδειγμα που μας επιτρέπει να δούμε την διαφορετική αντιμετώπιση των data members απόγονης κλάσης που έχουν ίδιο όνομα με αυτών πρόγονης κλάσης από τις μεθόδους με το ίδιο όνομα.
Δώσαμε τον ορισμό της πολλαπλής κληρονομικότητας (multiple inheritance) και σημειώσαμε τα προβλήματα που αυτή μπορεί να δημιουργήσει (αρχείο Ch7-Inheritance_2). Προβλήματα που οδήγησαν τους σχεδιαστές της Java να μην υποστηρίξουν με την γλώσσα άμεσα την κληρονομικότητα όπως κάνει η C++. Για να αξιοποιηθούν όμως τα πλεονεκτήματα της πολλαπλής κληρονομικότητας επιλέχθηκε έμμεση υποστήριξη της με την κατασκευή του Interface. Ετσι μια κλάση μπορεί να κληρονομεί (extends) μία μόνο κλάση, αλλά μπορεί ταυτόχρονα να υλοποιεί (implements) ένα ή περισσότερα Interfaces. Αυτό επιτρέπει στα στιγμιότυπα της κλάσης να μπορούν να θεωρηθούν στιγμιότυπα όχι μόνο της πρόγονης κλάσης αλλά και όλων των Interfaces που αυτή υλοποιεί. Μπορούν με άλλα λόγια να φοράνε «διαφορετικά καπέλα».
Αφήσαμε την κατασκευή του Interface να την δούμε την επόμενη εβδομάδα και περάσαμε σε μια πολύ σημαντική ιδιότητα του OOP, στον πολυμορφισμό (Polymorphism). Χρησιμοποιήσαμε την WindowsApp ως μελέτη περίπτωσης για να δούμε την σημασία της ιδιότητας αυτής και των πλεονεκτημάτων που προσφέρει στην διαμόρφωση του πηγαίου κώδικα της εφαρμογής. Είδαμε τα προβλήματα που δημιουργεί στον κώδικα της WindowApp η μη αναγνώριση της σχέσης γενίκευσης/εξειδίκευσης που υπάρχει ανάμεσα στις βασικές έννοιες του προβλήματος. Αναγνωρίσαμε την γενική έννοια Shape της οποίας εξειδικεύσεις μπορούν να θεωρηθούν οι Circle, Rectangle και Triangle. Αναδομήσαμε τον κώδικα μας ώστε να ορίζει τις κλάσεις αυτές ως απογόνους της Shapes στην οποία βάλαμε τα κοινά χαρακτηριστικά τους. Αυτό μας οδήγησε στην διαπίστωση πως καθώς τα στιγμιότυπα τους μπορούν να θεωρηθούν στιγμιότυπα της Shape μπορούμε να τα βάζουμε όχι σε διαφορετικούς πίνακες /διαφορικές συλλογές (Collections) αλλά σε ένα πίνακα/συλλογή.
Είδαμε την ευελιξία που αυτό προσφέρει στον κώδικα μας, και δώσαμε τον ορισμό του πολυμορφισμού. Είδαμε πως η αξιοποίηση του εισάγει την έννοια του late binding (όψιμης διασύνδεσης) σε αντίθεση με την διασύνδεση που μέχρι τώρα είχαμε στον κώδικα μας, της java αλλά και της C, Εξηγήσαμε το late binding σε συνδυασμό με το early binding και αναφέραμε τις επιπτώσεις που αυτό έχει στο χρόνο εκτέλεσης.
Καθώς η WindowsApp μας επιτρέπει την αξιοποίηση του Iterator κάναμε μια σύντομη αναφορά σε αυτόν και δώσαμε παράδειγμα αξιοποίησης του με το for loop. Και με αφορμή αυτό δώσαμε κα μία πιο ευέλικτη μορφή του for loop το for-each loop. Αυτό αποτελεί ένα ακόμη βήμα αφαιρετικότητας που έδωσαν οι σχεδιαστές της γλώσσας για να την φέρουν πιο κοντά στην φυσική γλώσσα και να διευκολύνουν ακόμη περισσότερο την μετατροπή της λεκτικής περιγραφής σε γλώσσα πηγαίου κώδικα διεκολύνοντας έτσι το έργο του προγραμματιστή. Είπαμε πως το επόμενο βήμα το βλέπουμε ήδη μέσα από το ChatGPT το οποίο ξεπερνάει το επίπεδο της διευκόλυνσης και μας οδηγεί στην αφαίρεση της δραστηριότητας του προγραμματισμού από τον άνθρωπο με ότι συνέπειες αυτό μπορεί να έχει.
Αφήσαμε τις διαφάνειες για πακέτα (packets), προσδιοριστές ορατότητας μεταβλητών (visibility modifiers) και αρχικοποιήσεις μεταβλητών (field initialization) (αρχείο Ch5-PartC_1) για να δώσουμε λίγο χρόνο στην επίδειξη του Eclipse με την ανάπτυξη του project HandleShapes το οποίο αναπτύξαμε βήμα-βήμα μαζί (HandleShapes.rar).
Όλα αυτά έχετε την ευκαιρία να αξιοποιήσετε στην ανάπτυξη της δικής έκδοσης της WindowsApp και να υποβάλετε ένα αξιόλογο παραδοτέο.
Καλή σκ … και μην ξεχνάτε την ευχαρίστηση που θα έχετε όταν ο κώδικας σας δουλέψει !
RPN Calculator με συνιστώσες
H ΕΑ RPN Calculator με συνιστώσες - V2.0 αποτελείται από τρεις ασκήσεις. Τις δυο πρώτες μπορείτε να δουλέψετε στις διακοπές του Πάσχα. Την τρίτη θα δουλέψουμε μετά το Πάσχα οπότε θα δώσουμε και την θεματική ενότητα event handling. Για την εκτέλεση της άσκησης χρησιμοποιήστε τον πίνακα περιεχομένων που δίνεται στο pdf και μπορείτε να δείτε στα αριστερά του κειμένου.
Η ΕΑ RPN Calculator με συνιστώσες θα μας απασχολήσει τις επόμενες 2-3 εβδομάδες, καθώς εισάγει σύνθετες αλληλεπιδράσεις των συνιστωσών της, χρήση της κατασκευής του Interface, γραφικές διαπαφές και event-handling.
To chatGPT μπορεί ...τουλάχιστο το προσπαθεί ... εσείς;
https://sharegpt.com/c/V0I1WEz?fbclid=IwAR2DAzgxhUhEzZBGE0phLnx3Td_ZWHS3lXRtdaQRmuZaP9vg8aCeg_49nqU
1ο Παραδοτέο - WindowsApp
Αναρτήθηκε η περιγραφή του 1ου παραδοτέου που αφορά την Εργαστηριακή Άσκηση (ΕΑ) WindowsApp. Είναι το πρώτο επίσημο παραδοτέο που θα αξιολογηθεί.
Η ΕΑ παρουσιάστηκε στις 15/3, την δουλέψαμε στις διαλέξεις, στα φροντιστήρια και στο εργαστήριο. Είναι μια πλούσια άσκηση που σας επιτρέπει να χρησιμοποιήσετε, εκτός από τις πολύ βασικές έννοιες του OOP, κληρονομικότητα, πολυμορφισμό, τον τύπο του πίνακα, abstract μεθόδους και abstract κλάσεις, τις utility κλάσεις Vector, ArrayList, LinkedList, τον Iterator, το for-each loop.
Τα όποια σχόλια, παρατηρήσεις, ερωτήσεις παρακαλώ σε αυτόν τον χώρο ως σχόλα στην ανάρτηση αυτή. Σίγουρα αφορούν και τους συμφοιτητές σας.