Οργάνωση του Βιβλίου σε κεφάλαια
Αντικείμενο και υπηρεσία έχουν δραστικά βελτιώσει τη διαδικασία ανάπτυξης λογισμικού. Η αντικειμενοστρεφής προσέγγιση και η προσέγγιση η βασισμένη στην υπηρεσία, αν και ακούγονται και από πολλούς μάλιστα παρουσιάζονται ως διαφορετικές προσεγγίσεις, έχουν κοινά στοιχεία. Θεωρούμε τη δεύτερη φυσική μετεξέλιξη της πρώτης, καθώς ήρθε ως επακόλουθο της αξιοποίησης του Διαδικτύου και του Παγκόσμιου Ιστού ως πλατφόρμας ανάπτυξης και εκτέλεσης λογισμικού. Αυτό είχε ως αποτέλεσμα, η σύνθεση των υπηρεσιών, τις οποίες τα αντικείμενα προσέφεραν στα πλαίσια της συμμετοχής τους σε μια μονολιθική εφαρμογή για την υλοποίηση των υπηρεσιών της, να υλοποιείται έχοντας ως υπόβαθρο το Διαδίκτυο στο οποίο έχουν πλέον διασπαρεί τα αντικείμενα που τις προσφέρουν.
Τα πρώτα κεφάλαια του βιβλίου αναφέρονται σε μονολιθικές εφαρμογές χρησιμοποιώντας όμως την έννοια της υπηρεσίας. Δίνονται σε αυτά οι βασικές έννοιες και αρχές που διέπουν τη διαδικασία ανάπτυξης με βάση το αντικειμενοστρεφές παράδειγμα. Ο αναγνώστης μεταφέρεται στη συνέχεια σταδιακά στην αξιοποίηση του Διαδικτύου και του Ιστού για την ανάπτυξη και αξιοποίηση υπηρεσιών, μικρο-υπηρεσιών (micro-services) και τέλος Κυβερνοφυσικών μικρο-υπηρεσιών (Cyber-Physical micro-Services[1] -CPuSs) για τη σύνθεση υπηρεσιών ανωτέρου επιπέδου.
Το βιβλίο είναι οργανωμένο σε 12 κεφάλαια.
Πιο συγκεκριμένα, το δεύτερο (2ο) κεφάλαιο με τίτλο “Διεργασίες, Αντικείμενα και Υπηρεσίες” εισάγει, στο πρώτο του μέρος (ενότητες 2.1-2.7), βασικές έννοιες πάνω στις οποίες βασίζεται η αντικειμενοστρεφής προσέγγιση στην ανάπτυξη συστήματος. Μεταξύ άλλων εισάγει τις έννοιες αντικείμενο, κλάση, στιγμιότυπο, σύστημα, αλλά και υπηρεσία. Επίσης τις σχέσεις συνάθροισης (aggregation), γενίκευσης/εξειδίκευσης (gen/spec) μεταξύ αντικειμένων, τις έννοιες της απόκρυψης πληροφορίας (information hiding/encapsulation) και της διεπαφής και υλοποίησης. Στο δεύτερο μέρος του (ενότητα 2.8) δίνονται βασικά στοιχεία γλωσσών προγραμματισμού για τον αναγνώστη που δεν έχει γνώση μιας τουλάχιστον άλλης γλώσσας διαδικαστικού προγραμματισμού.
Το τρίτο (3ο) κεφάλαιο με τίτλο “Εισαγωγή στην Τεχνολογία της Java” εισάγει τα βασικά εργαλεία της Java τεχνολογίας καθώς και τη χρήση τους στη διαδικασία ανάπτυξης εφαρμογής. Για να επιδείξει δε τη χρήση τους, κάνει μια πρώτη εισαγωγή στην έννοια της κλάσης και του στιγμιότυπου και εστιάζει στον ορισμό της κλάσης περιγράφοντας έννοιες όπως δημιουργός, πέρασμα μηνύματος, μεταβλητές στιγμιότυπου, μέσα από την ανάπτυξη μιας απλής εφαρμογής.
Το τέταρτο (4ο) κεφάλαιο με τίτλο “H προσέγγιση Lego” εισάγει τις βασικές έννοιες της δόμησης εφαρμογής σύμφωνα με το αντικειμενοστρεφές παράδειγμα παραλληλίζοντας τη διαδικασία ανάπτυξης με τη διαδικασία δημιουργίας κατασκευών Lego. Κάνει επιπρόσθετα μια εισαγωγή στη βασική βιβλιοθήκη της Java ως αποθήκη έτοιμων Lego[1] εξαρτημάτων με τα οποία μπορούμε να δημιουργήσουμε την κατασκευή μας (εφαρμογή). Μέσα από αυτή τη διαδικασία δίνει τις πολύ βασικές έννοιες, που μας επιτρέπουν να χτίσουμε την πρώτη εφαρμογή μας και να δούμε πάνω σε αυτήν εναλλακτικές επιλογές που έχουμε καθώς και καλές πρακτικές για τη δόμηση του κώδικα.
Το πέμπτο (5ο) κεφάλαιο με τίτλο “Η Java ως αντικειμενοστρεφής γλώσσα” εισάγει τις βασικές κατασκευές της java που υποστηρίζουν την ανάπτυξη εφαρμογής. Κάνει μια σύντομη αναφορά στα στοιχεία που η γλώσσα υιοθετεί από τη C αλλά και τις διαφοροποιήσεις από αυτή. Δίνει επίσης, τα βασικά στοιχεία της που υποστηρίζουν το αντικειμενοστρεφές παράδειγμα προγραμματισμού. Μέσα τέλος από ένα σύνολο Δραστηριοτήτων εξοικειώνει τον αναγνώστη με την αξιοποίηση των κατασκευών της γλώσσας για τη δόμηση της εφαρμογής και τον ορισμό της συμπεριφοράς της.
Το έκτο (6ο) κεφάλαιο με τίτλο “Διαδικασία Ανάπτυξης (Development Process)” αποτελεί μια εισαγωγή στη σύνθεση συστήματος (System Integration) με την αξιοποίηση αφαιρετικών εργαλείων αναπαράστασης δομής και συμπεριφοράς, όπως αυτά που ορίζει η UML. Εισάγει επιπλέον στις βασικές αρχές της διαδικασίας ανάπτυξης μιας εφαρμογής με βάση την αυξητική ανάπτυξη (Incremental development) και τη διαχείριση εκδόσεων. Περιγράφει επίσης την έννοια του μοτίβου σχεδιασμού και παρουσιάζει το μοτίβο σχεδιασμού Παραγωγού/Καταναλωτή το οποίο χρησιμοποιεί και ως μια εισαγωγή για την ανάγκη υποστήριξης από τη γλώσσα της διαχείρισης νημάτων (threads).
Το έβδομο (7ο) κεφάλαιο με τίτλο “ Κληρονομικότητα και Διεπαφές” εισάγει τις βασικές κατασκευές της java που υποστηρίζουν την υλοποίηση της σχέσης γενίκευσης/εξειδίκευσης μεταξύ των εννοιών του προβλήματος. Αναφέρεται δε στη σημασία του μηχανισμού της κληρονομικότητας στην ανάπτυξη εφαρμογών και εισάγει τις abstract κλασεις και τις διεπαφές (interfaces) ως μέσα για την έμμεση υλοποίηση της πολλαπλής κληρονομικότητας. Περιγράφει επίσης το πώς η κληρονομικότητα επηρεάζει τον ορισμό μιας κλάσης και τις εναλλακτικές επιλογές που μας δίνει το περιβάλλον ανάπτυξης. Εισάγει επιπροσθέτως τις βασικές έννοιες του μηχανισμού του interface και επεξηγεί τη σημασία των provided και required interface. Προχωράει ακόμη σε θέματα όπως lambda εκφράσεις και συλλογές (collections). Τέλος, παρουσιάζει τον Πολυμορφισμό δίνοντας παραδείγματα αξιοποίησής του στη διαδικασία ανάπτυξης εφαρμογών. Ο μεγάλος αριθμός Δραστηριοτήτων στοχεύει στη σε βάθος κατανόηση των σύνθετων εννοιών του κεφαλαίου.
Το όγδοο (8ο) κεφάλαιο με τίτλο “Αλληλεπίδραση ανθρώπου-μηχανής και διαχείριση συμβάντων” εισάγει τις βασικές κατασκευές της java που υποστηρίζουν α) την κατασκευή γραφικών διεπαφών (graphical user interfaces-GUI) και β) τον μηχανισμό της διαχείρισης συμβάντων (event handling). Αξιοποιεί επίσης τις κατασκευές των πακέτων swing και awt οι οποίες σε συνδυασμό με τον μηχανισμό του event handling υποστηρίζουν την επικοινωνία της εφαρμογής με τον άνθρωπο. Τονίζει δε τη σημασία της δόμησης του κώδικα με στόχο τη βελτίωση της ευελιξίας (flexibility) και συντηρησιμότητάς (maintainability) του. Παρουσιάζει επιπλέον τα μοτίβα σχεδιασμού Observer-Observable και Model-View-Controller (MVC) και αναφέρεται γενικότερα στο ρόλο των μοτίβων σχεδιασμού στην ανάπτυξη εφαρμογών. Οι δεκαπέντε Δραστηριότητες του κεφαλαίου συμβάλλουν στην πληρέστερη κατανόηση των θεωρητικών εννοιών και την καλύτερη αξιοποίησή τους στη διαδικασία ανάπτυξης εφαρμογής.
Το ένατο (9ο) κεφάλαιο με τίτλο “ Χειρισμός Εξαιρέσεων ” εισάγει τις βασικές έννοιες χειρισμού εξαιρέσεων μέσα από σενάρια της καθημερινής πρακτικής, τον τρόπο που παραδοσιακές γλώσσες τον αντιμετωπίζουν και τα προβλήματα που η διαχείριση αυτή εισάγει στην ποιότητα του κώδικα. Περιγράφει επίσης τις αρχές του μηχανισμού χειρισμού εξαιρετικών περιπτώσεων με στόχο τη διαύγεια του κώδικα (clarity) με ταυτόχρονη όμως διατήρηση της ορθότητας (correctness). Παρουσιάζει την πρόταση try-catch-finally της java για διαχείριση εξαιρετικών περιπτώσεων και την πιο ευέλικτη try-with-resources, που διευκολύνει πολύ τον προγραμματιστή στην περίπτωση που ο κώδικας χρησιμοποιεί πόρους. Τέλος παρουσιάζει το μοτίβο σχεδιασμού του Δημιουργού (Builder design pattern).
Το δέκατο (10ο) κεφάλαιο με τίτλο “Ταυτόχρονος Προγραμματισμός ” χρησιμοποιεί παραδείγματα από τον φυσικό κόσμο για να εισαγάγει την έννοια του νήματος εκτέλεσης (thread of execution) και αναφέρεται στην ανάγκη εφαρμογών να έχουν περισσότερα από ένα νήματα εκτέλεσης. Παρουσιάζει τους μηχανισμούς της γλώσσας που μας επιτρέπουν να δημιουργήσουμε εφαρμογές με περισσότερα από ένα νήματα εκτέλεσης και τα πρόσθετα προβλήματα που η αξιοποίηση των νημάτων εισάγει. Εισάγει ακόμη τις έννοιες της βιωσιμότητας, των παραβιάσεών της και του αμοιβαίου αποκλεισμού στην αξιοποίηση πόρων και των κατασκευών, που μας δίνουν τη δυνατότητα να διασφαλίζουμε βιωσιμότητα και αμοιβαίο αποκλεισμό (mutual exclusion). Χρησιμοποιεί δε τον αλγόριθμο του Dekker, για να παρουσιάσει τα προβλήματα και να δώσει σε αυτά μια πρώτη λύση, η οποία αναδεικνύει την ανάγκη ισχυρότερων κατασκευών. Σηματοφόρος και Ελεγκτής τέλος παρουσιάζονται και χρησιμοποιούνται σε συνδυασμό με κλασικά προβλήματα όπως αυτά του Παραγωγού/Καταναλωτή (Producer/Consumer) και του Κοιμώμενου Κουρέα (Sleeping Barber).
Το ενδέκατο (11ο) κεφάλαιο με τίτλο “Κυβερνοφυσικές Διεργασίες ” εισάγει τις βασικές έννοιες των Κυβερνοφυσικών διεργασιών και των συστημάτων που τις εκτελούν. Περιγράφει δε τη διαδικασία μετατροπής ενός φυσικού αντικειμένου σε Κυβερνοφυσικό ή “έξυπνο” αντικείμενο (smart object), τη σημασία αυτού του μετασχηματισμού και των δυνατοτήτων που αυτός δίνει για ανάπτυξη καινοτόμων εφαρμογών. Τα έξυπνα αντικείμενα μας οδηγούν στη μετάβαση από τις μονολιθικές εφαρμογές στις κατανεμημένες, τις εφαρμογές δηλαδή που θα παρέχουν τις υπηρεσίες τους ως συνεργασία επιμέρους οντοτήτων, μεταξύ των οποίων είναι και τα έξυπνα αντικείμενα. Μέσα από μελέτες περίπτωσης αξιοποιούνται επίσης τεχνικές (μοτίβο αρχιτεκτονικής πελάτη διακομιστή, χρήση εξομοιωτή φυσικού συστήματος), σημειολογίες για μεταφορά πληροφορίας (java serialization και JSON) και εργαλεία (Maven) που συνεισφέρουν στη διαδικασία ανάπτυξης εφαρμογής. Κάνει τέλος μια εισαγωγή στο IoT και στο WoT ως μέσα για την απομακρυσμένη πρόσβαση σε Κυβερνοφυσικές υπηρεσίες.
Το δωδέκατο (12ο) κεφάλαιο με τίτλο “Αντικείμενα και Υπηρεσίες στο Διαδίκτυο ” εισάγει τις βασικές έννοιες που είναι απαραίτητες για τη σύνδεση μιας έξυπνης συσκευής ή ενός συνθετικού Κυβερνοφυσικού Συστήματος στο Διαδίκτυο. Εξετάζονται δε οι εναλλακτικοί τρόποι ανταλλαγής μηνυμάτων, που δίνουν τη δυνατότητα στην έξυπνη συσκευή να αλληλοεπιδρά με άλλες οντότητες. Παρουσιάζονται επίσης βασικές έννοιες της επικοινωνίας μεταξύ οντοτήτων, που βρίσκονται σε διαφορετικούς κόμβους, από το φυσικό επίπεδο μέχρι το επίπεδο εφαρμογής της στοίβας πρωτοκόλλων του Διαδικτύου. Περιγράφει τις βασικές έννοιες της στοίβας πρωτοκόλλων TCP/IP και εξετάζει τις δυνατότητες αξιοποίησης των sockets και του πρωτοκόλλου HTTP. Περιγράφει ακόμη βασικές έννοιες του Παγκόσμιου Ιστού που είναι απαραίτητες για την αξιοποίηση της επικοινωνιακής υποδομής στο επίπεδο του HTTP. Παρουσιάζει τέλος τους μηχανισμούς της Java που υποστηρίζουν τη διαδικασία αυτή και δίνει μέσα από παραδείγματα τη σύνδεση φυσικών αντικειμένων στο διαδίκτυο, είτε ως διακομιστών για την παροχή υπηρεσιών για απομακρυσμένη αξιοποίηση, είτε ως πελατών που, για να παρέχουν τις υπηρεσίες τους στο εξωτερικό τους περιβάλλον, πρέπει να δράσουν ως πελάτες και να αξιοποιήσουν απομακρυσμένες υπηρεσίες (υπολογιστικές ή Κυβερνοφυσικές), που προσφέρουν άλλα αντικείμενα του Διαδικτύου των Αντικειμένων.