ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ



Σχετικά έγγραφα
Αντικειμενοστρεφής Προγραμματισμός

Εργαστήριο Τεχνολογίας Λογισμικού και Ανάλυσης Συστημάτων

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΑΝΑΛΥΣΗ Διαγράμματα Συνεργασίας. Ιωάννης Σταμέλος Βάιος Κολοφωτιάς Πληροφορική

Εργαστήριο Τεχνολογίας Λογισμικού και Ανάλυσης Συστημάτων - 4 ο Εργαστήριο -

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

ΕΡΓΑΣΙΕΣ ΟΝΤΟΚΕΝΤΡΙΚΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Διάγραμμα Κλάσεων. Class Diagram

Μοντελοποίηση Συστημάτων

Ηλεκτρονικό Κατάστημα

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Τ.Ε.Ι. Μεσολογγίου, Τµήµα τηλεπικοινωνιακών Συστημάτων & Δικτύων

MySQL + Γλώσσα Προγραμματισμού. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Αντικειμενοστρεφής Προγραμματισμός

Βασικά Στοιχεία της Java

3 Αλληλεπίδραση Αντικειμένων

Κλάσεις και Αντικείµενα

Περιγραφή της εργασίας

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

4 Συλλογές Αντικειμένων

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΕΞΑΙΡΕΣΕΙΣ ΚΑΙ Ο ΧΕΙΡΙΣΜΟΣ ΤΟΥΣ

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ Π ΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ Π ΕΡΙΒΑΛΛΟΝ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΔΥΤΙΚΗΣ ΜΑΚΕΔΟΝΙΑΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ

Οδηγίες Χρήσης της MySQL

Εισαγωγή στην εφαρμογή Βασική Σελίδα (Activity) Αναζήτηση Πελάτη... 6 Προβολή Πελάτη... 7 Επεξεργασία Πελάτη... 10

Από τη UML στον Κώδικα. Μέρος Α

Βασικά Στοιχεία της Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Εφαρμογή Μεθοδολογίας ICONIX

Η κατασκευή αντικειμένων της κλάσης Student μπορεί να πραγματοποιηθεί είτε στη main είτε σε οποιαδήποτε μέθοδο κλάσης:

Δομές ελέγχου ροής προγράμματος

Εργαστήριο 1-1 η Άσκηση - Ανάλυση

Σενάριο Χρήσης myschool

Αντικειµενοστρεφής Προγραµµατισµός

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων Παράδειγμα: Τμήμα πανεπιστημίου

Αντικειμενοστρεφής Προγραμματισμός

ΚΕΦΑΛΑΙΟ 2ο ΠΡΟΣΟΜΟΙΩΣΗ ΔΙΑΚΡΙΤΩΝ ΓΕΓΟΝΟΤΩΝ

Μιχάλης Μασούρας Επιβλέπων Καθηγητής: Ιγνάτιος Δεληγιάννης

Μοντελοποίηση Συστημάτων

Ανάπτυξη συστήματος λογισμικού βάσει της μεθοδολογίας ICONIX

Μ.Π.Σ. «ΠΡΟΗΓΜΕΝΕΣ ΜΕΘΟΔΟΙ ΚΑΤΑΣΚΕΥΗΣ ΠΡΟΙΟΝΤΩΝ ΑΠΟ ΞΥΛΟ» Μάθημα: Σχεδίαση και Εφαρμογές Διαδραστικών Συστημάτων. Διδάσκοντας: Α.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα

Οδηγίες Χρήσης της MySQL

Διαγράμματα UML στην Ανάλυση. Μέρος Γ Διαγράμματα Επικοινωνίας Διαγράμματα Ακολουθίας Διαγράμματα Μηχανής Καταστάσεων

Οντοκεντρικός Προγραμματισμός

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης

Κεφάλαιο 1. Νήματα (Threads). Time Sharing

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 12: Ροές και είσοδος/έξοδος αρχείων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

Διδάσκων: Παναγιώτης Ανδρέου

Αντικειμενοστρεφής Προγραμματισμός

Εργαστήριο «Τεχνολογία Πολιτισμικού Λογισμικού» Ενότητα. Επεξεργασία πινάκων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

ΠΑ-24γ Εγχειρίδιο Χρήσης Δ.Δ.Π. Του Δήμου Αιγάλεω

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπερφόρτωση Αντικείμενα σαν ορίσματα

Ανάλυση Πληροφοριακών Συστημάτων. Εαρινό Εξάμηνο Lec08 09/04/2019 Διδάσκων: Γεώργιος Χρ. Μακρής

Ανάλυση Πληροφοριακών Συστημάτων. «Βασικές Έννοιες Αντικειμενοστρεφούς Προγραμματισμού Διαγράμματα κλάσεων» Βασίλειος Καρακόιδας

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #15

Κατανεμημένα Συστήματα

Μέθοδοι. Υποσυστήµατα και πακέτα. Μοντέλα αντικειµενοστραφούς σχεδίασης. Αντικειµενοστραφής Σχεδίαση. Στα πρώτα στάδια της ανάλυσης

Γενικά (για τις γραπτές εξετάσεις)

Προγραμματιστικές Ασκήσεις, Φυλλάδιο 1

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Αριστείδης Παλιούρας Ανακαλύψτε το Scratch 2

περιεχόμενα παρουσίασης Actors Σενάρια Περιεχόμενο περιπτώσεων χρήσης Πρότυπα περιπτώσεων χρήσης Διαγράμματα περιπτώσεων χρήσης

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

ΕΠΛ233 Βιβλιοθήκες και Προσδιοριστές Πρόσβασης στην JAVA

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΑΝΑΛΥΣΗ Επιχειρηματική Μοντελοποίηση. Ιωάννης Σταμέλος Βάιος Κολοφωτιάς Πληροφορική

Τμήμα Μηχανικών Η/Υ Τηλεπικοινωνιών & Δικτύων,

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Διαδικτυακό Περιβάλλον Διαχείρισης Ασκήσεων Προγραμματισμού

Διαχείριση Πάγιου Ενεργητικού

Εγχειρίδιο Χρήσης Εφαρμογής Συστήματος Διαχείρισης Λογισμικού

5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ

Ειδικά Θέματα Προγραμματισμού

Wrapper Classes, Abstract Classes and Interfaces

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #13

Εργαστήριο Τεχνολογίας Λογισμικού και Ανάλυσης Συστημάτων - 8 ο & 9 ο Εργαστήριο -

Οντοκεντρικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Διαγράμματα Κλάσεων στη Σχεδίαση

Ανάλυση Περιπτώσεων Χρήσης

παράδοση έως: Παρασκευή 11 Ιανουαρίου 2019

ΑΝΑΛΥΣΗ ΑΠΑΙΤΗΣΕΩΝ ανάλυση απαιτήσεων Σε αυτό το μάθημα θα ασχοληθούμε με : Δημιουργία μοντέλων

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Υπολογισμός Φορολογικής Αναμόρφωσης

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

Transcript:

Θ.Ε. ΠΛΗ24 ΑΚΑΔ. ΕΤΟΣ 2008-2009 ΤΡΙΤΗ ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΕΙΣΑΓΩΓΗ Σας ζητείται να αναπτύξετε λογισμικό ελέγχου για τον Πίνακα Αναχωρήσεων ενός αεροδρομίου ακολουθώντας τη διεργασία ανάπτυξης λογισμικού ICONIX. Η πληροφορία ενημέρωσης των επιβατών που θα διαθέτει ο Πίνακας Αναχωρήσεων αποτυπώνεται ενδεικτικά στην παρακάτω εικόνα. Νο Α1 Α2 Περιγραφή μη λειτουργικής απαίτησης Αποθήκευση προγραμματισμένων αναχωρήσεων Οι προγραμματισμένες αναχωρήσεις (δηλαδή αυτές που ανακοινώνονται στο πρόγραμμα πτήσεων ενός αερομεταφορέα) αποθηκεύονται σε βάση δεδομένων (ΒΔ). Για κάθε πτήση αποθηκεύονται εκείνα τα πεδία που είναι απαραίτητα ώστε να είναι δυνατή η ορθή διαχείριση του Πίνακα Αναχωρήσεων και η λειτουργία του προγράμματος. Περιορισμοί πτήσεων Κάθε πτήση μπορεί να βρίσκεται σε μια από τις ακόλουθες καταστάσεις: OnTime (δηλαδή πρόκειται να αναχωρήσει σύμφωνα με τον προγραμματισμό συνήθως εμφανίζεται με πράσινο χρώμα), Delayed (σημειώνει καθυστέρηση ή αναβολή συνήθως εμφανίζεται με πορτοκαλί χρώμα και αναγράφεται η νέα ώρα αναχώρησης), Cancelled (ακυρώθηκε, δε θα πραγματοποιηθεί οριστικά συνήθως εμφανίζεται με κόκκινο χρώμα), Boarding (οι επιβάτες επιβιβάζονται συνήθως η λέξη αναβοσβήνει), Departed (έχει αναχωρήσει συνήθως εμφανίζεται με λευκό χρώμα). Μισή ώρα πριν την προγραμματισμένη αναχώρηση, μια πτήση μεταβαίνει στην κατάσταση Boarding. Για τις καθυστερημένες πτήσεις, ως χρόνος προγραμματισμένης αναχώρησης θεωρείται ο νέος χρόνος μετά τον υπολογισμό της καθυστέρησης (ο οποίος μπορεί να αλλάξει περισσότερες από μια φορές) και όχι ο αρχικός. Από τη στιγμή που θα βρεθεί σε κατάσταση επιβίβασης, η πτήση επιτρέπεται μόνο να αναχωρήσει ή να ακυρωθεί. Μια καθυστερημένη πτήση δεν 1

