Για εξάσκηση σας στην εφαρμογή της αφαιρετικότητας (procedural and data) κατά την διαδικασία ανάπτυξης προγράμματος/εφαρμογής κάντε μια προσπάθεια να αξιοποιήσετε τις τεχνικές αυτές αντιμετώπισης της πολυπλοκότητας:
α) στην άσκηση RPN Calculator, κάτι που ξεκινήσαμε και δουλέψαμε στην 1η διάλεξη και
β) στη συνέχεια στο LibraryAnOTcaseStudy.
H άσκηση RPN Calculator
Να αναπτυχθεί ένα πρόγραμμα σύμφωνα με το οποίο το σύστημα θα εκτελεί τις τέσσερις βασικές πράξεις ακολουθώντας την αντίστροφη Πολωνική σημειογραφία. Την άσκηση χρησιμοποιεί ως παράδειγμα για την C το βιβλίο των B. Kernighan και D. Ritchie.
Η αντίστροφη Πολωνική σημειογραφία είναι η μεταθεματική σημειογραφία (postifx notation). Σύμφωνα με αυτή μια έκφραση της ενθεματικής (infix) σημειογραφίας σαν την
(3 + 6 ) * (8 – 6)
παρουσιάζεται με την παρακάτω μορφή
3 6 + 8 6 - *
Παρατηρήστε πως αν γνωρίζουμε τον αριθμό των τελεστέων πάνω στους οποίους ενεργεί ο κάθε τελεστής δεν απαιτούνται παρενθέσεις για την δημιουργία της έκφρασης.
Περιορισμός σχεδιασμού: Να χρησιμοποιηθεί η έννοια της στοίβας (stack) για την αποθήκευση των τελεστέων.
Η διαφάνεια 40 με τίτλο «2nd iteration - Increase modularity» του αρχείου με URI (https://eclass.upatras.gr/.../LegoApproach5_5%20partOf.pdf) έχει στόχο την αύξηση του modularity του κώδικα που αναπτύχθηκε στα πλαίσια του 1ου iteration.
Επιλέξαμε το παρακάτω τμήμα τους κώδικα της main που υλοποιεί μια συγκεκριμένη λειτουργικότητα (functionality) με στόχο την αναζήτηση εναλλακτικών υλοποιήσεων που θα μας επιτρέπουν την επαναχρησιμοποίηση (reuse) της λειτουργικότητας αυτής.
Για κάθε μία πρόταση υλοποίησης περιγράψτε με λόγια την προτεινόμενη υλοποίηση και τον τρόπο που η λειτουργικότητα αυτή μπορεί να αξιοποιηθεί στα πλαίσια της main().
Στόχος της άσκησης αυτής είναι η καταγραφή των εναλλακτικών προτάσεων υλοποίησης.
Η άσκηση αφορά την 1η φάση της Δραστηριότητας 4.
Σε αυτήν συμμετέχουν (προαιρετικά) μόνο όσοι:
Α) έχουν επιτυχώς και με ευκολία ολοκληρώσει τα βασικά iterations της δραστηριότητας 3, και
Β) έχουν την άνεση και τις γνώσεις να προχωρήσουν σε αυτό παρά το γεγονός ότι απαιτεί και γνώσεις που δεν έχουμε καλύψει στο μάθημα.
Το παραδοτέο της φάσης αυτής περιγράφεται στο αρχείο OT_Project2020-21_ActivityNo4.
Περιγραφή παραδοτέου
Η άσκηση είναι προαιρετική και αφορά μόνο όσους εκτιμούν πως ανήκουν (ή μπορούν να “παίξουν”) στην κατηγορία αυτών στους οποίους απευθύνεται η 1η φάση.
Στα πλαίσια της 1ης Φάσης εκτέλεσης της Δραστηριότητας 4 και πιο συγκεκριμένα του iteration 2, σας ζητείται να παραδώσετε μια αναφορά που θα περιλαμβάνει μια λίστα από μία ή περισσότερες κακές πρακτικές που εσείς εντοπίσατε στον πηγαίο
κώδικα της γραφικής διεπαφής που σας δόθηκε.
Για κάθε μία κακή πρακτική δώστε την περιγραφή της και το αντίστοιχο τμήμα κώδικα και από κάτω την πρόταση σας για βελτίωση του κώδικα.
Στην αρχή της αναφοράς δώστε τον αριθμό των κακών πρακτικών που εντοπίσατε, χωρίς αυτό να σημαίνει πως είναι για εσάς μόνο αυτές οι κακές πρακτικές.
Αριθμός κακών πρακτικών που καταγράφονται στο παραδοτέο:
Αριθμός κακών πρακτικών για τις οποίες προτείνονται προτάσεις βελτίωσης:
Για κάθε μία από τις κακές πρακτικές δώστε Περιγραφή Κακής Πρακτικής (ΠΚΠ)
και Κώδικα Πρότασης Βελτίωσης (ΚΠΒ).
ΠΚΠ #1
ΚΠΒ #1
ΠΚΠ #2
ΚΠΒ #2
…
ΠΚΠ #n
ΚΠΒ #n
Library Case Study
Δώστε τις βασικές κλάσεις (με data members and methods) που πρέπει να έχει το σύστημα σας για να υποστηρίζει την λειτουργικότητα της δανειστική βιβλιοθήκη όπως περιγράφεται στο LibraryAnOTcaseStudy.
To LibraryAnOTcaseStudy το είδαμε και στην άσκηση Νο 1.
Δώστε το UML διάγραμμα κλάσεων.
Αναπτύξτε ένα πρόγραμμα ObjectState σύμφωνα με το οποίο το σύστημα θα δημιουργεί ένα αντικείμενο obj1 που θα έχει 2 καταστάσεις: ΟΝ και OFF. Η αρχική κατάσταση του obj1 την στιγμή της δημιουργίας του είναι OFF.
Στη συνέχεια το σύστημα θα δημιουργεί ένα άλλο αντικείμενο obj2 και θα του στέλνει το μήνυμα press.
Η συμπεριφορά του obj2 στο μήνυμα press περιγράφεται στη συνέχεια
Α) ζητάει από το obj1 να τυπώσει την κατάσταση του.
Β) ζητάει από το obj1 να αλλάξει την κατάσταση του σε ΟΝ.
Γ) ζητάει από το obj1 να τυπώσει την κατάσταση του.
Δ) ζητάει από το obj1 να αλλάξει την κατάσταση του σε OFF.
ΣΤ) ενημερώνει τον χρήστη πως η συμπεριφορά στο μήνυμα press ολοκληρώθηκε επιτυχώς.
Τέλος το σύστημα ενημερώνει τον χρήστη πως η εκτέλεση του προγράμματος ΟbjectState ολοκληρώθηκε.
2. Δώστε ένα πρόχειρο διάγραμμα κλάσεων.
3. Χρησιμοποιήστε την κατασκευή του interface για να τροποποιήσετε το πρόγραμμα σας ώστε η υλοποίηση του obj2 να είναι πιο ανεξάρτητη από αυτή του obj1.
Η άσκηση έχει στόχο την εξοικείωση σας με το διάγραμμα κλάσεων ως εργαλείο για τον ορισμό της δομής μιας κατασκευής σας. Στην συγκεκριμένη περίπτωση η κατασκευή σας είναι η γραφική διεπαφή της RPN Calculator την οποία καλείστε να ορίσετε στα πλαίσια της δραστηριότητας 5 – iteration No 1.
Με την άσκηση αυτή έχετε τη δυνατότητα να αναρτήσετε με σχόλιο στην ανάρτηση αυτή το UML διάγραμμα (ή μέρος του) για το οποίο θέλετε να πάρετε τα σχόλια των συμφοιτητών σας (και τα δικά μας) οι οποίοι καλούνται να απαντήσουν στις ερωτήσεις σας αν υπάρχουν ή και να το σχολιάσουν.
Αναπτύξτε ένα πρόγραμμα σε Java με δεδομένη την έξοδο του.
Στο 1ο iteration θέλουμε να έχει την παρακάτω έξοδο.
Program ExceptionHandlingTestApp running instance of ObjectA just created instance of ExceptionHandlingTestApp just created method1 of ExceptionHandlingTestApp executedmethod2 of ObjectA executedProgram ExceptionHandlingTestApp terminated
Στο 2ο iteration θέλουμε να έχει την παρακάτω έξοδο.
Program ExceptionHandlingTestApp running instance of ObjectA just created instance of ExceptionHandlingTestApp just created method1 of ExceptionHandlingTestApp executedmethod2 of ObjectA executedMyException was identified in method2MyException was caught in method1 of ExceptionHandlingTestAppMyException: Exception of ExceptionHandlingTestApp at ObjectA.method2(ObjectA.java:13) at ExceptionHandlingTestApp.method1(ExceptionHandlingTestApp.java:25) at ExceptionHandlingTestApp.main(ExceptionHandlingTestApp.java:17)Program ExceptionHandlingTestApp terminatedΣτο 3ο iteration θέλουμε να έχει την παρακάτω έξοδο.
Program ExceptionHandlingTestApp running instance of ObjectA just created instance of ExceptionHandlingTestApp just created method1 of ExceptionHandlingTestApp executedmethod2 of ObjectA executedMyException was identified in method2MyException was caught in method1 of ExceptionHandlingTestAppMyException: Exception of ExceptionHandlingTestApp at ObjectA.method2(ObjectA.java:13) at ExceptionHandlingTestApp.method1(ExceptionHandlingTestApp.java:25) at ExceptionHandlingTestApp.main(ExceptionHandlingTestApp.java:17)Program ExceptionHandlingTestApp terminatedΣτο 4ο iteration θέλουμε να έχει την παρακάτω έξοδο.
Program ExceptionHandlingTestApp running instance of ObjectA just created instance of ExceptionHandlingTestApp just created method1 of ExceptionHandlingTestApp executedmethod2 of ObjectA executedMyException was identified in method2Exception in thread "main" MyException: Exception of ExceptionHandlingTestApp at ObjectA.method2(ObjectA.java:13) at ExceptionHandlingTestApp.method1(ExceptionHandlingTestApp.java:25) at ExceptionHandlingTestApp.main(ExceptionHandlingTestApp.java:17)