Α3 Α4 επιστρέφει σε κατάσταση OnTime, αλλά μπορεί να πραγματοποιηθεί (αφού περάσει από κατάσταση επιβίβασης, σύμφωνα με τα ανωτέρω αναφερόμενα) ή να ακυρωθεί (είτε περνώντας από κατάσταση επιβίβασης είτε όχι). Μακροσκοπικά, η πιθανότητα μια πτήση να αναχωρήσει στην ώρα της έχει συγκεκριμένη τιμή (ενδεικτική τιμή 85%), η πιθανότητα καθυστέρησης είναι μικρότερη από 5% (ενδεικτική τιμή 4%) και η πιθανότητα ακύρωσης της πτήσης είναι 1% αν δεν έχει αλλάξει η ώρα αναχώρησης και 3% αν σημειώθηκε καθυστέρηση. Το διάστημα κατά το οποίο αναβάλλεται μια πτήση δε μπορεί να είναι μικρότερο των 30 λεπτών και μεγαλύτερο των 110 λεπτών (εάν στο διάστημα αυτό υπάρχει και άλλη προγραμματισμένη πτήση του ίδιου αερομεταφορέα προς τον ίδιο προορισμό, η πρώτη πτήση ακυρώνεται). Η ακριβής καθυστέρηση θα υπολογίζεται με τυχαίο τρόπο. Το αεροδρόμιο λειτουργεί κατά τις ώρες 05:00 01:00. Θεωρούμε ότι ποτέ δεν είναι δυνατό να αναχωρούν περισσότερες από δύο πτήσεις την ίδια ακριβώς χρονική στιγμή (το αεροδρόμιο διαθέτει μόνο δύο αεροδιαδρόμους). Επίσης, θεωρούμε ότι ανάμεσα σε δύο διαδοχικές αναχωρήσεις πρέπει να παρεμβάλλεται χρόνος τουλάχιστον τριών λεπτών. Συνεπώς από την έναρξη λειτουργίας του αεροδρομίου το πρωί (ώρα 5.00), όλες οι πτήσεις προγραμματίζονται σε χρονικές θυρίδες (time slots) που είναι πολλαπλάσια των 3 λεπτών (π.χ. 5:03, 8:09 κλπ). Δεν είναι φυσιολογικό να καλύπτονται όλες οι διαθέσιμες θυρίδες, καθώς το αεροδρόμιο (αλλά όχι η ζητούμενη εφαρμογή) θα πρέπει να δίνει θυρίδες και στις αφικνούμενες πτήσεις. Κάθε αερομεταφορέας είναι υπεύθυνος για τη διαχείριση των πτήσεών του. Ο Πίνακας Αναχωρήσεων είναι κοινός. Περιορισμοί Πίνακα Αναχωρήσεων Ο Πίνακας Αναχωρήσεων διαθέτει μόνο δέκα γραμμές, στις οποίες προβάλλονται οι λεπτομέρειες των άμεσα προγραμματισμένων πτήσεων σε σχέση με την τρέχουσα χρονική στιγμή, αλλά και οι πτήσεις που έχουν αναχωρήσει κατά την τελευταία ώρα ή ακυρωθεί κατά τις τελευταίες έξι ώρες. Εάν ο αριθμός των πτήσεων που έχουν αναχωρήσει είναι μεγάλος, προβάλλονται το πολύ οι δύο πιο πρόσφατες. Εάν ο αριθμός των ακυρωμένων πτήσεων είναι μεγάλος, προβάλλονται το πολύ οι τρεις πιο πρόσφατα ακυρωμένες, με βάση την τελευταία προγραμματισμένη ώρα αναχώρησης (δηλαδή, μια πτήση μπορεί αρχικά να εμφανίσει καθυστέρηση, οπότε προγραμματίζεται σε μια νέα χρονοθυρίδα, και μετά να ακυρωθεί). Σε κάθε γραμμή του Πίνακα Αναχωρήσεων προβάλλονται πληροφορίες για μια μόνο πτήση και μάλιστα μόνο όσες είναι απαραίτητες (άρα κάποια πεδία μπορεί να είναι κενά). Η κατάσταση μιας πτήσης εμφανίζεται με αντίστοιχη ένδειξη. Στη στήλη Via εμφανίζεται ο ενδιάμεσος σταθμός (αν υπάρχει) και στη στήλη Expected Departure εμφανίζεται η αναμενόμενη ώρα αναχώρησης, αν αυτή έχει αλλάξει. Τέλος, στη στήλη Scheduled Departure εμφανίζεται η αρχικά προγραμματισμένη ώρα αναχώρησης για όλες τις πτήσεις του πίνακα. Καταγραφή αρχείου κατάστασης πτήσεων Για κάθε ημέρα λειτουργίας, δημιουργείται ένα αρχείο, στο οποίο καταγράφεται το ιστορικό κάθε πτήσης, ως εξής: Αρχικά για κάθε πτήση καταγράφεται ο αριθμός της, ο αερομεταφορέας, ο τελικός προορισμός (και ο ενδιάμεσος, αν υπάρχει με τη λέξη via) και η αρχικά προγραμματισμένη ώρα αναχώρησης. Στη συνέχεια, για κάθε μεταβολή, αναγράφεται η λέξη status: και ακολουθεί 2

περιγραφή και χρόνος της μεταβολής (δεν καταγράφονται οι καταστάσεις OnTime και Boarding). Παραδείγματα καταγραφών στο αρχείο είναι: status: Departed 13:30, status: Delayed 09:03, status: Cancelled 17:21, Σε μια πτήση μπορεί να καταγραφούν περισσότερες από μια μεταβολές (π.χ. αν αναβληθεί περισσότερες από μία φορές ή αν αρχικά αναβληθεί και μετά ακυρωθεί). Υποδείξεις: 1. Όταν ξεκινά η εφαρμογή θα πρέπει να διαβάζονται αυτόματα όλες οι πληροφορίες των προγραμματισμένων αναχωρήσεων από τη ΒΔ και, για όσες είναι απαραίτητο, να δημιουργούνται τα κατάλληλα αντικείμενα 2. Τα στοιχεία όλων των πτήσεων διατηρούνται σε κατάλληλη δομή δεδομένων, όπου οι πτήσεις είναι ταξινομημένες με σειρά αναχώρησης. Η δομή αυτή είναι κοινή για όλους τους αερομεταφορείς. 3. Η διαχείριση των πτήσεων γίνεται από τους αερομεταφορείς, συνεπώς θα πρέπει να δηιουργήσετε παράλληλα νήματα ελέγχου (threads) ανά αερομεταφορέα. Αν και υπάρχουν περισσότερες από μία λύσεις διαχείρισης των πτήσεων, που πληρούν τις απαιτήσεις του προβλήματος, στη συνέχεια υποδεικνύεται μία τέτοια δυνατότητα. Κάθε thread θα πέφτει σε ύπνωση για 0,5 sec (Thread.sleep(500)), προσομοιώνοντας έτσι μία χρονική θυρίδα τριών λεπτών. Έτσι, σε κάθε thread προσομοιώνεται η παρέλευση του χρόνου από τις 05:00 το πρωί και κάθε φορά που ένα thread γίνεται εκτελέσιμο αποφασίζονται οι νέες κατάστασεις για όλες τις πτήσεις του αερομεταφορέα, που έχουν προγραμματισμένη μεταβολή μέσα στην αντίστοιχη χρονική θυρίδα. Για κάθε αλλαγή που αποφασίζεται, θα ενημερώνονται τα στοιχεία της πτήσης στη δομή δεδομένων με τις πτήσεις σε σειρά αναχώρησης. Ο Πίνακας Αναχωρήσεων θα ενημερώνεται από ένα επιπλέον thread, που επίσης πέφτει σε ύπνωση για 0,5 sec, αλλά όταν επανέρχεται θα γίνονται οι απαραίτητες αλλαγές στα στοιχεία των πτήσεων, που εμφανίζονται σε αυτόν. 4. Προσέξτε τους περιορισμούς στον χρονοπρογραμματισμό των πτήσεων που αναβάλλονται. Χρησιμοποιήστε γεννήτρια τυχαίων αριθμών για την αρχική κατανομή των χρόνων και την κατανομή των καθυστερήσεων. Περίπτωση Χρήσης: Ενημέρωση του Πίνακα Αναχωρήσεων (GUI) Κύριος Χειριστής: Αερομεταφορέας (thread) Σύντομη περιγραφή: Η ΠΧ αφορά την ενημέρωση του Πίνακα Αναχωρήσεων για μία μεταβολή στην κατάσταση πτήσης του Αερομεταφορέα Κύριο Σενάριο (ή Βασική Ροή): 1. Για κάθε αλλαγή κατάστασης σε πτήση, εντοπίζεται η γραμμή του Πίνακα για την πτήση που μεταβάλλεται η κατάστασή της. 2. Αν η κατάσταση μεταβάλλεται σε Boarding, τότε ενημερώνεται η ένδειξη στη στήλη Remarks της γραμμής. Αν η κατάσταση γίνεται Delayed, τότε εκετελείται η Εναλλακτική Ροή 1. Αν η κατάσταση γίνεται Cancelled, τότε εκτελείται η Εναλλακτική Ροή 2. 3. Όταν η κατάσταση μεταβάλλεται σε Departed, εντοπίζονται όλες οι πτήσεις που εμφανίζονται στον Πίνακα με ένδειξη Departed. 3

4. Αλλάζει η ένδειξη Remarks της πτήσης σε Departed και σβήνει η ένδειξη Expected Departure (αν υπάρχει). 5. Η ενημερωμένη γραμμή συμπεριλαμβάνεται στο ανανεωμένο σύνολο των πτήσεων του Πίνακα με ένδειξη Departed. 6. Αν υπάρχουν μεταβολές κατάστασης για τις οποίες δεν έχει ενημερωθεί ο πίνακας ο έλεγχος μεταφέρεται στο βήμα 1. 7. Οι προγραμματισμένες πτήσεις του Πίνακα, μαζί με το σύνολο των πτήσεων Departed και το σύνολο των πτήσεων Cancelled επανεμφανίζονται στον Πίνακα, ταξινομημένες ως προς την (προγραμματισμένη) ώρα αναχώρησης. 8. Τέλος Π.Χ. Εναλλακτικές Ροές: 1η Εναλλακτική ροή: Καθυστέρηση πτήσης 1. Η κατάσταση της πτήσης έχει μεταβληθεί σε Delayed. 2. Αλλάζει η ένδειξη Expected Departure της πτήσης, ώστε να απεικονίζει την προγραμματισμένη ώρα αναχώρησης που συμπεριλαμβάνει την καθυστέρηση. 3. Αλλάζει η ένδειξη Remarks της πτήσης σε Delayed. 4. Ο έλεγχος επιστρέφει στο βήμα 6 της βασικής ροής. η 2 Εναλλακτική ροή: Ακύρωση πτήσης 1. Η κατάσταση της πτήσης έχει μεταβληθεί σε Canceled. 2. Eντοπίζονται όλες οι πτήσεις που εμφανίζονται στον Πίνακα με ένδειξη Canceled. 3. Αλλάζει η ένδειξη Remarks της πτήσης σε Canceled. 4. Η ενημερωμένη γραμμή συμπεριλαμβάνεται στο ανανεωμένο σύνολο των πτήσεων του Πίνακα με ένδειξη Canceled. 5. Ο έλεγχος επιστρέφει στο βήμα 6 της βασικής ροής. Προϋποθέσεις: Οι πτήσεις όλων των αερομεταφορέων εμφανίζονται στον Πίνακα Αναχωρήσεων με χρονική σειρά ως προς την ώρα αναχώρησης. Υπάρχει τουλάχιστο μία πτήση με μεταβολή κατάστασης που δεν έχει εμφανιστεί στον Πίνακα Αναχωρήσεων. Κατάσταση εξόδου: Οι πτήσεις όλων των αερομεταφορέων εμφανίζονται στον Πίνακα Αναχωρήσεων με χρονική σειρά ως προς την ώρα αναχώρησης. Όλες οι πτήσεις βρίσκονται στην κατάσταση που τις εμφανίζει ο Πίνακας. Ειδικές απαιτήσεις: Όχι 4

Περίπτωση Χρήσης: Αλλαγή Κατάστασης Πτήσης Κύριος Χειριστής: Αερομεταφορέας (thread) Σύντομη περιγραφή: Η ΠΧ αφορά στις μεταβολές κατάστασης μιας πτήσης Κύριο Σενάριο (ή Βασική Ροή): 1. Το σύστημα ανακαλεί την πτήση 2. Γίνεται καταγραφή των στοιχείων της στο αρχείο κατάστασης πτήσεων 3. Ενημερώνεται ο Πίνακας Αναχωρήσεων 4. Αν δεν υπάρχει πρόβλημα, η κατάσταση της πτήσης αλλάζει σε Boarding. Αλλιώς, εάν υπάρχει καθυστέρηση, εκτελείται η Εναλλακτική Ροή 1. Αλλιώς, εάν η πτήση αναβάλλεται, εκτελείται η Εναλλακτική Ροή 2. 5. Αν δεν εμφανιστεί πρόβλημα, η κατάσταση της πτήσης αλλάζει από Boarding σε Departed. Αλλιώς, εάν η πτήση αναβληθεί, τότε εκτελείται η Εναλλακτική Ροή 2. 6. Γίνεται καταγραφή της μεταβολής στο αρχείο κατάστασης πτήσεων. Εναλλακτικές Ροές: 1η Εναλλακτική ροή: Καθυστέρηση πτήσης 1. Η κατάσταση της πτήσης αλλάζει σε Delayed. 2. Το σύστημα επιλέγει το χρονικό διάστημα της καθυστέρησης και η πτήση προγραμματίζεται ξανά 3. Γίνεται καταγραφή της μεταβολής στο αρχείο κατάστασης πτήσεων. 4. Ο έλεγχος επιστρέφει στο βήμα 4 της βασικής ροής 2η Εναλλακτική ροή: Ακύρωση πτήσης 1. Η κατάσταση της πτήσης αλλάζει σε Cancelled. 2. Ο έλεγχος επιστρέφει στο βήμα 7 της βασικής ροής Προϋποθέσεις: Η πτήση βρίσκεται αρχικά σε κατάσταση OnTime. Κατάσταση εξόδου: Οι μεταβολές καταγράφηκαν στο αρχείο κατάστασης πτήσεων. Ειδικές απαιτήσεις: Όχι ΕΡΩΤΗΣΗ 1 5

Με βάση τις μη λειτουργικές απαιτήσεις και την περιγραφή των ΠΧ, να σχεδιάσετε το διάγραμμα περιπτώσεων χρήσης του συστήματος, να καταγράψετε τους χειριστές και να συσχετίσετε βήματα των περιγραφών των ΠΧ με την οθόνη διεπαφής (τον Πίνακα Αναχωρήσεων). Προσέξτε να μην υπερβείτε τα όσα αναφέρονται στις απαιτήσεις και τις ΠΧ. ΑΠΑΝΤΗΣΗ 1 1α. To διάγραμμα περιπτώσεων χρήσης του συστήματος Οι αναφερόμενες Π.Χ. και οι μη λειτουργικές απαιτήσεις εισάγουν δύο Π.Χ., δηλαδή αυτή της Αλλαγής Κατάστασης και της Ενημέρωσης του Πίνακα Αναχωρήσεων. Η πρώτη σχετίζεται με τη δεύτερη με τη σχέση «include», αφού κάθε αλλαγή κατάστασης περιλαμβάνει και την ενημέρωση της αντίστοιχης ένδειξης του Πίνακα Αναχωρήσεων. Ως μοναδικός χειριστής αναγνωρίζεται το FlightCompany (Αερομεταφορέας), που ρητά αναφέρεται ότι είναι υπεύθυνος για κάθε αλλαγή κατάστασης σε πτήση του Πίνακα Αναχωρήσεων. 1β. Συσχέτιση των Π.Χ. με την οθόνη διεπαφής Ο χειριστής FlightCompany αλληλεπιδρά με το σύστημα μέσω διεπαφής χρήστη, που του επιτρέπει να αλλάζει κατάσταση στις πτήσεις που αυτός διαχειρίζεται. Παρόλα αυτά, η εκφώνηση της άσκησης δε ζητά την κατασκευή αυτής της διεπαφής και άρα η ζητούμενη συσχέτιση μπορεί να περιοριστεί στη δοθείσα οθόνη διεπαφής, που δείχνει τη μορφή του Πίνακα Αναχωρήσεων και τις πληροφορίες που αυτός απεικονίζει. Στον παρακάτω πίνακα αναφέρονται τα βήματα της Π.Χ. Ενημέρωση του Πίνακα Αναχωρήσεων (βασική ροή) και συσχετίζονται με τις αλλαγές στην οθόνη διεπαφής. Οι συγκεκριμένες αλλαγές είναι μία ενδεικτική προσέγγιση υλοποίησης της Π.Χ. 1. Για κάθε αλλαγή κατάστασης σε πτήση, εντοπίζεται η πτήση που μεταβάλλεται. 2. Εξετάζεται η ενημερωμένη ένδειξη Remarks στα στοιχεία της πτήσης. 3. Καταμετρώνται οι πτήσεις που εμφανίζονται με την ένδειξη Departed (και αυτές με την ένδειξη Cancelled για τη 2η εναλλακτική ροή). 4. Καθαρίζεται ο Πίνακας για να εμφανιστούν οι νέες ενδείξεις. 5. Αν η πτήση έχει μεταβληθεί σε Departed τότε εμφανίζεται στον Πίνακα ενημερωμένη γραμμή με Δεν υπάρχει αλλαγή στην οθόνη διεπαφής. Δεν υπάρχει αλλαγή στην οθόνη διεπαφής. Δεν υπάρχει αλλαγή στην οθόνη διεπαφής. Σβήνουν όλες οι ενδείξεις και ο πίνακας προετοιμάζεται για την εμφάνιση των ενημερωμένων ενδείξεων ταξινομημένων σύμφωνα με τα κριτήρια των μη λειτουργικών απαιτήσεων. Κατά την επανεμφάνιση γραμμής για πτήση, που η κατάστασή της έχει μεταβληθεί, εμφανίζεται γραμμή 6

6. τα στοιχεία της. Αν υπάρχουν και άλλες πτήσεις για τις οποίες δεν έχει ενημερωθεί ο Πίνακας η διαδικασία επαναλαμβάνεται. με ενημερωμένα τα στοιχεία της πτήσης. Για κάθε πτήση, αν δεν έχει συμβεί σε αυτή αλλαγή κατάστασης, τότε η γραμμή επανεμφανίζεται στη σωστή σειρά, ενώ αν έχει συμβεί αλλαγή τότε εμφανίζεται νέα γραμμή με ενημερωμένα τα στοιχεία της πτήσης. Η εναλλακτική ροή 1 (καθυστέρηση πτήσης) διαφοροποιείται ως προς τα πεδία της πτήσης που πρέπει να ενημερωθούν (αλλάζει και η ένδειξη Expected Departure). Η εναλλακτική ροή 2 (ακύρωση πτήσης) διαφοροποιείται ως προς το ότι κάποιες άλλες γραμμές πτήσεων που έχουν ακυρωθεί ανάλογα με τη νέα σειρά ταξινόμησης δεν πρόκειται να επανεμφανιστούν. ΕΡΩΤΗΣΗ 2 Με βάση την περιγραφή του συστήματος, να σχεδιάσετε το αρχικό διάγραμμα κλάσεων, το οποίο θα αποτελέσει το μοντέλο του πεδίου εφαρμογής (domain model). Για το σκοπό αυτό, θα χρειαστεί να εντοπίσετε τα αντικείμενα που συνιστούν τις βασικές αφαιρέσεις του πεδίου εφαρμογής. Προσέξτε, το μοντέλο πεδίου εφαρμογής δεν είναι το μοντέλο του υπό ανάπτυξη συστήματος (συνήθως είναι ευρύτερο). ΑΠΑΝΤΗΣΗ 2 Το μοντέλο του πεδίου εφαρμογής προκύπτει από το κείμενο των Π.Χ. και των μη λειτουργικών απαιτήσεων μέσα από μια διαδικασία καταγραφής και επεξεργασίας των ουσιαστικών και των ρημάτων: Τα ουσιαστικά που εντοπίζονται μπορεί να αντιστοιχούν σε κλάσεις ή πεδία κλάσεων. Τα ρήματα ή οι φράσεις που δηλώνουν ενέργεια μπορεί να αντιστοιχούν σε μεθόδους ή συσχετίσεις των οντοτήτων. Οι κτητικές φράσεις συνήθως περιγράφουν ιδιότητες/πεδία των κλάσεων και συσχετίσεις. Εφαρμόζοντας τους προαναφερόμενους κανόνες στην περιγραφή των Π.Χ. και των μη λειτουργικών απαιτήσεων καταλήγουμε στο διάγραμμα κλάσεων του σχήματος, που αποτελεί το μοντέλο του πεδίου εφαρμογής. Χρησιμοποιήθηκαν αγγλικά ονόματα για τις κλάσεις που εντοπίστηκαν στο κείμενο για να διατηρηθεί η συνέπεια ως προς την ονοματολογία τόσο στην αναλυτική σχεδίαση του συστήματος, όσο και στην τελική του υλοποίηση. Για τις συσχετίσεις, που τα ονόματά τους δεν επηρεάζουν την υλοποίηση του συστήματος χρησιμοποιήθηκαν ρήματα στα ελληνικά. 7

ΕΡΩΤΗΣΗ 3 Με βάση τις μη λειτουργικές απαιτήσεις να σχεδιάσετε το διάγραμμα καταστάσεων της κλάσης ΠΤΗΣΗ που με ακρίβεια θα περιγράφει όλες τις πιθανές μεταβολές κατάστασης που μπορεί να συμβούν από τη στιγμή που η πτήση εισάγεται στο σύστημα από τη ΒΔ με αρχική κατάσταση OnTime (να αποτυπώσετε με ακρίβεια πάνω στο διάγραμμα καταστάσεων τις συνθήκες που προκαλούν κάθε μεταβολή). ΑΠΑΝΤΗΣΗ 3 Στο διάγραμμα καταστάσεων του σχήματος αποτυπώνονται η αρχική και οι τελικές καταστάσεις που μπορεί να βρεθεί ένα αντικείμενο της κλάσης Flight. Κάθε μεταβολή μπορεί να προκαλείται είτε από ένα γεγονός (π.χ. ανάκληση πτήσης, καθυστέρηση), είτε όταν εκπληρώνεται κάποια συνθήκη (σημειώνεται στο διάγραμμα ανάμεσα σε [ και ]). Το curtime εκφράζει την τρέχουσα ώρα, το fl_scheduled_time εκφράζει την προγραμματισμένη ώρα αναχώρησης και το fl_expected_time εκφράζει την αναμενόμενη ώρα αναχώρησης της πτήσης μετά από μία ή περισσότερες καθυστερήσεις. 8

ΕΡΩΤΗΣΗ 4 Με βάση την περιγραφή των περιπτώσεων χρήσης «Ενημέρωση του Πίνακα Αναχωρήσεων» και «Αλλαγή Χρονοδιαγράμματος Πτήσης» να κάνετε ανάλυση ευρωστίας με σκοπό τον εντοπισμό κενών στο μοντέλο του πεδίο εφαρμογής. Το ζητούμενο είναι ένα διάγραμμα ευρωστίας, που με εύληπτο τρόπο θα αναπαριστά τον τρόπο με τον οποίο η στατική δομή (διάγραμμα κλάσεων) υλοποιεί τη δοθείσα περίπτωση χρήσης του συστήματος. Θα χρειαστεί να κατασκευάσετε ένα διάγραμμα ευρωστίας για κάθε βασική και εναλλακτική ροή. ΑΠΑΝΤΗΣΗ 4 Κάθε διάγραμμα ευρωστίας αναπαριστά τα αντικείμενα του συστήματος, που συμμετέχουν στη βασική ή σε μία εναλλακτική ροή της Π.Χ. και τον τρόπο με τον οποίο αυτά αλληλεπιδρούν. Διαπερνούμε το κείμενο που περιγράφει τις Π.Χ., μία ροή τη φορά και σχεδιάζουμε του χειριστές, τις κλάσεις και τις συνδέσεις ανάμεσα στα στοιχεία του διαγράμματος. Οι κλάσεις που επιλέγουμε μπορεί να ανήκουν σε ένα από τα παρακάτω είδη: κλάσεις οντοτήτων συνοριακές κλάσεις, οι οποίες είναι οι φόρμες που αναφέρονται ή υπονοούνται και σε κάποιες περιπτώσεις το αποτέλεσμα της λειτουργίας τους υποκαθίσταται από τα threads, που αναφέρονται στις απαιτήσεις αλλά και στην εκφώνηση των Π.Χ. κλάσεις ελέγχου, οι οποίες υλοποιούν σημεία των περιπτώσεων χρήσης που εκτιμούμε ότι απαιτούν κάποια λογική, επεξεργασία, λήψη απόφασης κλπ. Οι χειριστές μπορεί να επικοινωνούν μόνο με αντικείμενα συνοριακών κλάσεων. Τα συνοριακά αντικείμενα επικοινωνούν μόνο με χειριστές και αντικείμενα ελέγχου. Τα αντικείμενα των κλάσεων οντοτήτων επικοινωνούν μόνο με αντικείμενα ελέγχου, ενώ τα αντικείμενα ελέγχου επικοινωνούν με συνοριακά αντικείμενα, αντικείμενα οντοτήτων και άλλα αντικείμενα ελέγχου, αλλά σε καμία περίπτωση δεν μπορεί να επικοινωνούν με χειριστές. Ελέγχουμε την ορθότητα και πληρότητα ενός διαγράμματος ευρωστίας ως εξής: για κάθε ακολουθία ενεργειών της Π.Χ. πρέπει να μπορούμε διατρέχοντας το διάγραμμα να εντοπίσουμε πάνω στις ακμές του μια διατεταγμένη σειρά από αριθμημένα βέλη, η οποία αντιστοιχίζεται στα βήματα της ακολουθίας. Διάγραμμα ευρωστίας για την Π.Χ.: Ενημέρωση του Πίνακα Αναχωρήσεων (βασική ροή) Ο χειριστής FlightCompany αλληλεπιδρά με το σύστημα μέσω διεπαφής χρήστη (UIFlightCompany), που όμως δε ζητείται από την εκφώνηση η κατασκευή της, αλλά η προσομοίωση της λειτουργίας της από ένα κατάλληλο thread (ThreadFC), που εκφράζεται από ένα αντικείμενο ελέγχου επειδή εμπεριέχει επεξεργασία και λήψη αποφάσεων. Κάθε πτήση ελέγχεται αν αυτή είναι πτήση του Αερομεταφορέα (GetAirline) και αν αυτή πράγματι είναι, τότε μπορεί να γίνει σε αυτή αλλαγή κατάστασης (Make Changes), που έχει ως συνέπεια την ενημέρωση του σχετικού πεδίου της κλάσης οντότητας Flight (SetRemarks). Τα βήματα αυτά εκφράζουν την αλλαγή κατάστασης μιας πτήσης, ενώ η βασική ροή της Π.Χ. αναφέρεται σε κάθε αλλαγή κατάστασης. 9

σημείωση α. το getglightinfo δεν αντιστοιχεί σε ένα αλλά σε πολλά μηνύματα που αποστέλλονται σε αντικείμενο της κλάσης Flight για να αντληθούν πληροφορίες για την πτήση β. το setvalueat επαναλαμβάνεται όσες φορές χρειάζεται για την εκτύπωση των στοιχείων της πτήσης στον Πίνακα Ένα άλλο thread (ThreadAT) θα είναι υπεύθυνο για την ενημέρωση του πίνακα (Draw), που καταρχήν περιλαμβάνει την ταξινόμηση των καταχωρήσεων στο αντικείμενο οντότητας AnnounceTable (sort). Στη συνέχεια, για κάθε πτήση ανακτώνται από το αντίστοιχο αντικείμενο οντότητας όλες οι πληροφορίες που χρειάζονται για την απεικόνιση των ενημερωμένων στοιχείων της πτήσης στον Πίνακα Αναχωρήσεων (JTable). Διάγραμμα ευρωστίας για την Π.Χ.: Ενημέρωση του Πίνακα Αναχωρήσεων (εναλλακτική ροή 1) Το διάγραμμα ευρωστίας δε διαφέρει από αυτό της βασικής ροής. Διαφοροποιείται η λογική της λειτουργίας ελέγχου Draw και αυτή εφαρμόζεται για τις περιπτώσεις που η GetRemarks επιστρέφει την τιμή Delayed. Διάγραμμα ευρωστίας για την Π.Χ.: Ενημέρωση του Πίνακα Αναχωρήσεων (εναλλακτική ροή 2) Το διάγραμμα ευρωστίας δε διαφέρει από αυτό της βασικής ροής. Διαφοροποιείται η λογική της λειτουργίας ελέγχου Draw, καθώς αυτή θα πρέπει να αντικατοπτρίζει τις μη λειτουργικές 10

απαιτήσεις ως προς την εμφάνιση ή μη εμφάνιση μιας πτήσης Cancelled στον Πίνακα Αναχωρήσεων. Επίσης, η λογική αυτή θα εφαρμόζεται για τις περιπτώσεις που η GetRemarks επιστρέφει την τιμή Cancelled. Διάγραμμα ευρωστίας για την Π.Χ.: Αλλαγή Κατάστασης Πτήσης (βασική ροή) Η πτήση ανακαλείται από τη Β.Δ. μέσω του αντικειμένου ελέγχου DBConnector. Γίνεται καταγραφή των στοιχείων της πτήσης (LogLine) στο αρχείο κατάστασης πτήσεων (LogWriter) και ενημερώνεται ο Πίνακας Αναχωρήσεων (βήματα 4-7). Κάθε αλλαγή κατάστασης είναι συνέπεια της αλληλεπίδρασης του χειριστή FlightCompany με τη διεπαφή UIFlightCompany, που δε ζητείται η υλοποίησή της, αλλά οι συνέπειες της λειτουργίας της προσομοιώνονται από ένα thread (ThreadFC). Το διάγραμμα ευρωστίας για την εναλλακτική ροή 1 (καθυστέρηση πτήσης) δεν περιλαμβάνει καταγραφή της μεταβολής στο αρχείο, όπως στην περίπτωση της βασική ροής, δηλαδή υπάρχει μια διαφορά στο βήμα 17 (γίνεται μεταβολή σε Delayed), ενώ δεν υπάρχουν τα βήματα 18 και 19. Τέλος, το διάγραμμα ευρωστίας για την εναλλακτική ροή 2 (ακύρωση πτήσης) μοιάζει με αυτό του σχήματος με μια διαφορά στο βήμα 17, όπου γίνεται μεταβολή σε Cancelled. Και σε αυτή την περίπτωση έχουμε καταγραφή της μεταβολής στο αρχείο. 11

ΕΡΩΤΗΣΗ 5 Να συσχετίσετε με λεπτομέρεια τη δυναμική συμπεριφορά με τη στατική δομή του συστήματος αναπτύσσοντας ένα διάγραμμα ακολουθίας για κάθε ΠΧ. Προσέξτε, κάθε διάγραμμα ακολουθίας πρέπει να είναι συνεπές ως προς την περιγραφή της ΠΧ και των σχετικών με αυτή διαγραμμάτων ευρωστίας. ΑΠΑΝΤΗΣΗ 5 Το επόμενο βήμα σύμφωνα με την ICONIX είναι η επεξεργασία των διαγραμμάτων ακολουθίας. Ακολουθούμε μια επαναληπτική διαδικασία, επανεξετάζοντας λεπτομερώς τον αρχικό σχεδιασμό μέσα από τα σενάρια χρήσης και προσπαθώντας τώρα να περιγράψουμε επακριβώς πώς συνεργάζονται τα αντικείμενα που εντοπίσαμε. Ο στόχος είναι να πραχθεί το πλήρες μοντέλο της στατικής δομής (που ζητείται στο επόμενο ερώτημα) και της δυναμικής συμπεριφοράς του συστήματος με διαγράμματα ακολουθίας. Τα διαγράμματα αυτά πρέπει να δείχνουν με τη μεγαλύτερη δυνατή λεπτομέρεια τον τρόπο με τον οποίο συνεργάζονται τα αντικείμενα που δημιουργούμε από τις κλάσεις του διαγράμματος ευρωστίας, ώστε να υλοποιούνται τα βήματα των περιπτώσεων χρήσης. Παρουσιάζεται τόσο η κύρια ροή όσο και οι εναλλακτικές ροές. Αν η εναλλακτική ροή δημιουργεί πρόβλημα παρουσίασης της κύριας ροής, μπορούμε να έχουμε ξεχωριστό διάγραμμα. Τα διαγράμματα θα πρέπει να βρίσκονται σε πλήρη συμφωνία με τις προδιαγραφές των αντίστοιχων περιπτώσεων χρήσης, για αυτό τον λόγο, στην αριστερή πλευρά του διαγράμματος παραθέτουμε συνοπτικά τα βήματα της αναλυτικής περιγραφής. Βάση της μεθοδολογίας ICONIX, οι κλάσεις ελέγχου στο διάγραμμα ευρωστίας δεν είναι απαραίτητο να αντιστοιχούν πάντα σε κλάσεις της υλοποίησης της εφαρμογής. Ένα αντικείμενο μίας κλάσης ελέγχου, μπορεί να μεταφραστεί ως μία μέθοδος συνεργαζόμενης κλάσης, αν από μόνο του δεν έχει νόημα αυτόνομης ύπαρξης. Στο πρώτο σχήμα απεικονίζεται το διάγραμμα ακολουθίας για τη βασική ροή της Π.Χ. Ενημέρωση Πίνακα Αναχωρήσεων. Το διάγραμμα ακολουθίας για την εναλλακτική ροή 1 διαφέρει μόνο στην τελευταία φάση (alt block), η οποία εφαρμόζεται για πτήση που έχει περιέλθει σε κατάσταση Delayed. Εμφανίζεται η ενημερωμένη γραμμή στον Πίνακα σε κάθε περίπτωση, δηλαδή δεν εξαρτάται από το πόσες πτήσεις έχουν γίνει Delayed). Τέλος, το διάγραμμα ακολουθίας για την εναλλακτική ροή 2 διαφέρει επίσης στην τελευταία φάση (alt block), η οποία εφαρμόζεται για πτήση που έχει περιέλθει σε κατάσταση Cancelled και ανήκει στις τρεις πιο πρόσφατα ακυρωμένες, με βάση την τελευταία προγραμματισμένη ώρα αναχώρησης. Στη συνέχεια δίνεται με ανάλογο τρόπο το διάγραμμα ακολουθίας για τη βασική ροή της Π.Χ. Αλλαγή Κατάστασης Πτήσης, καθώς και τα διαφοροποιημένα σημεία που αφορούν την εναλλακτική ροή 1 (καθυστέρηση πτήσης) και την εναλλακτική ροή 2 (ακύρωση πτήσης). 12

Π. Χ.: ΕΝΗΜΕΡΩΣΗ ΠΙΝΑΚΑ ΑΝΑΧΩΡΗΣΕΩΝ (Βασική ροή) 1. 2. 3. 4. 5. 6. Για κάθε αλλαγή κατάστασης σε πτήση, εντοπίζεται η πτήση που μεταβάλλεται. Εξετάζεται η ενημερωμένη ένδειξη Remarks στα στοιχεία της πτήσης. Καταμετρώνται οι πτήσεις που εμφανίζονται με την ένδειξη Departed (και αυτές με την ένδειξη Cancelled για τη 2η εναλλακτική ροή). Καθαρίζεται ο Πίνακας για να εμφανιστούν οι νέες ενδείξεις. Αν η πτήση έχει μεταβληθεί σε Departed τότε εμφανίζεται στον Πίνακα ενημερωμένη γραμμή με τα στοιχεία της. Αν υπάρχουν και άλλες πτήσεις για τις οποίες δεν έχει ενημερωθεί ο Πίνακας η διαδικασία επαναλαμβάνεται. 13

14

Π. Χ.: ΑΛΛΑΓΗ ΚΑΤΑΣΤΑΣΗΣ 1. Το σύστημα ανακαλεί την πτήση 2. Γίνεται καταγραφή των στοιχείων της στο αρχείο κατάστασης πτήσεων 3. Ενημερώνεται ο Πίνακας Αναχωρήσεων 4. Αν δεν υπάρχει πρόβλημα, η κατάσταση αλλάζει σε Boarding. 5. Αν δεν εμφανιστεί πρόβλημα, η κατάσταση αλλάζει από Boarding σε Departed. 15

Εναλλακτική Ροή 1 1. Η κατάσταση της πτήσης αλλάζει σε Delayed. 2. Η πτήση προγραμματίζεται ξανά. 3. Γίνεται καταγραφή της μεταβολής στο αρχείο κατάστασης πτήσεων. Εναλλακτική Ροή 2 1. Η κατάσταση της πτήσης αλλάζει σε Cancelled. 2. Γίνεται καταγραφή της μεταβολής στο αρχείο κατάστασης πτήσεων. 16

ΕΡΩΤΗΣΗ 6 Να ενημερώσετε, με βάση όσα προέκυψαν κατά το σχεδιασμό των διαγραμμάτων ευρωστίας και ακολουθίας, το αρχικό διάγραμμα κλάσεων, ώστε στο τέλος να απεικονίζει τη δομή του συστήματος διαχειρισης του Πίνακα Αναχωρήσεων. Οι κλάσεις θα πρέπει να είναι πλήρεις, δηλαδή να περιλαμβάνουν κατηγορήματα και μεθόδους. Προσέξτε να μην αποκλίνετε από τις αρχικές απαιτήσεις. ΑΠΑΝΤΗΣΗ 6 Για την ολοκλήρωση του λεπτομερούς σχεδιασμού χρησιμοποιούμε το μοντέλο του πεδίου προβλήματος (αρχικό διάγραμμα κλάσεων), το διαγράμματα περιπτώσεων χρήσης μαζί με τις περιγραφές τους, τα διαγράμματα ευρωστίας που σχεδιάσαμε για κάθε ροή των Π.Χ. και τα λεπτομερή διαγράμματα ακολουθίας. Επιβεβαιώνουμε ότι για κάθε Π.Χ. η ροή μηνυμάτων στο διάγραμμα ακολουθίας ταιριάζει με την ακολουθία ενεργειών στην περιγραφή της Π.Χ. για τη βασική και όλες τις εναλλακτικές ακολουθίες ενεργειών και αποκρίσεων. Ελέγχουμε την ορθότητα της ροής ελέγχου σε κάθε διάγραμμα ακολουθίας, επαληθεύοντας την ορθότητα της κατεύθυνσης των μηνυμάτων και τη διασφάλιση της συνεχούς λειτουργίας του συστήματος. Πρέπει να είναι εμφανές ποιο αντικείμενο στέλνει και ποιο λαμβάνει κάθε μήνυμα, ενώ δεν πρέπει να υπάρχει μεταφορά ελέγχου εκτέλεσης ανάμεσα σε αντικείμενα χωρίς την ανταλλαγή αντίστοιχου μηνύματος. Θα πρέπει να γίνει αναλυτικός ορισμός των πεδίων των κλάσεων και των μεθόδων των κλάσεων. Ελέγχουμε την καλή κατανομή μεθόδων σε κλάσεις χρησιμοποιώντας τα ακόλουθα κριτήρια: Επαναχρησιμοποιησιμότητα (reusability): όσο πιο γενική είναι μια κλάση, τόσο πιο εύκολα μπορούμε να την επαναχρησιμοποιήσουμε. Εφαρμοσιμότητα (applicability): πρέπει κάθε φορά να εξετάζουμε κατά πόσο μια μέθοδος «ταιριάζει» με την κλάση στην οποία σκεφτόμαστε να την κατανείμουμε. Πολυπλοκότητα (complexity): εξετάζουμε το βαθμό δυσκολίας υλοποίησης μιας μεθόδου μέσα σε μια ή σε άλλη κλάση, προσπαθώντας να μειώσουμε την πολυπλοκότητα της υλοποίησης. Εξετάζουμε εάν η υλοποίηση μια μεθόδου μέσα σε μια κλάση απαιτεί τη γνώση εσωτερικών λεπτομερειών υλοποίησης της κλάσης. Κάνουμε έλεγχο της ποιότητας των κλάσεων, δηλαδή το βαθμό στον οποίο ο σχεδιασμός τους ικανοποιεί τα ακόλουθα κριτήρια: o σύζευξη o συνοχή o επάρκεια o πληρότητα o πρωτογένεια Το διάγραμμα κλάσεων που ακολουθεί δίνει τη λεπτομερή σχεδίαση του συστήματος, όπως αυτή προέκυψε με την εφαρμογή της διαδικασίας που περιγράφηκε. 17

18

ΕΡΩΤΗΣΗ 7 Με τη χρήση της μεθόδου Use Case Points εκτιμήστε την προσπάθεια που απαιτείται από εσάς για την κατασκευή του συστήματος πριν ξεκινήσετε την ανάπτυξη. Στη συνέχεια να χρονομετρήσετε με όσο το δυνατό μεγαλύτερη ακρίβεια την προσπάθεια που θα καταβάλλετε για την υλοποίηση της εφαρμογής. Μετά το πέρας της υλοποίησης να συγκρίνετε την εκτίμηση με την πραγματική προσπάθεια. Είναι πιθανό να υπάρχει σημαντική απόκλιση. Αυτό όμως δε σημαίνει απαραίτητα ότι έχετε κάνει κάποιο λάθος. Στην περίπτωση αυτή να αιτιολογήσετε αυτή την απόκλιση. Υπόδειξη: Ακολουθείστε το παράδειγμα εφαρμογής της μεθόδου που θα βρείτε στην περίπτωση μελέτης Μισθοδοσία Υπαλλήλων (βλ. στο portal της ΠΛΗ24 στο βοηθητικό υλικό του Τόμου Β). Επίσης μπορείτε να επισκεφθείτε και τις διευθύνσεις http://www.stsc.hill.af.mil/crosstalk/2006/02/0602clemmons.pdf http://www.codeproject.com/kb/architecture/usecasep.aspx για μία εναλλακτική επεξήγηση της μευθόδου. ΑΠΑΝΤΗΣΗ 7 Για να εφαρμόσουμε τη μέθοδο ακολουθούμε τα εξής βήματα (υπάρχει αρκετή υποκειμενικότητα στην απόδοση τιμών και η απάντησή σας μπορεί να είναι αρκετά διαφορετική από την ενδεικτική): 1. Χαρακτηρισμός Χειριστών Αερομεταφορέας: Βάρος Χειριστή UAW1 = 2 (Μέτρια πολυπλοκότητα, είναι λιγότερο πολύπλοκος από ένα GUI, αλλά η υλοποίησή του απαιτεί σκέψη και ανάλυση) Πίνακας Πτήσεων: Βαρος Χειριστή UAW2 = 1 (Απλός, πρόκειται για μία καλά ορισμένη και απλή δομή δεδομένων) 2. Χαρακτηρισμός Π.Χ. Βάρος Π.Χ. Ενημέρωση Πίνακα Αναχωρήσεων UUCW1 = 3 (Σύνθετη Π.Χ., πολλά βήματα, λαμβάνονται υπόψη και τα βήματα των εναλλακτικών ροών) Βάρος Π.Χ. Αλλαγή Κατάστασης Πτήσης UUCW2 = 3 (Σύνθετη Π.Χ., πολλά βήματα, λαμβάνονται υπόψη και τα βήματα των εναλλακτικών ροών) 3.Υπολογισμός συνολικού αριθμού αστάθμητων σημείων ΠΧ UUCP = UAW1 + UAW2 + UUCW1 + UUCW2 = 9 4.Απόδοση Τιμής σε Παράγοντες Τεχνικής Πολυπλοκότητας και σε Παράγοντες Περιβάλλοντος (βλ. άρθρο Clemmons στο Διαδίκτυο). Τεχνικοί παράγοντες Παράγοντας Βάρος Τιμή Τελική Τιμή Σχόλιο 19

Κατανεμημένο Σύστημα Απαιτήσεις Απόδοσης Αποδοτικότητα Τελικών Χρηστών Σύνθετη Εσωτερική Επεξεργασία Επαναχρησιμοποιήσιμο ς Κώδικας Ευκολία Εγκατάστασης Ευχρηστία 2 1 1 0 0 1 0 0 1 1 4 4 1 0 0 0,5 0,5 0 1 0 0,5 Ευκολία αλλαγής 1 2 2 Ταυτόχρονη λειτουργία Ασφάλεια Πρόσβαση σε τρίτους 1 1 1 4 0 0 4 0 0 Εκπαίδευση χρηστών 1 0 0 Παράγοντες Περιβάλλοντος Παράγοντας Βάρος Τιμή Τελική Τιμή Οικειότητα με τη UML 1,5 1,5 2,25 Εργασία part time -1 4-4 Ικανότητα ανάλυσης 0,5 1 0,5 Εμπειρία Εφαρμογής Εμπειρία στην Αντικειμενοστρέφεια Κίνητρο 0,5 1 0 1,5 0 1,5 1 2 2 Δυσκολία Γλώσσας Προγραμματισμού Σταθερές Απαιτήσεις -1 3-3 2 5 10 πρέπει να υπάρξει μέριμνα για καλή διεπαφή με το Χειριστή Αερομεταφορέα Ανάγκη για ικανοποίηση πολλών περιορισμών υποτίθεται ότι θα πρέπει να υπάρχει μία στοιχειώδης ευχρηστία της εφαρμογής, π.χ. ευκολία ανάγνωσης του πίνακα υποτίθεται ότι ο κώδικάς μας πρέπει ούτως ή άλλως να διευκολύνει μελλοντικές αλλαγές πολλές απαιτήσεις ταυτοχρονισμού δεν υπάρχουν εξωτερικές διεπαφές με άλλα συστήματα Σχόλιο Θεωρώντας ότι έχετε εκπονήσει και τις δύο προηγούμενες γραπτές εργασίες Θεωρώντας ότι ασχολείστε ευκαιριακά με την παρούσα εργασία Υπάρχει κάποια γνώση αλλά όχι επαγγελματική άγνωστη εφαρμογή Υπάρχει κάποια εμπειρία αλλά όχι επαγγελματική μέση τιμή εξαρτάται από τον κάθε προγραμματιστή ξεχωριστά Η Java δεν θεωρείται εύκολη γλώσσα Πλήρως ορισμένες απαιτήσεις. Τυχόν ασάφειες επιλύθηκαν με ερωτήσεις στο φόρουμ και στους ΣΕΠ 5.Υπολογισμός αθροίσματος παραγόντων τεχνικής πολυπλοκότητας Συνολικά Tfactor = 11,5 6.Υπολογισμός παράγοντα τεχνικής πολυπλοκότητας 20

TCF = 0,6 + 0,01 * 11,5 = 0,72 7.Υπολογισμός αθροίσματος παραγόντων περιβάλλοντος Συνολικά Efactor = 9,25 8.Υπολογισμός παράγοντα περιβάλλοντος ΕCF = 1,4 (0,03 * 9,25) = 1,12 9.Υπολογισμός σταθμισμένων στοιχείων Π.Χ. ΑUCP = UUCP * TCF * EF = 9 * 11,5 * 1,12 = 7,26 10.Υπολογισμός συνολικής απαιτούμενης προσπάθειας Θεωρούμε ότι απαιτούνται 20 ώρες εργασίας ανά AUCP Effort = 20 * 7,26 = 145,15 ώρες εργασίας Σχολιασμός Η εκπόνηση μίας εργασίας από ένα φοιτητή είναι διαφορετική από την επαγγελματική ανάπτυξη λογισμικού από την οποία προέρχεται η μέθοδος των Use Case Points (π.χ απαιτείται πολύ καλή τεκμηρίωση του κώδικα, συγγραφή εγχειριδίων τεκμηρίωσης και εξονυχιστικός έλεγχος). Επομένως η εκτίμηση με τη μέθοδο δίνει μία υπερεκτίμηση σε σχέση με την προσπάθεια που αφιερώσατε εσείς για την εργασία σας Άλλοι λόγοι που μπορεί να οδηγούν σε αποκλίσεις μπορεί να οφείλονται: - Στην υποκειμενικότητα στην απόδοση τιμών Στο περιθώριο λάθους που εμπεριέχει η μέθοδος Στο γεγονός ότι μέρος της ανάλυσης (π.χ. διαγράμματα) έχει γίνει πριν από την εφαρμογή της μεθόδου 21

ΕΡΩΤΗΣΗ 8 Να δημιουργήσετε τη ΒΔ των πτήσεων για μια συγκεκριμένη ημέρα λειτουργίας του αεροδρομίου (φροντίστε ώστε ο συνολικός αριθμός των πτήσεων να είναι το πολύ 50). Παραθέστε το σχήμα της βάσης και τον κώδικα με τον οποίο τη διαχειρίζεται η εφαρμογή. ΑΠΑΝΤΗΣΗ 8 Η βάση δεδομένων δημιουρθήκε με την Derby μέσα από το Netbeans. Το σχήμα φαίνεται στην παρακάτω εικόνα. 22

Οι πτήσεις καταχωρούνται στον πίνακα FLIGHT. Για την καλύτερη οργάνωση δημιουργήθηκε και ο πίνακας COMPANY που κρατά τις αεροπορικές εταιρείες. Αρχικά εισάγουμε στον πίνακα COMPANY τις αεροπορικές εταιρείες με τις παρακάτω εντολές SQL: INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO COMPANY COMPANY COMPANY COMPANY COMPANY COMPANY COMPANY VALUES VALUES VALUES VALUES VALUES VALUES VALUES ('Olympic Airlines') ('Aegean Airlines') ('Baboo') ('British Airways') ('Delta Airlines') ('Athens Airways') ('Cyprus Airways') Στην παρακάτω οθόνη φαίνεται το αποτέλεσμα: 23

Στη συνέχεια εισάγουμε τις πτήσεις στον πίνακα FLIGHT με τις παρακάτω εντολές SQL: VALUES ('Larnaca','Cyprus Airways','CY 322','05:45:00',NULL) VALUES ('London','Cyprus Airways','CY 324','05:48:00',NULL) VALUES ('Geneva','Baboo','BBO 294','05:51:00','Nice') VALUES ('Milos','Olympic Airlines','OA 048','06:00:00',NULL) VALUES ('London','British Airways','BA 031','06:12:00',NULL) VALUES ('Milos','Olympic Airlines','OA 049','07:00:00',NULL) VALUES ('New York','Delta Airlines','DL 001','07:15:00','London') VALUES ('Boston','Delta Airlines','DL 002','07:21:00',NULL) VALUES ('Kerkyra','Athens Airways','ZF 130','07:24:00',NULL) VALUES ('Ioannina','Athens Airways','ZF 132','07:27:00',NULL) VALUES ('Milos','Aegean Airlines','A3 049','07:30:00',NULL) VALUES ('Heraklio','Olympic Airlines','OA 149','08:00:00',NULL) VALUES ('Rodos','Olympic Airlines','OA 250','08:09:00',NULL) VALUES ('Rodos','Aegean Airlines','A3 250','08:15:00',NULL) VALUES ('Heraklio','Aegean Airlines','A3 149','08:30:00',NULL) VALUES ('Thessaloniki','Olympic Airlines','OA 300','09:21:00',NULL) VALUES ('Thessaloniki','Aegean Airlines','A3 300','09:42:00',NULL) VALUES ('London','British Airways','BA 032','10:00:00',NULL) VALUES ('Larnaca','Cyprus Airways','CY 334','10:09:00',NULL) VALUES ('Rodos','Olympic Airlines','OA 251','11:30:00',NULL) VALUES ('Rodos','Aegean Airlines','A3 251','11:54:00',NULL) VALUES ('Heraklio','Olympic Airlines','OA 150','12:00:00',NULL) 24

VALUES ('Heraklio','Aegean Airlines','A3 150','12:12:00',NULL) VALUES ('Paris','British Airways','BA 033','13:09:00',NULL) VALUES ('Larnaca','Cyprus Airways','CY 336','13:15:00',NULL) VALUES ('Ioannina','Athens Airways','ZF 134','14:00:00',NULL) VALUES ('Alexandroupoli','Athens Airways','ZF 136','14:03:00',NULL) VALUES ('Kavala','Athens Airways','ZF 138','14:06:00',NULL) VALUES ('Amsterdam','British Airways','BA 034','14:15:00',NULL) VALUES ('Thessaloniki','Olympic Airlines','OA 301','16:42:00',NULL) VALUES ('Thessaloniki','Aegean Airlines','A3 301','16:57:00',NULL) VALUES ('Heraklio','Olympic Airlines','OA 151','17:00:00',NULL) VALUES ('Heraklio','Aegean Airlines','A3 151','17:30:00',NULL) VALUES ('Geneva','Baboo','BBO 494','17:51:00','Nice') VALUES ('London','British Airways','BA 134','18:03:00','Paris') VALUES ('Berlin','Olympic Airlines','OA 1006','18:30:00',NULL) VALUES ('Milos','Olympic Airlines','OA 349','19:00:00',NULL) VALUES ('Rome','Olympic Airlines','OA 1004','19:03:00',NULL) VALUES ('Heraklio','Olympic Airlines','OA 449','20:00:00',NULL) VALUES ('Larnaca','Cyprus Airways','CY 354','20:03:00',NULL) VALUES ('London','Cyprus Airways','CY 454','20:06:00',NULL) VALUES ('Rodos','Olympic Airlines','OA 350','20:09:00',NULL) VALUES ('Liverpool','British Airways','BA 035','21:00:00',NULL) VALUES ('Kavala','Athens Airways','ZF 140','21:03:00',NULL) VALUES ('Thessaloniki','Olympic Airlines','OA 400','21:21:00',NULL) 25

VALUES ('Rodos','Olympic Airlines','OA 351','21:30:00',NULL) VALUES ('Heraklio','Olympic Airlines','OA 550','22:00:00',NULL) VALUES ('New York','Delta Airlines','DL 003','22:03:00',NULL) VALUES ('Thessaloniki','Olympic Airlines','OA 401','23:42:00',NULL) VALUES ('Heraklio','Olympic Airlines','OA 451','23:45:00',NULL) Στην παρακάτω οθόνη φαίνεται το αποτέλεσμα: 26

Για τη διαχείριση της βάσης δεδομένων δημιουργήθηκε η κλάση DBConnector, ο κώδικας της οποίας φαίνεται παρακάτω: package airpr; import import import import java.sql.*; java.util.*; javax.swing.jtable; javax.swing.jtextfield; /* * To change this template, choose Tools Templates * and open the template in the editor. */ /** * * @author UKXD */ public class DBConnector { final private String database = "AIRDB"; final private String user = "plh24"; final private String password = "plh24"; final private String driver = "org.apache.derby.jdbc.clientdriver"; final private String connstring = "jdbc:derby://localhost:1527/"; private Connection connection; private Statement statement; private AnnounceTable board; private LogWriter lw; public DBConnector() { try { // load database driver class Class.forName(driver); // connect to database connection = DriverManager.getConnection(connString + database, user, password); catch (Exception ex) { System.out.println("Exception: " + ex); public void closefile() { lw.outfile.close(); public void loaddb(jtable jt, JTextField jtf) { try { lw = new LogWriter(); 27

ResultSet rscom = connection.createstatement().executequery("select * FROM COMPANY"); ResultSet rs = connection.createstatement().executequery("select DEPARTURES,AIRLINE,FLIGHT,SCHED_TIME,VIA FROM FLIGHT"); ArrayList AllFlights = new ArrayList(); while (rs.next()) //DEPARTURES,AIRLINE,FLIGHT,SCHED_TIME,VIA AllFlights.add(new Flight(rs.getString(1), rs.getstring(2), rs.getstring(3), rs.gettime(4), rs.getstring(5))); board = new AnnounceTable(jt,jtf,AllFlights); while (rscom.next()) new FlightCompany(rscom.getString(1),AllFlights,board,lw); catch (SQLException ex) { System.out.println("Exception: " + ex); Η μέθοδος loaddb: α) διαβάζει τα δεδομένα των προγραμματισμέων πτήσεων από τον πίνακα FLIGHT και για κάθε εγγραφή του πίνακα (δηλαδή για κάθε πτήση) δημιουργεί ένα αντικείμενο της κλάσης Flight το οποίο το προσθέτει στη λίστα AllFlights που είναι τύπου ArrayList, β) διαβάζει τα δεδομένα των αεροπορικών εταιρειών από τον πίνακα COMPANY και για κάθε εγγραφή του πίνακα (δηλαδή για κάθε αεροπορική εταιρεία) δημιουργεί ένα αντικείμενο της κλάσης FlightCompany, γ) δημιουργεί το αντικείμενο board του πίνακα ανακοινώσεων (κλάση AnnounceTable) και δημιουργεί το αντικείμενο lw του καταγραφέα των αλλαγών κατάστασης των πτήσεων (κλάση LogWriter). Το αντικείμενο AllFlights περνά σαν πληροφορία στο αντικείμενο του πίνακα ανακοινώσεων. Τα αντικείμενα board και lw περνούν σαν πληροφορία στα αντικείμενα των αεροπορικών εταιρειών. Με την κλάση DBConnector υλοποιείται η μη λειτουργική απαίτηση Α1. ΕΡΩΤΗΣΗ 9 Να δημιουργήσετε και να ενημερώνετε τον Πίνακα Αναχωρήσεων του αεροδρομίου, σύμφωνα με τις περιπτώσεις χρήσης και τις μη λειτουργικές απαιτήσεις. Παραθέστε τον κώδικα με τον οποίο η εφαρμογή διαχειρίζεται τον πίνακα (ως γραφική διεπαφή) και την αντίστοιχη δομή δεδομένων. Παραθέστε πέντε στιγμιότυπα του πίνακα κατά τη διάρκεια εκτέλεσης της εφαρμογής (βλ. πιο κάτω) ΑΠΑΝΤΗΣΗ 9 Για τη δημιουργία της εφαρμογής επιλέχθηκε η δυνατότητα του Netbeans για τη δημιουργία desktop applications (βλέπε παρακάτω οθόνη). 28

Στην οθόνη που δημιούργησε το Netbeans προστέθηκε το αντικείμενο jtable1 τύπου JTable για τον πίνακα ανακοινώσεων και τα αντικείμενα jlabel1 τύπου JLabel και jtexfield1 τύπου JTextField για την προβολή της τρέχουσας ώρας. Το όνομα της σχετικής κλάσης είναι AirPrView και παραθέτουμε μόνο το τμήμα του κώδικα που εισαγάγαμε. public class AirPrView extends FrameView { public JTable jt; public JTextField jtf; public DBConnector db = new DBConnector();... Για την καλύτερη κατανόηση του κώδικα της κλάσης AirPrView παραθέτουμε τον κώδικα της βασικής κλάσης (main), χωρίς τα σχόλια. package airpr; import org.jdesktop.application.application; 29

import org.jdesktop.application.singleframeapplication; public class AirPrApp extends SingleFrameApplication { static public DBConnector db = new DBConnector(); static AirPrView a; @Override protected void startup() { a=new AirPrView(this); show(a); db.loaddb(a.jt, a.jtf); @Override protected void configurewindow(java.awt.window root) { public static AirPrApp getapplication() { return Application.getInstance(AirPrApp.class); public static void main(string[] args) { launch(airprapp.class, args); Στη μέθοδο startup δημιουργούμε ένα αντικείμενο για την οθόνη της εφαρμογής, καλούμε τη μέθοδο show για την εμφάνιση της οθόνης και στη συνέχεια έχοντας δημιουργήσει το αντικείμενο db τύπου DBConnector στον κώδικα της κλάσης της οθόνης, καλούμε τη μέθοδο loaddb της κλάσης DBConnector, η οποία και ουσιαστικά ενεργοποιεί την εκτέλεση της εφαρμογής. Με αυτό τον τρόπο επιτυγχάνουμε την εκτέλεση της εφαρμογής χωρίς την παρέμβαση του χρήστη. Σε αντίθετη περίπτωση θα έπρεπε να προστεθεί κάποιο πλήκτρο εκκίνησης στο μενού της οθόνης της εφαρμογής. Τρεις από τις βασικές κλάσεις της εφαρμογής είναι ο πίνακας ανακοινώσεων AnnounceTable, η αεροπορικής εταιρεία FlightCompany και η πτήση Flight. Παραθέτουμε τον κώδικα των σχετικών κλάσεων: package airpr; import java.sql.time; import javax.swing.jtable; import javax.swing.jtextfield; import java.util.*; import java.util.arraylist; //import java.io.*; /** * * @author user */ class FlightComparator implements Comparator{ public int compare(object fl1, Object fl2){ //parameter are of type Object, so we have to downcast it to Employee objects String flighttime1 = ( (Flight) fl1).getscheduledtime().tostring(); String flighttime2 = ( (Flight) fl2).getscheduledtime().tostring(); if (! ((Flight)fl1).GetExpectedtime().equals(new Time(0,0,0)) ) flighttime1 = ( (Flight) fl1).getexpectedtime().tostring(); if (!( (Flight)fl2).GetExpectedtime().equals(new Time(0,0,0))) flighttime2 = ( (Flight) fl2).getexpectedtime().tostring(); return ( flighttime1.compareto(flighttime2)); 30

public class AnnounceTable implements Runnable{ private JTable jt; private JTextField jtf; private ArrayList lf; public Time curtime; static static static static final final final final int SLEEPDELAY=500; int ROWCOUNT=10; int COLUMNCOUNT=7; Time endtime = new Time(24,0,0); private void cleartable(){ int i,j; for(i=0;i<rowcount;i++) for(j=0;j<columncount;j++) jt.setvalueat((string)"", i, j); public AnnounceTable(JTable jt, JTextField jtf, ArrayList lf) { this.jt=jt; this.jtf=jtf; this.lf=lf; this.curtime=new Time(5,0,0); new Thread(this).start(); public void run() { while (true){ try { Draw(); Thread.sleep(SLEEPDELAY); curtime.setminutes(curtime.getminutes()+3); jtf.settext(curtime.tostring()); if (curtime.equals(endtime)) { break; catch (InterruptedException e) { System.err.println("interrupted"); public static int DiffInMinutes(Time a, Time b) { int ha=a.gethours(); int hb=b.gethours(); int ma=a.getminutes(); int mb=b.getminutes(); int diff=60*(hb-ha-1)+(60-ma)+mb; return(diff); public void Draw (){ int cancelledno=0; int departedno=0; int notdispcancelledno=0; int notdispdepartedno=0; int displayscheduledno=0; Collections.sort(lf, new FlightComparator()); int row=-1; Iterator itr2 = lf.iterator(); Time boardtime=new Time(0,0,0); while (itr2.hasnext()){ Flight f=(flight)itr2.next(); if (!f.getexpectedtime().equals(new Time(0,0,0))) 31

boardtime=f.getexpectedtime(); else boardtime=f.getscheduledtime(); if ((f.getremarks().equals("cancelled")) && (DiffInMinutes(boardtime,curtime)<=180)) cancelledno++; else if ((f.getremarks().equals("departed")) && (DiffInMinutes(boardtime,curtime)<=60)) departedno++; if (cancelledno>3) notdispcancelledno=cancelledno-3; if (departedno>2) notdispdepartedno=departedno-2; displayscheduledno=10-(cancelledno-notdispcancelledno)-(departedno-notdispdepartedno); cleartable(); Iterator itr = lf.iterator(); boolean gotonext; while (itr.hasnext()){ gotonext=true; Flight f=(flight)itr.next(); if (!f.getexpectedtime().equals(new Time(0,0,0))) boardtime=f.getexpectedtime(); else boardtime=f.getscheduledtime(); if ((f.getremarks().equals("cancelled")) && (DiffInMinutes(boardtime,curtime)<=180)) { if (notdispcancelledno>0) notdispcancelledno--; else gotonext=false; else if ((f.getremarks().equals("departed")) && (DiffInMinutes(boardtime,curtime)<=60)) { if (notdispdepartedno>0) notdispdepartedno--; else gotonext=false; else if ((boardtime.compareto(curtime)>=0)) { if (displayscheduledno>0) { displayscheduledno--; gotonext=false; if (!gotonext) { row++; if (row>rowcount-1) break; jt.setvalueat(f.getdepartures(), row, 0); jt.setvalueat(f.getairline(), row, 1); jt.setvalueat(f.getflightno(), row, 2); jt.setvalueat(f.getvia(), row, 3); jt.setvalueat("", row, 4); if (!f.getexpectedtime().equals(new Time(0,0,0))) jt.setvalueat(f.getexpectedtime().tostring(), row, 4); jt.setvalueat(f.getscheduledtime().tostring(), row, 5); jt.setvalueat(f.getremarks(), row, 6); 32

Η κλάση AnnounceTable υλοποιεί το interface Runnable, με την υλοποίηση της μεθόδου run. Συγκεκριμένα, κατά τη δημιουργία ενός αντικειμένου τύπου AnnounceTable (στην περίπτωση της εφαρμογής αυτό το αντικείμενο είναι μόνο ένα) δημιουργείται εάν thread με την εντολή new Thread(this).start(). Με το που δημιουργείται το thread εκτελείται ο κώδικας της μεθόδου run. Η συνθήκη τερματισμού της μεθόδου run και άρα και του thread είναι η τρέχουσα ώρα (υλοποιείται με το δεδομένο curtime, το οποίο αρχικοποιείται στην ώρα 5:00) να γίνει ίση με την ώρα τερματισμού (υλοποιείται με το στατικό δεδομένο endtime). Αρχικά το thread καλεί τη μέθοδο Draw (προβάλλει τα δεδομένα του πίνακα ανακοινώσεων), και στη συνέχεια περιμένει ένα «κβάντο» χρόνου. Με την αφύπνηση του thread αλλάζει η τρέχουσα ώρα κατά 3 sec. Η μέθοδος Draw χρησιμοποιεί τη λίστα των πτήσεων lf για την ανάγνωση των δεδομένων των πτήσεων και εμφανίζει στην οθόνη τις πτήσεις που πληρούν τη μη λειτουργική απαίτηση Α3. Για την ταξινόμηση των πτήσεων στη λίστα lf χρησιμοποιείται η κλάση FlightComparator που υλοποιεί το interface Comparator. Συγκεκριμένα υλοποιεί τη μέθοδο compare στην οποία καταγράφεται ο τρόπος ταξινόμησης των αντικειμένων στη λίστα στην οποία θα χρησιμοποιηθεί. Η ταξινόμηση γίνεται με την εντολή Collections.sort(lf, new FlightComparator()). package airpr; import java.util.*; import java.sql.time; /** * * @author UKXD */ public class FlightCompany implements Runnable{ private String name; private ArrayList allflights; private AnnounceTable board; private LogWriter lw; public void FlightUpd(Flight f, String newstate){ f.setremarks(newstate); lw.logline(f.getairline()+" "+f.getflightno()+" "+f.getdepartures()+" "+f.getvia()+" "+f.getscheduledtime()); lw.logline(" status: "+newstate+" "+board.curtime.tostring()); public boolean FindOtherFlight(Flight f) { Iterator itr = allflights.iterator(); while (itr.hasnext()){ Flight fi=(flight)itr.next(); String flname=fi.getairline(); if ( (flname.equals(name)) && (f.getdepartures().equals(fi.getdepartures())) && (!f.getflightno().equals(fi.getflightno())) && ( ((fi.getremarks().equals("")) (fi.getscheduledtime().compareto(f.getexpectedtime())<=0 )) ((fi.getremarks().equals("delayed")) (fi.getexpectedtime().compareto(f.getexpectedtime())<=0 )) ) ) { return(true); return (false); && && 33

public int MakeChanges(Flight f) { double i,j; int delay; Time boardtime=new Time(0,0,0); Random generator = new Random(); boolean isdelayed=false; if (!f.getexpectedtime().equals(new Time(0,0,0))) { boardtime=f.getexpectedtime(); isdelayed=true; else boardtime=f.getscheduledtime(); //εάν έχει ακυρωθεί ή αναχωρήσει δεν γίνεται καμία αλλαγή if ((f.getremarks().equals((string)"cancelled")) (f.getremarks().equals((string)"departed"))) return(0); if ((boardtime.compareto(board.curtime)<=0)) { //εάν έχει περάσει η χσ αναχώρησης, τότε πάντα είναι departed FlightUpd(f,"Departed"); return(1); i=generator.nextdouble(); if (((!isdelayed) && (i>0.99)) ((isdelayed) && (i>0.97))) //0.95, 0.90 //cancel FlightUpd(f,"Cancelled"); else if ((i>0.96) && (!f.getremarks().equals((string)"boarding"))) { //new time 0.8 // FlightUpd(f,"Delayed"); j=generator.nextdouble(); //from 30 min to 6 hours are 330 minutes delay=30+3*(int)math.round(j*330)/6; if (!isdelayed) f.setexpectedtime(new Time(f.GetScheduledtime().getHours(),f.GetScheduledtime().getMinutes(),0)); if ( (delay+ board.diffinminutes(f.getexpectedtime(),f.getscheduledtime()) ) >180) { FlightUpd(f,"Cancelled"); return(1); if (FindOtherFlight(f)) { FlightUpd(f,"Cancelled"); return(1); f.getexpectedtime().setminutes(boardtime.getminutes()+delay); if ( board.diffinminutes(board.curtime,boardtime)<=30 ) FlightUpd(f,"Boarding"); return(1); public FlightCompany(String name, ArrayList allflights, AnnounceTable board, LogWriter lw) { this.name = name; this.allflights=allflights; this.board=board; this.lw = lw; new Thread(this).start(); public String GetName(){ return name; public void run() { 34

while (true){ try { Thread.sleep(board.SLEEPDELAY); Iterator itr = allflights.iterator(); while (itr.hasnext()){ Flight f=(flight)itr.next(); String flname=f.getairline(); if (flname.equals(name)) { MakeChanges(f); if (board.curtime.equals(board.endtime)) { lw.outfile.close(); break; catch (InterruptedException e) { System.err.println("interrupted"); Η κλάση FlightCompany υλοποιεί το interface Runnable, με την υλοποίηση της μεθόδου run. Συγκεκριμένα, κατά τη δημιουργία ενός αντικειμένου τύπου FlightCompany (στην περίπτωση της εφαρμογής θα δημιουργηθούν από την DBConnector τόσα αντικείμενα όσες είναι και οι αεροπορικές εταιρείες) δημιουργείται εάν thread με την εντολή new Thread(this).start(). Με το που δημιουργείται το thread εκτελείται ο κώδικας της μεθόδου run. Η συνθήκη τερματισμού της μεθόδου run και άρα και του thread είναι η τρέχουσα ώρα (λαμβάνεται μέσω του αντικειμένου board) να γίνει ίση με την ώρα τερματισμού (λαμβάνεται μέσω του αντικειμένου board). Το κάθε thread, χρησιμοποιώντας ένα iterator στη λίστα allflights σαρώνει όλες τις πτήσεις και εάν μία πτήση ανήκει στην αεροπορική εταιρεία του τρέχοντος αντικειμένου, καλεί τη μέθοδο MakeChanges, η οποία υλοποιεί τη μη λειτουργική απαίτηση Α2. package airpr; import java.sql.time; /** * * @author UKXD */ public class Flight { private String fl_departures; private String fl_airline; private String fl_flightno; private String fl_via; private Time fl_expected_time; private Time fl_scheduled_time; private String fl_remarks; //DEPARTURES,AIRLINE,FLIGHT,SCHED_TIME,VIA public Flight(String departure, String airline, String flightno, Time scheduled_time, String via) { this.fl_departures = departure; this.fl_airline = airline; this.fl_flightno = flightno; this.fl_via = via; this.fl_expected_time = new Time(0,0,0); this.fl_scheduled_time = scheduled_time; this.fl_remarks = ""; 35

public String GetDepartures(){ return fl_departures; public String GetAirline(){ return fl_airline; public String GetFlightno(){ return fl_flightno; public String GetVia(){ return fl_via; public Time GetExpectedtime(){ return fl_expected_time; public void SetExpectedtime(Time expectedtime){ fl_expected_time=expectedtime; public Time GetScheduledtime(){ return fl_scheduled_time; public void SetScheduledtime(Time scheduledtime){ fl_scheduled_time=scheduledtime; public String GetRemarks(){ return fl_remarks; public void SetRemarks(String remarks){ fl_remarks=remarks; Στις παρακάτω οθόνες φαίνονται 5 στιγμιότυπα του πίνακα κατά τη διάρκεια εκτέλεσης της εφαρμογής: 36

37

38

ΕΡΩΤΗΣΗ 10 Να δημιουργήσετε και να ενημερώνετε το αρχείο μεταβολών των πτήσεων. Παραθέστε τον κώδικα με τον οποίο η εφαρμογή διαχειρίζεται το αρχείο και τα περιεχόμενα του αρχείου στο τέλος εκτέλεσης της εφαρμογής (βλ. πιο κάτω) ΑΠΑΝΤΗΣΗ 10 Το ερώτημα αναφέρεται στη μη λειτουργική απαίτηση Α4 και υλοποιείται με την κλάση LogWriter και τον κώδικα που έχει χρώμα κόκκινο (βλέπε προηγούμενες κλάσεις). Ο κώδικας της κλάσης LogWriter φαίνεται παρακάτω: package airpr; import java.io.*; /** * * @author ukxd */ public class LogWriter { public PrintWriter outfile = null; public LogWriter () { try { File f; f=new File("airlog.txt"); if(!f.exists()) f.createnewfile(); outfile = new PrintWriter(new BufferedWriter(new FileWriter("airlog.txt"))); catch (IOException ex) { System.err.println("IO error"); public void LogLine(String msg){ 39

outfile.println(msg); Το αποτέλεσμα της καταγράφεται στο αρχείο airlog.txt. Η μέθοδος LogLine χρησιμοποείται για την προσθήκη μιας γραμμής στο αρχείο. ΕΡΩΤΗΣΗ 11 Να υλοποιήσετε την εφαρμογή που αντιστοιχεί στα διαγράμματα κλάσεων και ακολουθίας που σχεδιάσατε. Να τεκμηριώσετε γιατί η δομή του κώδικα του συστήματος αντιστοιχεί στα διαγράμματα κλάσεων και πώς ο κώδικας υλοποιεί τις σχέσεις ανάμεσα στις κλάσεις και τις συμπεριφορές (γεγονότα αποκρίσεις) που περιγράφουν τα διαγράμματα ακολουθίας ΑΠΑΝΤΗΣΗ 11 ΕΡΩΤΗΣΗ 12 Να εκτελέσετε την εφαρμογή για μια ημέρα λειτουργίας του αεροδρομίου. ΑΠΑΝΤΗΣΗ 12 Το αποτέλεσμα της εκτέλεσης για μια ημέρα λειτουργίας του αεροδρομίου είναι ο πίνακας αναχωρήσεων που φαίνεται στην παρακάτω οθόνη: και το αρχείο airlog.txt. 40