Ανάπτυξη και διαχείριση πληροφοριακών συστημάτων

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Εισαγωγή στο μάθημα

Καλώς ήρθατε

Ανάπτυξη και διαχείριση πληροφοριακών συστημάτων

Τρόπος διδασκαλίας

Οι σημειώσεις

Σημείωση: επικοδομητικές παρατηρήσεις στις σημειώσεις έχουν προσφέρει οι φοιτήτριες του τμήματος ΔΕΤ Ιωάννα Γκρίνια (το 2002) και Αλεξάνδρα Σιγάλα (το 2003).

Βιβλία του μαθήματος

Βαθμολογία

Ο τελικός βαθμός κάθε φοιτητή θα βασίζεται σε 2 κριτήρια: Απαραίτητη προϋπόθεση για να περάσει ο φοιτητής το μάθημα είναι η απόδοσή του σε κάθε κατηγορία να καλύπτει τουλάχιστον τη βάση. Η συμμετοχή κάθε κριτηρίου στη διαμόρφωση του τελικού βαθμού είναι περίπου ως εξής:
Ασκηση
40%
Τελικές Εξετάσεις
60%

Ύλη των εξετάσεων

Στις εξετάσεις οι ερωτήσεις:

Ύλη των εξετάσεων

Η σημασία του λογισμικού

Το λογισμικό Μέσα αποθήκευσης γνώσης:
  1. DNA
  2. Εγκέφαλος
  3. Υλικό
  4. Βιβλία
  5. Λογισμικό

Προβλήματα στην υλοποίηση συστημάτων που βασίζονται σε λογισμικό

Η διεργασία ανάπτυξης του λογισμικού καλείται σήμερα να επιλύσει τα παρακάτω συχνά εμφανιζόμενα προβλήματα: Επίσης, πρέπει να απαντηθούν οι παρακάτω προκλήσεις:

Κατηγορίες λογισμικού

Χαρακτηριστικά του λογισμικού

Ιδιότητες του λογισμικού

Ο κύκλος ζωής του λογισμικού

Τεχνολογία λογισμικού

  1. Η εφαρμογή μιας συστηματικής πειθαρχημένης και ποσοτικοποιούμενης προσέγγισης στην ανάπτυξη, λειτουργία και συντήρηση του λογισμικού. με άλλα λόγια η εφαρμογή των τεχνικών του μηχανικού στο λογισμικό.
  2. Η μελέτη προσεγγίσεων στο παραπάνω πρόβλημα.
Η τεχνολογία λογισμικού περιλαμβάνει τις παρακάτω περιοχές:
  1. Απαιτήσεις
  2. Σχεδιασμός
  3. Υλοποίηση
  4. Έλεγχος
  5. Συντήρηση
  6. Διαχείριση σχηματισμών
  7. Διαχείριση του οργανισμού, της διεργασίας (process) και του έργου
  8. Διεργασίες τεχνολογίας λογισμικού
  9. Εργαλεία και μέθοδοι
  10. Ποιότητα

Επισκόπηση του μαθήματος

  1. Διεργασία ανάπτυξης λογισμικού
  2. Απαιτήσεις
  3. Ανάπτυξη πρωτοτύπων
  4. Αρχιτεκτονική σχεδίαση
  5. Ανάλυση και σχεδίαση με UML
  6. Λεπτομερής σχεδίαση και κωδικοποίηση
  7. Εργαλεία και τεχνικές
  8. Επαναχρησιμοποίηση
  9. Επικοινωνία ανθρώπου μηχανής
  10. Απόδοση και μεταφερσιμότητα
  11. Έλεγχος
  12. Συντήρηση
  13. Διαχείριση σχηματισμών
  14. Διοίκηση έργου
  15. Κοστολόγηση
  16. Ο ανθρώπινος παράγοντας
  17. Διαχείριση υπολογιστικών συστημάτων
  18. Διασφάλιση ποιότητας
  19. Μη συμβατικές μεθοδολογίες
  20. Ασφάλεια πληροφοριακών συστημάτων
  21. Προστασία προσωπικών δεδομένων - πολιτικές χρήσης πληροφοριακών συστημάτων

Περιοδικά του χώρου

Γενική βιβλιογραφία

Βιβλιογραφία

Ασκήσεις

  1. Δώστε παραδείγματα παρόμοιων ως προς το υλικό προϊόντων που διαφοροποιούνται κυρίως από το λογισμικό που χρησιμοποιούν.
  2. Δώστε τρία παραδείγματα εφαρμογών για κάθε μια από τις κατηγορίες λογισμικού που αναφέρθηκαν.
  3. Περιγράψτε δύο επιχειρηματικά μοντέλα που να βασίζονται κατά κύριο λόγο σε εξειδικευμένο λογισμικό.

Διεργασία ανάπτυξης λογισμικού

Η έννοια της διεργασίας

Η διεργασία (process) ανάπτυξης του λογισμικού καθορίζει τις τεχνικές και διοικητικές πρακτικές που ακολουθούνται κατά την του λογισμικού.

Η τεχνολογία λογισμικού εξετάζει παράλληλα και

της ίδιας της διεργασίας ανάπτυξης.

Στοιχεία της διεργασίας

Στη διεργασία ανάπτυξης του λογισμικού ξεχωρίζουμε ορισμένες κάθετες φάσεις και μια σειρά από οριζόντιες ενέργειες (umbrella activities) που καλύπτουν όλες τις φάσεις.

Φάσεις

Οι κύριες φάσεις της διεργασίας ανάπτυξης είναι:
  1. Ορισμός (τι;)
  2. Ανάπτυξη (πως;)
  3. Υποστήριξη (αλλαγή) Η υποστήριξη περιλαμβάνει:

Οριζόντιες ενέργειες

Ωριμότητα της διεργασίας

Το CMU Software Engineerint Institute έχει ορίσει τα παρακάτω επίπεδα ωριμότητας της διεργασίας:
  1. Αρχική (initial) (χαώδης)
  2. Επαναλήψιμη (repeatable)
  3. Καθορισμένη (defined) (τεκμηριωμένη)
  4. Διοικούμενη (managed) (με βάση ποσοτικά κριτήρια)
  5. Βελτιστοποιούμενη (optimizing)
Κάθε επίπεδο περιλαμβάνει τα στοιχεία του προηγούμενου.

Το μοντέλο του καταρράκτη

Το μοντέλο του καταρράκτη (waterfall) ακολουθεί γραμμικά τις φάσεις ανάπτυξης του συστήματος:
  1. Ανάλυση
  2. Σχεδιασμός
  3. Κωδικοποίηση
  4. Έλεγχος
  5. Συντήρηση
Κάθε φάση ακολουθεί την προηγούμενη.

Προβλήματα

Ανάπτυξη αρχέτυπου

Το αρχέτυπο (prototype) του λογισμικού επιτρέπει το γρήγορο έλεγχο: Υλοποιείται με συνεχείς κύκλους σε στενή συνεργασία με τον πελάτη.

Προβλήματα

Γρήγορη ανάπτυξη

Το μοντέλο της γρήγορης ανάπτυξης εφαρμογών (rapid application development) χρησιμοποιείται για την ανάπτυξη τυποποιημένων εφαρμογών επεξεργασίας δεδομένων. Περιλαμβάνει τις παρακάτω φάσεις:
  1. Αποτύπωση της επιχειρηματικής λειτουργίας (business modelling)
  2. Αποτύπωση δεδομένων (data modelling)
  3. Αποτύπωση διεργασιών (process modelling)
  4. Υλοποίηση εφαρμογής με εργαλεία τέταρτης γενιάς (4GL)
  5. Έλεγχος

Προβλήματα

Βηματική εκλέπτυνση

Σπειροειδές μοντέλο

Στο σπειροειδές μοντέλο (spiral model) ακολουθεί σε κάθε κύκλο της σπείρας τα παρακάτω βήματα:
  1. Επαφή με τον πελάτη
  2. Σχεδιασμός
  3. Ανάλυση κινδύνου
  4. Υλοποίηση
  5. Μετρήσεις
  6. Αξιολόγηση
Η σπείρα από μέσα προς τα έξω μπορεί να περιλαμβάνει:
  1. Αρχέτυπο
  2. Νέο προϊόν
  3. Βελτιωμένο προϊόν
  4. Συντήρηση

Τυπική ανάπτυξη συστημάτων

Η ανάπτυξη λογισμικού με τυπικές μεθόδους (formal methods):

Προβλήματα

Επαναχρησιμοποίηση

Η ανάπτυξη λογισμικού με επαναχρησιμοποίηση (reusability) βασίζεται σε έτοιμα εξαρτήματα (components). Ακολουθεί τα παρακάτω βήματα:

Ανάλυση προδιαγραφών

Η ανάλυση προδιαγραφών περιλαμβάνει:

Σχεδιασμός

Ο σχεδιασμός καθορίζει:

Τεχνικές

Επαλήθευση και επικύρωση

Ο έλεγχος περιλαμβάνει:

Εξέλιξη

Η εξέλιξη του λογισμικού γίνεται με την παρακάτω διεργασία:

Αυτοματοποίηση της διεργασίας

Για την αυτοματοποίηση της διεργασίας χρησιμοποιούνται τα παρακάτω είδη εργαλείων:

Υλικό στον ιστό

Βιβλιογραφία

Ασκήσεις

  1. Περιγράψτε περιπτώσεις κατα τις οποίες κάποιες κάθετες φάσεις ή οριζόντιες ενέργειες της ανάπτυξης λογισμικού παραλείπονται.
  2. Διαβάστε για το μοντέλο της ωριμότητας λογισμικού στο http://www.sei.cmu.edu (http://www.sei.cmu.edu).
  3. Φτιάξτε έναν κατάλογο με σύγχρονα εργαλεία τέταρτης γενιάς που χρησιμοποιούνται για την υλοποίηση πληροφοριακών συστημάτων.
  4. Τι θεωρείτε πιο σημαντικό: το προϊόν, ή τη διεργασία ανάπτυξής του;

Απαιτήσεις

Είδη απαιτήσεων

Προϊόν / διεργασία

Απαιτήσεις από το προϊόν

Επίπεδα εμβάθυνσης

Οδηγοί

Οι προδιαγραφές οδηγούνται κατά κύριο λόγο από: Στη διαμόρφωση των προδιαγραφών συμμετέχουν οι παρακάτω εταίροι (stakeholders): Στοιχεία μπορούν ακόμα να προέλθουν και από άλλες πηγές όπως μελέτες αγοράς.

Ο κύκλος ζωής των απαιτήσεων

  1. Εκμαίευση (elicitation)
  2. Ανάλυση και διαπραγμάτευση (analysis and negotiation)
  3. Καθορισμός (specification)
  4. Επικύρωση (validation)

Τεχνικές εκμαίευσης


Ανάλυση απαιτήσεων

Η ανάλυση των απαιτήσεων γίνεται με την περιγραφή του Για την περιγραφή του ιδεατού μοντέλου χρησιμοποιούνται τα παρακάτω διαγράμματα της UML: Για την περιγραφή του μοντέλου απαιτήσεων χρησιμοποιούνται τα παρακάτω διαγράμματα της UML:

Καθορισμός λειτουργικών απαιτήσεων

Περιγράφουν τις δυνατότητες (capabilities) του συστήματος. Πρέπει να είναι:

Καθορισμός μη λειτουργικών απαιτήσεων

Απαιτήσεις από το προϊόν

Απαιτήσεις από τη διεργασία ανάπτυξης

Εξωτερικές απαιτήσεις

Μετρικές μη λειτουργικών απαιτήσεων

Επικύρωση απαιτήσεων

Οι παραπάνω έλεγχοι μπορούν να γίνουν με:

Διαχείριση απαιτήσεων

Η διαχείριση των προδιαγραφών περιλαμβάνει τα παρακάτω στοιχεία: Τα στοιχεία ιχνηλασιμότητας που πρέπει να φυλάσσονται είναι τα παρακάτω:

Το έγγραφο προδιαγραφής απαιτήσεων συστήματος

Το έγγραφο προδιαγραφών απαιτήσεων από το σύστημα (system requirements document) περιέχει τα παρακάτω στοιχεία (Σκορδαλάκης 1991, σ. 54):
  1. Ορισμός του προβλήματος
  2. Αιτιολόγηση του προβλήματος
  3. Σκοπός του συστήματος και του έργου
  4. Περιορισμοί στο σύστημα και στο έργο
  5. Λειτουργίες ανά συνιστώσα του προβλήματος
    1. Υλικό
    2. Λογισμικό
    3. 'Aνθρωποι
  6. Χαρακτηριστικά χρηστών
  7. Περιβάλλοντα
    1. ανάπτυξης,
    2. λειτουργίας και
    3. συντήρησης
  8. Στρατηγική λύσης του προβλήματος
  9. Προτεραιότητες στα χαρακτηριστικά του συστήματος
  10. Κριτήρια αποδοχής του συστήματος
  11. Πηγές πληροφοριών
  12. Λεξιλόγιο

Το έγγραφο προδιαγραφής απαιτήσεων λογισμικού

Το έγγραφο προδιαγραφών απαιτήσεων από το λογισμικό (software requirements document) περιέχει τα παρακάτω στοιχεία (Σκορδαλάκης 1991, σ. 63):
  1. Εισαγωγή
    1. Σκοπός
    2. Έκταση
    3. Ορισμοί, ακρονυμίες και συντομογραφίες
    4. Αναφορές
    5. Γενική εικόνα
  2. Γενική περιγραφή
    1. Προοπτική του προϊόντος
    2. Λειτουργίες
    3. Χαρακτηριστικά των χρηστών
    4. Γενικοί περιορισμοί
    5. Παραδοχές και εξαρτήσεις
  3. Ειδικές απαιτήσεις
    1. Λειτουργικές απαιτήσεις
      1. Λειτουργική απαίτηση 1
        1. Εισαγωγή
        2. Είσοδοι
        3. Επεξεργασία
        4. Έξοδοι
      2. Λειτουργική απαίτηση 1
      3. ...
      4. Λειτουργική απαίτηση ν
    2. Απαιτήσεις εξωτερικών διαπροσωπειών
      1. Διαπροσωπείες χρήστη (user interfaces)
      2. Διαπροσωπείες υλικού (hardware interfaces)
      3. Διαπροσωπείες λογισμικού (software interfaces)
      4. Διαπροσωπείες επικοινωνιών (communication interfaces)
    3. Απαιτήσεις επίδοσης
    4. Περιορισμοί σχεδίασης
      1. Συμμόρφωση με τα πρότυπα
      2. Περιορισμοί από το υλικό
    5. Ιδιώματα
      1. Διαθεσιμότητα
      2. Ασφάλεια
      3. Συντηρισιμότητα
      4. Μεταφερσιμότητα
    6. 'Αλλες απαιτήσεις
      1. Βάση δεδομένων
      2. Τρόποι λειτουργίας
      3. Προσαρμογή στο χώρο εγκατάστασης
  4. Παραρτήματα
  5. Ευρετήριο

Συχνά λάθη

Συχνά η περιγραφή των απαιτήσεων γίνεται σε φυσική γλώσσα. Κατά την περιγραφή των απαιτήσεων πρέπει να αποφεύγονται τα παρακάτω συχνά λάθη:

Βιβλιογραφία

Ασκήσεις

  1. Καταγράψτε το έγγραφο προσδιορισμού απαιτήσεων λογισμικού για την υλοποίηση ενός προγράμματος επεξεργασίας κειμένου συμβατού με το πρόγραμμα Microsoft Word. Καλύψτε το πλήρες πλάτος του εγγράφου χωρίς να επεκταθείτε σε λεπτομέρειες.
  2. Εξηγήστε ποιοι εταίροι θα πρέπει να συμμετέχουν στη διαδικασία συλλογής απαιτήσεων για το πληροφοριακό σύστημα του πανεπιστημίου.
  3. Απαριθμίστε συστήματα όπου οι απαιτήσεις τους επηρεάζονται σημαντικά από πολιτικούς και κοινωνικούς παράγοντες.

Ανάπτυξη αρχετύπων

Ο ρόλος της ανάπτυξης αρχετύπων

Κατά την ανάλυση των προδιαγραφών

'Αλλα πλεονεκτήματα

Έρευνα σε 39 έργα που χρησιμοποιήθηκαν τεχνικές δημιουργίας αρχέτυπου βρήκε τα παρακάτω πλεονεκτήματα:

Εξελικτική ανάπτυξη με αρχέτυπο

Η εξελικτική ανάπτυξη αρχετύπου (evolutionary prototyping) έχει ως στόχο την ανάπτυξη του τελικού συστήματος με τη διαδοχική εξέλιξη του αρχέτυπου. Τα πλεονεκτήματα της μεθοδολογίας αυτής είναι: Τα βασικά χαρακτηριστικά της μεθοδολογίας είναι:

Προβλήματα

Ανάπτυξη με αρχέτυπο που θα πεταχτεί

Η ανάπτυξη με αρχέτυπο που θα πεταχτεί (throw-away prototyping) έχει ως κύριο στόχο τη δημιουργία της επικυρωμένης προδιαγραφής του τελικού συστήματος. Το αρχέτυπο που θα υλοποιηθεί μπορεί να χρησιμοποιηθεί και για εκπαίδευση, έλεγχο ή επαναχρησιμοποίηση εξαρτημάτων, αλλά δε θα αποτελέσει το τελικό σύστημα. Οι λόγοι είναι οι παρακάτω:

Τεχνικές δημιουργίας αρχέτυπου

Γλώσσες υψηλού επιπέδου

Συχνά αρχέτυπα μπορούν να αναπτυχθούν αποτελεσματικά με δυναμικές γλώσσες υψηλού επιπέδου (dynamic high high-level languages). Η γλώσσες αυτές υποστηρίζουν αυτόματη διαχείριση της μνήμης, σύνθετες δομές δεδομένων και - συχνά - προσφέρουν πρόσθετες δυνατότητες σε κάποιο εξειδικευμένο πεδίο. Παραδείγματα τέτοιων γλωσσών είναι:
ΓλώσσαΠεδίο / πρόσθετες δυνατότητες
SmalltalkΓραφικές διεπαφές
JavaΓραφικές διεπαφές, εφαρμογές στο Internet
PrologΣυμβολική επεξεργασία με βάση τη λογική
Lisp, MLΣυμβολική επεξεργασία με βάση τις συναρτήσεις
Perl, awk, RubyΕπεξεργασία συμβολοσειρών
PHP, ASPΕφαρμογές Web

Συστήματα δημιουργίας εφαρμογών βάσεων δεδομένων

Περιλαμβάνουν εργαλεία για: Παραδείγματα: Προβλήματα:

Σύνδεση εξαρτημάτων και εφαρμογών

Σύνδεση ολοκληρωμένων εφαρμογών ή εργαλείων

Παράδειγμα: ορθογραφικός έλεγχος του πρόχειρου (clipboard) των Windows με εργαλεία του Unix και της σουίτας outwit:
winclip -p | tr -c [a-zA-Z] \n | tr [A-Z] [a-z] | sort | uniq | comm -23 - /usr/dict/words

winclip -p | 			# Paste the clipboard on standard output
tr -c [a-zA-Z] \n | 		# Convert all non-alhpabetic characters to newlines
tr [A-Z] [a-z] | 		# Convert to lowercase
sort | 				# Sort
uniq | 				# Remove duplicates
comm -23 - /usr/dict/words	# Display lines not in dictionary

Σύνδεση εξαρτημάτων

Με γλώσσες όπως: Παράδειγμα: εφαρμογή κράτησης θέσεων από το Internet σε Visual Basic. Χρησιμοποιεί εξαρτήματα πίνακα, ημερολογίου, ανταλλαγής στοιχείων μέσω Internet, σύνδεσης με βάση δεδομένων, και εμφάνισης ώρας.

Προβλήματα

Αρχέτυπα διεπαφής του χρήστη

Το περιβάλλον της Visual Basic

Μια εφαρμογή Visual Basic υλοποιείται με βάση διάφορες φόρμες (forms) που ορίζουν τα περιεχόμενα για αντίστοιχα παράθυρα. Κάθε φόρμα έχει, όπως και τα όργανα, ιδιότητες και μεθόδους.

Το περιβάλλον υλοποίησης της Visual Basic έχει την παρακάτω μορφή:

Για να ορίσουμε τον κώδικα που εκτελείται για κάποιο γεγονός κάνουμε διπλό κλικ σε κάποιο όργανο και αυτόματα δημιουργείται η δήλωση για τη συνάρτηση που αφορά το πιο χρήσιμο γεγονός για το αντίστοιχο όργανο. Από επιλογές στην κορυφή του παραθύρου μπορούμε να επιλέξουμε το όργανο και το γεγονός για τα οποία θέλουμε να γράψουμε κώδικα:

Παράθυρα, εικονίδια, μενού, και δείκτης

Στο σύγχρονο περιβάλλον διεπαφής με το χρήστη βασίζεται στα παράθυρα (windows), τα εικονίδια (icons), τα μενού (menus) και το δείκτη (pointer).

Το περιβάλλον αυτό σχεδιάστηκε για πρώτη φορά στο Palo Alto Research Center της Xerox (PARC) και υλοποιήθηκε με επιτυχία από την Apple για τους υπολογιστές Macintosh και από τη Micosoft στην οικογένεια Windows. Η επιφάνεια εργασίας χρησιμοποιεί ως βάση τη μεταφορά του γραφείου (desktop metaphor). Ο χρήστης μετακινεί πάνω στην οθόνη παράθυρα με τη χρήση του δείκτη όπως θα κινούσε έγγραφα στο γραφείο με τα χέρια του. Βασικά τεχνολογικά στοιχεία για τη λειτουργία του περιβάλλοντος αυτού είναι η οθόνη χαρτογραφικής απεικόνισης (bitmap display) και το ποντίκι (mouse) ή κάποιος άλλος αντίστοιχος μηχανισμός που επιτρέπει στο χρήστη να δείχνει αντικείμενα στην οθόνη. Με τη χρήση εικονιδίων ορισμένα στοιχεία του περιβάλλοντος μπορούν να παρασταθούν με αμεσότητα, ενώ τα μενού κάνουν τις λειτουργίες του περιβάλλοντος προσιτές χωρίς να χρειάζεται ο χρήστης να απομνημονεύει εντολές και τη σύνταξή τους.


Εικονίδια στο περιβάλλον Windows


Εισαγωγή εικόνας στο κείμενο με τη χρήση μενού στο πρόγραμμα Microsoft Word

<img src="./proto/inspic.gif"> 
Εισαγωγή εικόνας στο κείμενο στη γλώσσα HTML

Υλοποίηση διεπαφών στη Visual Basic

Το περιβάλλον προγραμματισμού Visual Basic επιτρέπει τη γραφική σχεδίαση εφαρμογών με τη χρήση οργάνων και τον άμεσο ορισμό κώδικα που θα αποκρίνεται σε συγκεκριμένα γεγονότα. Για το σκοπό αυτό η Visual Basic απλοποιεί το περιβάλλον προγραμματισμού που ορίζουν τα Windows δίνοντας στο χρήστη μια σειρά από εξειδικευμένα όργανα (βασισμένα σε αυτά των Windows) και έναν τρόπο να ορίζει ο χρήστης την εμφάνιση του κάθε οργάνου, τις λειτουργίες του και τον τρόπο που αυτό ανταποκρίνεται σε γεγονότα. Έτσι, κάθε όργανο παριστάνεται ως ένα αντικείμενο που διαθέτει: Ο έλεγχος που έχει ο χρήστης πάνω στα όργανα διαφέρει ανάλογα με την κατάσταση της εφαρμογής:

Όργανα

Όργανα τοποθετούνται μέσα στην εφαρμογή με γραφικό τρόπο κατά την υλοποίησή της. Κάθε όργανο διακρίνεται από το όνομά του. Αν πολλά όργανα ίδιου τύπου έχουν το ίδιο όνομα τότε αυτά ορίζουν έναν πίνακα οργάνων τον οποίο μπορούμε να διατρέξουμε με τη χρήση ενός δείκτη (π.χ. txtTextBox(i).text = "hello").

Το περιβάλλον της Visual Basic ορίζει τα παρακάτω βασικά όργανα:

TextBox
Όργανο για είσοδο κειμένου
Label
Εμφάνιση κειμένου
PictureBox
Περιοχή για εμφάνιση και σχεδίαση γραφικών κατά τη διάρκεια εκτέλεσης του προγράμματος.
CheckBox
Επιλογή τύπου ναι/όχι (μπορούν να είναι αληθείς πολλαπλές τέτοιες επιλογές)
OptionButton
Επιλογή τύπου ναι/όχι (δεν μπορούν να είναι αληθείς πολλαπλές τέτοιες επιλογές)
CommandButton
Κουμπί για εντολές
Image
Χαρτογραφική εικόνα που μπορεί να ορίσει ο χρήστης
Shape
Σχήμα που μπορεί να οριστεί κατά τη σχεδίαση της εφαρμογής.
Timer
Χρονόμετρο που δημιουργεί γεγονότα σε τακτά διαστήματα.
ListBox
Λίστα με επιλογές.
ComboBox
Λίστα με επιλογές σε συνδυασμό με περιοχή που μπορεί να γραφτεί κείμενο
VScrollBar
Κάθετο όργανο ελέγχου της θέσης στο παράθυρο.
HScrollBar
Οριζόντιο όργανο ελέγχου της θέσης στο παράθυρο.
Frame
Περιοχή στην οποία μπορούν να ομαδοποιηθούν πολλά όργανα (ειδικά OptionButton)
Εκτός από τα παραπάνω βασικά όργανα μπορεί κανείς να ορίσει ή να αγοράσει πολλά άλλα όργανα που εκτελούν χρήσιμες λειτουργίες όπως π.χ. σύνδεση με βάσεις δεδομένων και το Internet, εμφάνιση γραφημάτων και πινάκων. Τα όργανα αυτά μπορούν να θεωρηθούν εξαρτήματα (components) για την υλοποίηση εφαρμογών.

Γεγονότα

Κάθε όργανο έχει το δικό του σύνολο από γεγονότα τα οποία μπορεί να δεχτεί. Ορισμένα από τα γεγονότα τα οποία αφορούν πολλά όργανα είναι τα παρακάτω:
Click
Click του ποντικιού πάνω στο όργανο.
DblClick
Διπλό click του ποντικιού πάνω στο όργανο.
GotFocus
Το όργανο γίνεται η εστία εισόδου.
LostFocus
Το όργανο παύει να είναι η εστία εισόδου.
KeyDown
Ένα πλήκτρο πατιέται πάνω από το όργανο.
KeyUp
Ένα πλήκτρο αφήνεται πάνω από το όργανο.
KeyPress
Ένας χαρακτήρας γράφεται πάνω από το όργανο.
MouseDown
Ένα πλήκτρο του ποντικιού πατιέται πάνω από το όργανο.
MouseUp
Ένα πλήκτρο του ποντικιού αφήνεται πάνω από το όργανο.
MouseMove
Το ποντίκι κινείται πάνω από το όργανο.
Change
Τα δεδομένα που περιέχει το όργανο άλλαξαν.
Η σύνδεση του γεγονότος με κώδικα της Visual Basic γίνεται με τον ορισμό μιας συνάρτησης που έχει ως όρισμα παραμέτρους που αφορούν το συγκεκριμένο όργανο. Παράδειγμα:
Private Sub Check1_KeyPress(KeyAscii As Integer)

End Sub

Private Sub Check1_KeyUp(KeyCode As Integer, Shift As Integer)

End Sub

Private Sub Check1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

End Sub

Private Sub Command1_Click()

End Sub

Private Sub Text1_Change()

End Sub

Ιδιότητες

Οι ιδιότητες που αφορούν κάθε όργανο μπορούν να μεταβληθούν τόσο κατά το σχεδιασμό, όσο και κατά την εκτέλεση της εφαρμογής. Πρόσβαση στις ιδιότητες κατά την εκτέλεση της εφαρμογής έχουμε με τη σύνταξη όργανο.ιδιότητα. Μερικές ιδιότητες που εμφανίζονται σε πολλά όργανα είναι οι παρακάτω:
Name
Το όνομα του συγκεκριμένου οργάνου.
BackColor
Το χρώμα του φόντου.
ForeColor
Το χρώμα σχεδίασης.
Enabled
Αληθές αν το όργανο είναι ενεργό.
Visible
Αληθές αν το όργανο είναι ορατό.
Text
Το κείμενο που περιέχει το όργανο.
Caption
Το κείμενο που εμφανίζει το όργανο.
Value
Η τιμή που έχει το όργανο (π.χ. αληθές/ψευδές).
ToolTipText
Το αναδυόμενο κείμενο σύντομης βοήθειας.
Height
Το ύψος του οργάνου.
Left
Η θέση του οργάνου στη φόρμα από αριστερά.
Top
Η θέση του οργάνου στη φόρμα από πάνω.
Width
Το πλάτος του οργάνου.

Η γλώσσα Visual Basic

Η γλώσσα Visual Basic είναι μια δομημένη γλώσσα με τύπους που υποστηρίζει, μερικώς, τον προγραμματισμό με αντικείμενα (δεν υποστηρίζει κληρονομικότητα). Στις επόμενες παραγράφους περιγράφουμε πολύ συνοπτικά ορισμένα βασικά στοιχεία της:

Ορισμός συναρτήσεων

function funcname(param1 as type1, param2 as type2) as returntype
end function
Παράδειγμα:
function square(x as double) as double
        square = x * x
end function
Διαδικασίες (συναρτήσεις που δεν επιστρέφουν τιμή) ορίζονται αντίστοιχα, αλλά με τη λέξη sub αντί για function.

Τύποι

Ορισμένοι βασικοί τύποι είναι οι boolean, integer, single, double, string.

Ορισμός μεταβλητών

Μεταβλητές ορίζονται με τη σύνταξη:
dim varname as type
Παράδειγμα:
        dim x as double
        dim k as integer

Εντολές

Οι εντολές τερματίζονται από το τέλος της γραμμής Παράδειγμα:
        x = 3
        txt.Text = "Hello"

Σχόλια

Τα σχόλια αρχίζουν με το χαρακτήρα '

Δομές ελέγχου

Η Visual Basic παρέχει τις παρακάτω δομές ελέγχου (σε σχόλιο η αντίστοιχη δομή της C).
' if (...) { ... } else { ... }
if boolean then
	statement
	...
else
	statement
	...
end if

' for (v = start; v <= end; v++) { ... }
for variable = start to end
	statement
	...
next variable

' while (...) {  ... }
do while boolean
	statement
	...
loop

' do { ... } while (...)
do
	statement
	..
loop while boolean

' switch (c) { case ... default: }
Select Case testexpression
Case expressionlist
	statement
	...
Case Else
	statement
	...
End Select

Βιβλιογραφία

Ασκήσεις

  1. Σχεδιάστε τη διεπαφή του Microsoft Word στο περιβάλλον της Visual Basic.
  2. Να παραθέσετε 10 διαφορετικά συστήματα λογισμικού και αντίστοιχες μεθόδους υλοποίησης με αρχέτυπο που θα χρησιμοποιούσατε.
  3. Σχεδιάστε με χαρτί και μολύβι το αρχέτυπο για μια εφαρμογή αναπαραγωγής μουσικών αρχείων MP3.
  4. Διαβάστε για την τεχνολογία OLE automation. Σε τι είδους αρχέτυπα μπορεί να χρησιμοποιηθεί;

Αρχιτεκτονική σχεδίαση

Στοιχεία του σχεδίου

Βασικές έννοιες

Αφαίρεση (abstraction)

Η αφαίρεση επιτυγχάνεται στα παρακάτω επίπεδα:

Εκλέπτυνση (refinement)

Η βηματική εκλέπτυνση (stepwise refinement) είναι ένας τρόπος για να δαμάσει κανείς το πλήθος των λεπτομερειών του τελικού σχεδίου.

Τμηματικότητα (modularity)

Η τμηματικότητα ενός σχεδίου μειώνει τη συνολική πολυπλοκότητα του συστήματος και κατά συνέπεια το κόστος υλοποίησης και το ενδεχόμενο λαθών. Μια καλή μέθοδος σχεδιασμού πρέπει να επιτρέπει:

Συνεκτικότητα (cohesion)

Ο καλός σχεδιασμός πρέπει να φέρνει κοντά τμήματα που εμφανίζουν υψηλή συνεκτικότητα. Διακρίνουμε τα παρακάτω αυξανόμενα επίπεδα συνεκτικότητας:
  1. συμπτωματική συνεκτικότητα (coincidental cohesion)
  2. λογική συνεκτικότητα (logical cohesion)
  3. χρονική συνεκτικότητα (temporal cohesion)
  4. διαδικαστική συνεκτικότητα (procedural cohesion)
  5. επικοινωνιακή συνεκτικότητα (communicational cohesion)
  6. ακολουθιακή συνεκτικότητα (sequential cohesion)
  7. λειτουργική συνεκτικότητα (functional cohesion)

Σύζευξη (coupling)

Ο καλός σχεδιασμός πρέπει κατά το δυνατόν να αποφεύγει τη σύζευξη μεταξύ τμημάτων. Διακρίνουμε τα παρακάτω αυξανόμενα επίπεδα σύζευξης:
  1. σύζευξη δεδομένων (data coupling)
  2. σύζευξη δομής δεδομένων (stamp coupling) (ή αντιγράφου)
  3. σύζευξη ελέγχου (control coupling)
  4. σύζευξη κοινών δεδομένων (common coupling) (ή από κοινού σύνδεση)
  5. σύζευξη εξωτερικών δεδομένων (external coupling)
  6. σύζευξη περιεχομένων (content coupling)

Αρχές σχεδιασμού

Δομή του συστήματος

Μοντέλα ελέγχου

Αποσύνθεση σε τμήματα

Η αποσύνθεση σε τμήματα μπορεί να γίνει με βάση:

Εξειδικευμένες αρχιτεκτονικές

Ορισμένες εφαρμογές αναπτύσσονται με βάση τυποποιημένες αρχιτεκτονικές για το συγκεκριμένο πεδίο. Παραδείγματα:

Το έγγραφο περιγραφής σχεδίου λογισμικού

Το έγγραφο περιγραφής σχεδίου λογισμικού (software design description) περιέχει τα παρακάτω στοιχεία (Γιακουμάκης 1994, σ. 250):
  1. Εισαγωγή
    1. Σκοπός
    2. Γενική άποψη
    3. Ορισμοί και ακρονυμίες
  2. Αναφορές
  3. Περιγραφή αποσύνθεσης
    1. Αποσύνθεση σε μονάδες
      1. Περιγραφή μονάδας 1
      2. Περιγραφή μονάδας 2
    2. Αποσύνθεση σε ταυτόχρονες διεργασίες
      1. Περιγραφή διεργασίας 1
      2. Περιγραφή διεργασίας 2
    3. Αποσύνθεση δεδομένων
      1. Περιγραφή οντότητας δεδομένων 1
      2. Περιγραφή οντότητας δεδομένων 2
  4. Περιγραφή εξαρτήσεων
    1. Διεπαφές μονάδων
      1. Περιγραφή μονάδας 1
      2. Περιγραφή μονάδας 2
    2. Διεπαφές διεργασιών
      1. Περιγραφή διεργασίας 1
      2. Περιγραφή διεργασίας 2
  5. Λεπτομερές σχέδιο
    1. Λεπτομερές σχέδιο μονάδων
      1. Λεπτομερές σχέδιο μονάδας 1
      2. Λεπτομερές σχέδιο μονάδας 2
    2. Λεπτομερές σχέδιο διεργασιών
      1. Λεπτομερές σχέδιο διεργασίας 1
      2. Λεπτομερές σχέδιο διεργασίας 2

Βιβλιογραφία

Ασκήσεις

  1. Περιγράψτε τα πλεονεκτήματα και μειονεκτήματα των δομικών αρχιτεκτονικών μοντέλων που εξετάσαμε. Για κάθε μοντέλο δώστε ένα παράδειγμα εφαρμογής που το ακολουθεί.
  2. Δώστε το κατάλληλο δομικό μοντέλο για κάθε ένα από τα παρακάτω συστήματα:
  3. Επιλέξτε μια εφαρμογή που γνωρίζετε και γράψτε τα κύρια στοιχεία του εγγράφου περιγραφής σχεδίου λογισμικού.

Ανάλυση και σχεδίαση με UML

Εισαγωγή

Η ενοποιημένη γλώσσα σχεδιασμού (unified modeling language) (UML) είναι μια γραφική γλώσσα για την οπτική παράσταση, τη διαμόρφωση προδιαγραφών και την τεκμηρίωση συστημάτων που βασίζονται σε λογισμικό. Η UML στοχεύει στο σχεδιασμό αντικειμενοστρεφών συστημάτων. Το σχέδιο είναι μια απλοποιημένη παράσταση της πραγματικότητας.

Σχεδιάζουμε για να μπορέσουμε να καταλάβουμε το σύστημα που αναπτύσσουμε. Έτσι δημιουργώντας ένα σχέδια επιτυγχάνουμε τέσσερεις στόχους:

  1. παριστάνουμε οπτικά το σύστημα που έχουμε ή θέλουμε να κατασκευάσουμε,
  2. προσδιορίζουμε τη δομή και τη συμπεριφορά του συστήματος,
  3. δημιουργούμε ένα πρότυπο για να βασίσουμε την κατασκευή του συστήματος,
  4. τεκμηριώνουμε τις αποφάσεις που λάβαμε.

Σε όλους τους τεχνολογικούς τομείς ο σχεδιασμός βασίζεται σε τέσσερεις βασικές αρχές:

  1. η επιλογή του είδους του σχεδίου έχει επίπτωση στον τρόπο και την μορφή επίλυσης του προβλήματος,
  2. όλα τα σχέδια εκφράζονται σε διαφορετικές βαθμίδες ακρίβειας,
  3. τα καλύτερα σχέδια σχετίζονται με την πραγματικότητα,
  4. ένα είδος σχεδίων δεν είναι ποτέ αρκετό.

Η UML περιλαμβάνει τρία βασικά στοιχεία:

  1. Οντότητες
  2. Σχέσεις
  3. Διαγράμματα
Η UML είναι μια πλήρης και πλούσια γλώσσα με εξαιρετικά ευρύ πεδίο εφαρμογής. Στο μάθημα αυτό θα εξετάσουμε εξαιρετικά συνοπτικά τον τρόπο παράστασης ορισμένων αντικειμενοστρεφών δομών σε UML.

Διαγράμματα

Η UML ορίζει τα παρακάτω διαγράμματα:

Κλάσεις

Σχέσεις

Στη UML ορίζονται τέσσερεις βασικές σχέσεις:
  1. εξάρτηση (dependency)
  2. γενίκευση (generalisation)
  3. σύνδεση (association)
  4. υλοποίηση (realisation)

Εξάρτηση

Η εξάρτηση δηλώνει πως μια αλλαγή σε μιαν οντότητα θα επηρεάσει μιαν άλλη αλλά όχι απαραίτητα και το αντίστροφο. Παριστάνεται με μια διακεκομμένη γραμμή με ανοιχτό βέλος που δείχνει προς την οντότητα που υπάρχει εξάρτηση:

Γενίκευση

Η γενίκευση δηλώνει μια σχέση ανάμεσα σε κάτι γενικό (τη βασική κλάση ή αλλιώς γονέα) και κάτι ειδικό (μιαν υποκλάση ή αλλιώς παιδί της). Παριστάνεται με μια συνεχή γραμμή με κλειστό βέλος που δείχνει προς τη βασική κλάση:

Σύνδεση

Η σύνδεση αναφέρεται σε αντικείμενα τα οποία συνδέονται με κάποιο τρόπο με άλλα. Όταν δύο κλάσεις είναι συνδεδεμένες μπορεί κανείς να μεταβεί από αντικείμενα της μιας σε αντικείμενα της άλλης. Η σύνδεση παριστάνεται με μια ευθεία γραμμή ανάμεσα στα δύο αντικείμενα.

Αν σε μια σχέση τα αντικείμενα απαρτίζουν τμήματα ενός όλου, τότε αυτή απεικονίζεται ως συγκρότημα (aggregation) με την παράσταση ενός διαμαντιού στην άκρη του "όλου".

Αν σχέση τα αντικείμενα που απαρτίζουν τμήματα ενός όλου έχουν την ίδια διάρκεια ζωής με το όλο, τότε αυτή απεικονίζεται ως σύνθεση (composition) με την παράσταση ενός γεμάτου διαμαντιού στην άκρη του "όλου".

Υλοποίηση

Η υλοποίηση δηλώνει πως ο εξυπηρετούμενος (αυτός που βρίσκεται στην ουρά του βέλους) υποστηρίζει τη διεπαφή (τουλάχιστον όλες τις πράξεις) που ορίζονται από τον παροχέα (αυτόν που βρίσκεται στην κεφαλή του βέλους):

Είδη εξαρτήσεων

Με τη χρήση μιας εξάρτησης εκφράζουμε σημασιολογικές (semantic) σχέσεις ανάμεσα σε στοιχεία του μοντέλου. Σε τέτοιες περιπτώσεις μια αλλαγή σε ένα στοιχείο της εξάρτησης μπορεί να έχει επίπτωση στο άλλο. Διακρίνουμε τα παρακάτω είδη εξάρτησης:
πρόσβαση (access)
'Αδεια σε κάποια στοιχεία από ένα τμήμα να έχουν πρόσβαση σε στοιχεία από άλλο τμήμα (access).
σύνδεση (binding)
Παροχή τιμών σε ένα πρότυπο για να δημιουργήσει ένα νέο στοιχείο (bind).
κλήση (call)
Μια μέθοδος καλεί μια άλλη (call).
απόρροια (derivation)
Ένα στοιχείο που μπορεί να υπολογιστεί από κάποιο άλλο (derive).
friend
Ένα στοιχείο μπορεί να έχει πρόσβαση σε στοιχεία άλλης κλάσης παρά τους όποιους περιορισμούς (friend).
εισαγωγή (import)
'Αδεια σε ένα τμήμα να εισάγει και να χρησιμοποιήσει τα στοιχεία ενός άλλου τμήματος (import).
δημιουργία (instantiation)
Μια μέθοδος μιας κλάσης δημιουργεί αντικείμενα μιας άλλης κλάσης (instantiate).
παράμετρος (parameter)
Σχέση ανάμεσα σε μια λειτουργία και τις παραμέτρους της (parameter).
δημιουργία (realization)
Σχέση ανάμεσα σε μια προδιαγραφή και την υλοποίησή της (realize).
εκλέπτυνση (refinement)
Δήλωση για την ύπαρξη απεικόνισης ανάμεσα σε δύο σημασιολογικά επίπεδα (refine).
αποστολή (send)
Σχέση ανάμεσα στον αποστολέα και τον παραλήπτη ενός μηνύματος (send).
ίχνος (trace)
Σχέση ανάμεσα σε δύο στοιχεία δύο διαφορετικών μοντέλων που δεν αποτελεί όμως απεικόνιση (trace).
χρήση (usage)
Ένα στοιχείο απαιτεί την ύπαρξη ενός άλλου στοιχείο για τη λειτουργία του (π.χ. call, instantiate, parameter, send) (use).
Στο διάγραμμα της UML γράφουμε μέσα σε εισαγωγικά το είδος της εξάρτησης (αυτό που εμφανίζεται στο τέλος κάθε ορισμού στον παραπάνω πίνακα) πάνω από την αντίστοιχη γραμμή με το βέλος:

Διαγράμματα περιπτώσεων χρήσης

Το διάγραμμα περιπτώσεων χρήσης χρησιμοποιείται για να μοντελοποιήσει το πλαίσιο λειτουργίας του συστήματος καθώς και τις προδιαγραφές του. Περιλαμβάνει:

Παράδειγμα:

Διάγραμμα κλάσεων

Το διάγραμμα των κλάσεων ενός συστήματος είναι ένα διάγραμμα δομής που περιέχει τις κλάσεις μαζί με του αντίστοιχους δεσμούς εξάρτησης, γενίκευσης και σύνδεσης. Έτσι ένα διάγραμμα κλάσεων μπορεί να απεικονίσει τη χρήση της κληρονομικότητας στο σχεδιασμό με τη χρήση δεσμών γενίκευσης όπως στο παρακάτω σχήμα:

Διάγραμμα αντικειμένων

Τα διαγράμματα αντικειμένων είναι διαγράμματα δομής που χρησιμοποιούνται για το σχεδιασμό της στατικής κατάστασης του συστήματος κατά μια συγκεκριμένη χρονική στιγμή. Κάθε αντικείμενο σχεδιάζεται ως ένα ορθογώνιο με την παρακάτω μορφή:

Το σύνολο των αντικειμένων σχεδιάζεται με βάση τους συνδέσμους που ορίζονται πάνω σε αυτό.

Διάγραμμα καταστάσεων

Το διάγραμμα καταστάσεων είναι ένα διάγραμμα συμπεριφοράς που εμφανίζει μια μηχανή καταστάσεων με έμφαση στις μεταπτώσεις μεταξύ καταστάσεων από διάφορα γεγονότα.

Παράδειγμα:

Διάγραμμα δραστηριοτήτων

Όπως και το διάγραμμα καταστάσεων έτσι και το διάγραμμα δραστηριοτήτων είναι ένα διάγραμμα συμπεριφοράς που εμφανίζει μεταπτώσεις. Η διαφορά του από το διάγραμμα καταστάσεων είναι πως οι μεταπτώσεις είναι ανάμεσα σε διαφορετικές δραστηριότητες εκφράζοντας π.χ. τη ροή εργασιών (workflow). Εκτός από τα στοιχεία του διαγράμματος καταστάσεων περιλαμβάνει συχνά ακόμα:

Παράδειγμα:

Διάγραμμα ακολουθίας

Το διάγραμμα ακολουθίας είναι ένα διάγραμμα αλληλεπίδρασης (συμπεριφοράς) που παρουσιάζει τον τρόπο που διαφορετικά αντικείμενα συνεργάζονται μεταξύ τους σε μια χρονική ακολουθία. Περιλαμβάνει:

Παράδειγμα:

Διάγραμμα συνεργασίας

Το διάγραμμα συνεργασίας είναι ένα διάγραμμα αλληλεπίδρασης (συμπεριφοράς) που παρουσιάζει τον τρόπο που διαφορετικά αντικείμενα σχετίζονται και ανταλλάσσουν μηνύματα μεταξύ τους. Περιλαμβάνει:

Παράδειγμα:

Διάγραμμα εξαρτημάτων

Το διάγραμμα εξαρτημάτων είναι ένα διάγραμμα δομής υλοποίησης που χρησιμοποιείται για να μοντελοποιήσει: Περιλαμβάνει:

Παράδειγμα:

Διάγραμμα ανάπτυξης

Το διάγραμμα ανάπτυξης είναι ένα διάγραμμα δομής υλοποίησης που παρουσιάζει τον τρόπο διαμόρφωσης των υπολογιστικών κόμβων του συστήματος κατά τη λειτουργία του. Περιλαμβάνει:

Παράδειγμα:

Χρήση διαγραμμάτων

Τα διαγράμματα της UML επιτελούν διαφορετικούς ρόλους ανάλογα με το μοντέλο που μας ενδιαφέρει (Daniels 2002):

Διάγραμμα Ιδεατό μοντέλο Μοντέλο προδιαγραφών Μοντέλο υλοποίησης
Διάγραμμα περιπτώσεων χρήσης - Αλληλεπιδράσεις με το λογισμικό -
Διάγραμμα κλάσεων Μοντέλα πληροφορίας Δομές αντικειμένων Δομές αντικειμένων
Διάγραμμα ακολουθίας ή συνεργασίας - Απαιτούμενες αλληλεπιδράσεις αντικειμένων Υλοποιημένες αλληλεπιδράσεις αντικειμένων
Διάγραμμα δραστηριότητας Επιχειρηματικές διεργασίες - -
Διάγραμμα καταστάσεων Περιορισμοί αλληλουχίας γεγονότων Περιορισμοί αλληλουχίας μηνυμάτων Καθορισμός μηνυμάτων ή αποκρίσεων

Βιβλιογραφία

Ασκήσεις

  1. Σχεδιάστε σε UML ένα τουλάχιστον αντιπροσωπευτικό διάγραμμα κάθε τύπου που να αφορά το πληροφοριακό σύστημα της βιβλιοθήκης του πανεπιστημίου.
  2. Απεικονείστε σε διάγραμμα καταστάσεων τον τρόπο λειτουργίας ενός κινητού τηλεφώνου.

Λεπτομερής σχεδίαση και κωδικοποίηση

Δομημένος προγραμματισμός

Ο νόμος του Demeter

Παράδειγμα:
class Demeter {
        private A a;
        private int myFunc() { /* ... */ }
        public void example (B b) {
                C c = new C();
                int f = myFunc();

                // ...
                b.paramMethod();
                a = new A();
                a.createdMethod();
                c.ownMethod();
        }
}
Σημείωση: Ο νόμος του Demeter (προφ. νταϊμέτρ) (Lieberherr και Holland 1989) έλαβε το όνομά του από το ομώνυμο ερευνητικό έργο, το οποίο με τη σειρά του ονομάστηκε προς τιμή της αρχαίας θεάς Δήμητρας.

Ψευδοκώδικας

Ο ψευδοκώδικας (pseudocode) ή γλώσσα σχεδιασμού προγραμμάτων (program design language (PDL)) ή δομημένα αγγλικά (structured english) συνδυάζει τη δομή μιας γλώσσας προγραμματισμού με την αφηγηματική χρήση της φυσικής γλώσσας.

Παράδειγμα:

PROCEDURE Withdrawal
        DO
                Total requested = Ask ammount()
        WHILE NOT Integral value(Total requested)
        IF Total requested > Balance THEN
                Send complaint letter
                Zero credit limit
                Notify manager
        ELSE
                Remaining = Total requested
                WHILE Remaining > 0
                        Dispose Note
                        Remaining = Remaining - Note value
                END WHILE
        END IF
END PROCEDURE

Διάγραμμα ροής

Το διάγραμμα ροής (flow chart) μας επιτρέπει να παραστήσουμε με λεπτομέρεια τη ροή του προγράμματος. Όταν προγραμματίζουμε δομημένα πρέπει τα τμήματα του προγράμματος να απαρτίζονται απο τα παρακάτω στοιχεία, χωρίς ενδιάμεσες ενώσεις.

Ακολουθία

Απόφαση

Επιλογή

Επανάληψη

Διάγραμμα Nassi-Shneiderman

Τα διαγράμματα Nassi-Shneiderman, (ή N-S, ή Chapin) αποτρέπουν την έκφραση μη δομημένων δομών. Υποστηρίζουν τις παρακάτω δομές.

Ακολουθία

Απόφαση

Επιλογή

Επανάληψη

Πίνακες απόφασης

  • Όταν διαφορετικές ενέργειες του προγράμματος εξαρτώνται μια περίπλοκη σειρά από προϋποθέσεις μπορούμε να εκφράσουμε τη λογική με έναν πίνακα απόφασης (decision table).
  • Σε αυτόν περιλαμβάνουμε όλες τις προϋποθέσεις και σημειώνουμε ποιες ενέργειες θα εκτελεστούν αν ισχύουν κάποιες προϋποθέσεις.
  • Κάθε στήλη του πίνακα είναι ένας διαφορετικός κανόνας.
    Προϋποθέσεις 12345
    Προϋπόθεση 1XXX--
    Προϋπόθεση 2---X-
    Προϋπόθεση 3X----
    Προϋπόθεση 4XX---
    -----
    -----
    Ενέργειες
    Ενέργεια 1 X----
    Ενέργεια 2 -X---
    Ενέργεια 3 --X--
    Ενέργεια 4 ---X-
    Ενέργεια 5 ----X
    Ενέργεια 6 XX--X

    Πρότυπα κωδικοποίησης

    Ο τρόπος της κωδικοποίησης καθορίζεται συχνά από έναν οδηγό ύφους (style guide). Αυτός ορίζει στοιχεία πέρα από αυτά που προσδιορίζει η σύνταξη μιας συγκεκριμένης γλώσσας. Για παράδειγμα το παρακάτω είναι ένα νόμιμο αλλά όχι ευανάγνωστο πρόγραμμα γραμμένο σε C:
    #define O(b,f,u,s,c,a)b(){int o=f();switch(*p++){X u:_ o s b();X c:_ o a b();default:p--;_ o;}}
    #define t(e,d,_,C)X e:f=fopen(B+d,_);C;fclose(f)
    #define U(y,z)while(p=Q(s,y))*p++=z,*p=' '
    #define N for(i=0;i<11*R;i++)m[i]&&
    #define I "%d %s\n",i,m[i]
    #define X ;break;case
    #define _ return
    #define R 999
    typedef char*A;int*C,E[R],L[R],M[R],P[R],l,i,j;char B[R],F[2];A m[12*R],malloc
    (),p,q,x,y,z,s,d,f,fopen();A Q(s,o)A s,o;{for(x=s;*x;x++){for(y=x,z=o;*z&&*y==
    *z;y++)z++;if(z>o&&!*z)_ x;}_	0;}main(){m[11*R]="E";while(puts("Ok"),gets(B)
    )switch(*B){X'R':C=E;l=1;for(i=0;i<R;P[i++]=0);while(l){while(!(s=m[l]))l++;if
    (!Q(s,"\"")){U("<>",'#');U("<=",'$');U(">=",'!');}d=B;while(*F=*s){*s=='"'&&j
    ++;if(j&1||!Q(" \t",F))*d++=*s;s++;}*d--=j=0;if(B[1]!='=')switch(*B){X'E':l=-1
    X'R':B[2]!='M'&&(l=*--C)X'I':B[1]=='N'?gets(p=B),P[*d]=S():(*(q=Q(B,"TH"))=0,p
    =B+2,S()&&(p=q+4,l=S()-1))X'P':B[5]=='"'?*d=0,puts(B+6):(p=B+5,printf("%d\n",S
    ()))X'G':p=B+4,B[2]=='S'&&(*C++=l,p++),l=S()-1 X'F':*(q=Q(B,"TO"))=0;p=B+5;P[i
    =B[3]]=S();p=q+2;M[i]=S();L[i]=l X'N':++P[*d]<=M[*d]&&(l=L[*d]);}else p=B+2,P[
    *B]=S();l++;}X'L':N printf(I)X'N':N free(m[i]),m[i]=0	X'B':_ 0 t('S',5,"w",N
    fprintf(f,I))t('O',4,"r",while(fgets(B,R,f))(*Q(B,"\n")=0,G()))X 0:default:G()
    ;}_ 0;}G(){l=atoi(B);m[l]&&free(m[l]);(p=Q(B," "))?strcpy(m[l]=malloc(strlen(p
    )),p+1):(m[l]=0,0);}O(S,J,'=',==,'#',!=)O(J,K,'<',<,'>',>)O(K,V,'$',<=,'!',>=)
    O(V,W,'+',+,'-',-)O(W,Y,'*',*,'/',/)Y(){int o;_*p=='-'?p++,-Y():*p>='0'&&*p<=
    '9'?strtol(p,&p,0):*p=='('?p++,o=S(),p++,o:P[*p++];}
    
    Οι οδηγοί ύφους έχουν ως στόχο να προλαμβάνουν φαινόμενα σαν το παραπάνω. Για παράδειγμα ο οδηγός ύφους της γλώσσας C "Recommended C Style and Coding Standards" γνωστός ως "Indian Hills Style Guide" περιέχει τα παρακάτω στοιχεία:

    Δομές δεδομένων

    Οι βασικές δομές δεδομένων που θα συναντήσετε είναι: Σύγχρονες γλώσσες όπως η C++ και η Java παρέχουν έτοιμη υποστήριξη για πολλούς από τους παραπάνω τύπους.

    Χρήση βεβαιώσεων

    Προγραμματίζουμε με σιγουριά αν εκφράζουμε τους αλγορίθμους μας με βάση:

    Παράδειγμα

    Είσοδος:
      Α(1..Ν): πίνακας ακεραίων
      N : ακέραιος
    Έξοδος:
      Β(1..Ν): πίνακας ακεραίων
    
    Προϋποθέσεις:
      Ν >= 1
    Μετασυνθήκες:
      Β(1..Ν) περιέχει τις τιμές του Α(1..Ν)
    
    Μεταβλητές
      Ι : Ακέραιος
    
    I := 1
    Όσο Ι <= Ν
      Β(Ι) := Α(Ι)
      Αναλλοίωτη συνθήκη: Β(1..Ι) := Α(1..Ι)
      Συνθήκη σύγκλισης: Ν - Ι
      Ι := Ι + 1
    Τέλος
    
    Σε στρατηγικά σημεία του κώδικα μπορούμε να εκφράζουμε τις παραπάνω έννοιες με τη βοήθεια μιας βεβαίωσης (assertion). Παράδειγμα:
    void
    arraycopy(int a[], int b[], int n)
    {
            assert(n >= 0);
            // ...
    }

    Απλοί κανόνες

    Μερικοί κανόνες (Kernighan και Plauger 1976, Davis 1995) που πρέπει να ακολουθούμε κατά την κωδικοποίηση είναι οι παρακάτω:

    Εσωτερική και εξωτερική τεκμηρίωση

    Παράδειγμα:
    /**
     * A class containing static methods that allow the simple, correct,
     * and efficient procesing of a console application's standard input
     * and output streams.
     * Output is buffered, but automagically flushed, so that prompts in
     * interactive applications work as expected.
     * All errors will terminate the application with an error message.
     * The code was written to provide an easy-to-learn and consistent interface 
     * for learning Java.  It is not intended for production work.
     *
     * @author  Diomidis Spinellis
     * @version $Revision: 1.4 $
     * @see java.io
     * @see java.io.Writer
     * @see java.io.PrintWriter
     */
    public class BIO {
            // Reader and Writer
            private static BufferedReader in = 
                    new BufferedReader(new InputStreamReader(System.in));
            private static PrintWriter out =
                    new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
            private static boolean needFlush = false;

            // Class initializer
            static {
                    Runtime.getRuntime().addShutdownHook(new Thread() {
                            // Will run when VM shuts down
                            public void run()
                            {
                                    try {
                                            in.close();
                                            out.close();
                                    } catch (Exception e) {
                                    }
                            }
                });
            }
            /**
             * Flush the output stream. If the stream has saved any characters from 
             * the various write() methods in a buffer, write them immediately to 
             * their intended destination.
             * Flushing is automatically performed before reading input from a 
             * source * that could be affected by reading the program's output
             * (e.g. a human).
             */
            public static void flush() { out.flush(); needFlush = false; }
            /** Print the argument of type char on the standard output. */
            public static void print(char x) { out.print(x); needFlush = true; }
            /** Print the argument of type int on the standard output. */
            public static void print(int x) { out.print(x); needFlush = true; }
            /** Print the argument of type boolean on the standard output. */
            public static void print(boolean x) { out.print(x); needFlush = true; }
            /** Print the argument of type double on the standard output. */
            public static void print(double x) { out.print(x); needFlush = true; }
            /** Print the argument of type Object on the standard output. */
            public static void print(Object x) { out.print(x); needFlush = true; }

    Βιβλιογραφία

    Ασκήσεις

    1. Ξαναγράψτε μερικά από τα παλιά σας προγράμματα σύμφωνα με τις αρχές του μαθήματος αυτού.
    2. Αξιολογείστε προγράμματα ανοιχτού κώδικα που θα βρείτε στο Internet ως προς τις αρχές κωδικοποίησης που ακολουθούν.
    3. Διαβάστε προσεκτικά έναν πλήρη οδηγό ύφους προγραμματισμού (βλ. βιβλιογραφία).

    Εργαλεία και τεχνικές ανάπτυξης

    Ταξινόμηση εργαλείων

    Μπορούμε να διαχωρίσουμε τα εργαλεία λογισμικού στις παρακάτω κατηγορίες (Houghton 1983):

    Διορθωτές

    Ένας καλός διορθωτής (editor) προγραμμάτων υποστηρίζει τις παρακάτω δυνατότητες: Το περιβάλλον του διορθωτή vim

    Διερμηνευτές και μεταγλωττιστές

    Εκτός από τη συμβολή τους στην εκτέλεση του πηγαίου κώδικα οι διερμηνευτές και μεταγλωττιστές παρέχουν συχνά και τις παρακάτω ευκολίες:

    Γεννήτριες κώδικα

    Μια σειρά από εργαλεία και τεχνικές βασίζονται στην αυτόματη δημιουργία κώδικα. Παραδείγματα:

    Παραδείγματα wizard



    Αποσφαλματωτές

    Ο αποσφαλματωτής επιτρέπει: Αποσφαλμάτωση στο περιβάλλον Microsoft Visual Studio

    Αναλυτές κατανομής

    Ένας αναλυτής κατανομής εκτέλεσης (execution profiler) επιτρέπει:

    Φυλλομετρητές

    Συνδεδεμένο με το διορθωτή είναι συχνά ένα εργαλείο που επιτρέπει τη φυλλομέτρηση και την εμφάνιση της δομής του κώδικα και των κλάσεων που τον απαρτίζουν. Δυνατότητες του φυλλομετρητή μπορεί να είναι οι παρακάτω:

    Σύστημα βοήθειας

    Το σύστημα βοήθειας περιλαμβάνει συχνά σε ψηφιακή μορφή τεκμηρίωση για: Το σύστημα βοήθειας είναι τις περισσότερες φορές παρουσιασμένο σε μορφή υπερκειμένου με πίνακες περιεχομένων και συνδέσεις ανάμεσα σε τμήματα, όπως φαίνεται στα παρακάτω σχήματα:

    Ολοκληρωμένα περιβάλλοντα ανάπτυξης

    Περιβάλλοντα εργαλειοσυνόλων

    Ένα περιβάλλον εργαλειοσυνόλων περιλαμβάνει σε ένα οργανωμένο σύνολο μια σειρά από εργαλεία που συνεργάζονται αρμονικά μεταξύ τους. Για παράδειγμα σύγχρονες εκδόσεις του λειτουργικού συστήματος Unix παρέχουν τα παρακάτω:

    Ολοκλήρωση της διαδικασίας μεταγλώττισης

    Η διαδικασία της μεταγλώττισης περιλαμβάνει αρκετές ευκολίες σε ένα ολοκληρωμένο περιβάλλον.

    Ανάπτυξη με γλώσσες εξειδικευμένου πεδίου

    Σύζευξη γνωστικού πεδίου - λογισμικού

    Απαιτήσεις διαλεκτικής επαΐοντα

    Αξιοποίηση γνωστικών δεξιοτήτων
    Υποστήριξη φορμαλισμών του γνωστικού πεδίου
    Δημοσίευση
    Διάχυση, εκπαίδευση, ανασκόπηση
    Ανασκόπηση από ομότιμους επαΐοντες
    Αρχειοθέτηση
    Σε μορφή κατάλληλη για ανιχνευσιμότητα
    Επιλεκτική επέμβαση
    Βελτίωση, συντήρηση, υποστήριξη
    Επαναχρησιμοποίηση

    Προβλήματα των γλωσσών γενικής χρήσης

    Δύσκολες στην εκμάθηση
    C++ 1997 910 σ.
    Απαιτούν μεγάλες βιβλιοθήκες υποστήριξης
    Windows API 3433 συναρτήσεις
    Ακατάλληλες για συγκεκριμένες εφαρμογές
    Συστήματα πελάτη εξυπηρετητή
    Απόσταση από το φορμαλισμό του επαΐοντα

    Γλώσσες εξειδικευμένου πεδίου (ΓΕΠ)

    Παράδειγμα ΓΕΠ στην υλοποίηση μεταγλωττιστών

    Παράδειγμα: κώδικας yacc:
    unary_expression
    : postfix_expression
    '+' cast_expression   { $$ = $2; }
    '-' cast_expression   { $$ = -$2; }
    '~' cast_expression   { $$ = ~$2; }
    '!' cast_expression   { $$ = !$2; }
    ;

    cast_expression
    : unary_expression
    ;

    multiplicative_expression
    : cast_expression
    | multiplicative_expression '*' cast_expression { $$ = $1 * $3; }
    | multiplicative_expression '/' cast_expression 
                    {
                            if ($3 == 0) {
                                    Error::error(E_ERR, "division by zero in #if expression");
                                    $$ = 0;
                            } else
                                    $$ = $1 / $3;
                    }
    | multiplicative_expression '%' cast_expression
                    {
                            if ($3 == 0) {
                                    Error::error(E_ERR, "modulo division by zero in #if expression");
                                    $$ = $1;
                            } else
                                    $$ = $1 / $3;
                    }
    ;

    Βιβλιογραφία

    Ασκήσεις

    1. Εξετάστε τα εργαλεία που χρησιμοποιείτε στην ανάπτυξη του λογισμικού σας και χωρίστε τα σε κατηγορίες σύμφωνα με την ταξινόμηση που προτείναμε.
    2. Ερευνήστε ποια νέα εργαλεία θα αύξαναν την παραγωγικότητά σας και αρχίστε να τα χρησιμοποιείτε.

    Επαναχρησιμοποίηση

    Τρόποι επαναχρησιμοποίησης

    Διακρίνουμε τις παρακάτω κατηγορίες επαναχρησιμοποίησης (reuse) κατά την ανάπτυξη λογισμικού:

    Πλεονεκτήματα επαναχρησιμοποίησης

    Προβλήματα επαναχρησιμοποίησης

    Υποστήριξη από εργαλεία

    Παράδειγμα λάθους που εμφανίζεται κατά τη μεταγλώττιση προγράμματος C++ με τη χρήση της βιβλιοθήκης STL κάτω από GNU C++ compiler:
    c:\gcc\bin\..\lib\gcc-lib\i386-mingw32msvc\2.95.2\..\..\..\..\include\g++-3\stl_
    iterator.h: In method `class ostream_iterator<pair<const basic_string<char,strin
    g_char_traits<char>,__default_alloc_template<false,0> >,int> > & ostream_iterato
    r<pair<const basic_string<char,string_char_traits<char>,__default_alloc_template
    <false,0> >,int> >::operator =(const pair<const basic_string<char,string_char_tr
    aits<char>,__default_alloc_template<false,0> >,int> &)':
    c:\gcc\bin\..\lib\gcc-lib\i386-mingw32msvc\2.95.2\..\..\..\..\include\g++-3\stl_
    algobase.h:129:   instantiated from `__copy<_Rb_tree_iterator<pair<const basic_s
    tring<char,string_char_traits<char>,__default_alloc_template<false,0> >,int>,pai
    r<const basic_string<char,string_char_traits<char>,__default_alloc_template<fals
    e,0> >,int> &,pair<const basic_string<char,string_char_traits<char>,__default_al
    loc_template<false,0> >,int> *>, ostream_iterator<pair<const basic_string<char,s
    tring_char_traits<char>,__default_alloc_template<false,0> >,int> >, ptrdiff_t>(_
    Rb_tree_iterator<pair<const basic_string<char,string_char_traits<char>,__default
    _alloc_template<false,0> >,int>,pair<const basic_string<char,string_char_traits<
    char>,__default_alloc_template<false,0> >,int> &,pair<const basic_string<char,st
    ring_char_traits<char>,__default_alloc_template<false,0> >,int> *>, _Rb_tree_ite
    rator<pair<const basic_string<char,string_char_traits<char>,__default_alloc_temp
    late<false,0> >,int>,pair<const basic_string<char,string_char_traits<char>,__def
    ault_alloc_template<false,0> >,int> &,pair<const basic_string<char,string_char_t
    raits<char>,__default_alloc_template<false,0> >,int> *>, ostream_iterator<pair<c
    onst basic_string<char,string_char_traits<char>,__default_alloc_template<false,0
    > >,int> >, input_iterator_tag, ptrdiff_t *)'
    c:\gcc\bin\..\lib\gcc-lib\i386-mingw32msvc\2.95.2\..\..\..\..\include\g++-3\stl_
    algobase.h:161:   instantiated from `__copy_dispatch<_Rb_tree_iterator<pair<cons
    t basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >
    ,int>,pair<const basic_string<char,string_char_traits<char>,__default_alloc_temp
    late<false,0> >,int> &,pair<const basic_string<char,string_char_traits<char>,__d
    efault_alloc_template<false,0> >,int> *>,ostream_iterator<pair<const basic_strin
    g<char,string_char_traits<char>,__default_alloc_template<false,0> >,int> >,__fal
    se_type>::copy(_Rb_tree_iterator<pair<const basic_string<char,string_char_traits
    <char>,__default_alloc_template<false,0> >,int>,pair<const basic_string<char,str
    ing_char_traits<char>,__default_alloc_template<false,0> >,int> &,pair<const basi
    c_string<char,string_char_traits<char>,__default_alloc_template<false,0> >,int>
    *>, _Rb_tree_iterator<pair<const basic_string<char,string_char_traits<char>,__de
    fault_alloc_template<false,0> >,int>,pair<const basic_string<char,string_char_tr
    aits<char>,__default_alloc_template<false,0> >,int> &,pair<const basic_string<ch
    ar,string_char_traits<char>,__default_alloc_template<false,0> >,int> *>, ostream
    _iterator<pair<const basic_string<char,string_char_traits<char>,__default_alloc_
    template<false,0> >,int> >)'
    c:\gcc\bin\..\lib\gcc-lib\i386-mingw32msvc\2.95.2\..\..\..\..\include\g++-3\stl_
    algobase.h:188:   instantiated from `copy<_Rb_tree_iterator<pair<const basic_str
    ing<char,string_char_traits<char>,__default_alloc_template<false,0> >,int>,pair<
    const basic_string<char,string_char_traits<char>,__default_alloc_template<false,
    0> >,int> &,pair<const basic_string<char,string_char_traits<char>,__default_allo
    c_template<false,0> >,int> *>, ostream_iterator<pair<const basic_string<char,str
    ing_char_traits<char>,__default_alloc_template<false,0> >,int> > >(_Rb_tree_iter
    ator<pair<const basic_string<char,string_char_traits<char>,__default_alloc_templ
    ate<false,0> >,int>,pair<const basic_string<char,string_char_traits<char>,__defa
    ult_alloc_template<false,0> >,int> &,pair<const basic_string<char,string_char_tr
    aits<char>,__default_alloc_template<false,0> >,int> *>, _Rb_tree_iterator<pair<c
    onst basic_string<char,string_char_traits<char>,__default_alloc_template<false,0
    > >,int>,pair<const basic_string<char,string_char_traits<char>,__default_alloc_t
    emplate<false,0> >,int> &,pair<const basic_string<char,string_char_traits<char>,
    __default_alloc_template<false,0> >,int> *>, ostream_iterator<pair<const basic_s
    tring<char,string_char_traits<char>,__default_alloc_template<false,0> >,int> >)'
    
    t.cpp:21:   instantiated from here
    c:\gcc\bin\..\lib\gcc-lib\i386-mingw32msvc\2.95.2\..\..\..\..\include\g++-3\stl_
    iterator.h:890: no match for `ostream & << const pair<const basic_string<char,st
    ring_char_traits<char>,__default_alloc_template<false,0> >,int> &'
    c:\gcc\bin\..\lib\gcc-lib\i386-mingw32msvc\2.95.2\..\..\..\..\include\g++-3\iost
    ream.h:77: candidates are: class ostream & ostream::operator <<(char)
    c:\gcc\bin\..\lib\gcc-lib\i386-mingw32msvc\2.95.2\..\..\..\..\include\g++-3\iost
    ream.h:78:                 class ostream & ostream::operator <<(unsigned char)
    c:\gcc\bin\..\lib\gcc-lib\i386-mingw32msvc\2.95.2\..\..\..\..\include\g++-3\iost
    ream.h:79:                 class ostream & ostream::operator <<(signed char)
    
    (Ακολουθούν άλλες 10 γραμμές)

    Παράδειγμα λάθους που εμφανίζεται κατά τη μεταγλώττιση προγράμματος C++ με τη χρήση της βιβλιοθήκης STL κάτω από Microsoft C/C++ compiler:

            t.cpp(24) : see reference to function template instantiation 'class std:
    :basic_ostream<char,struct std::char_traits<char> > &__cdecl std::operator <<(cl
    ass std::basic_ostream<char,struct std::char_traits<char> > &,const char *)' bei
    ng compiled
    C:\PROGRA~1\MICROS~4\VC98\INCLUDE\iterator(203) : error C2679: binary '<<' : no
    operator defined which takes a right-hand operand of type 'const struct std::pai
    r<class std::basic_string<char,struct std::char_traits<char>,class std::allocato
    r<char> > const ,int>' (or there is no acceptable conversion)
            C:\PROGRA~1\MICROS~4\VC98\INCLUDE\iterator(203) : while compiling class-
    template member function 'class std::ostream_iterator<struct std::pair<class std
    ::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > c
    onst ,int>,char,struct std::char_traits<char> > &__thiscall std::ostream_iterato
    r<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,cl
    ass std::allocator<char> > const ,int>,char,struct std::char_traits<char> >::ope
    rator =(const struct std::pair<class std::basic_string<char,struct std::char_tra
    its<char>,class std::allocator<char> > const ,int> &)'
    

    Πρότυπα σχέδια

    Each pattern describes a problem which occurs over and over again in our environment, and then describes the core of the solution to that problem, in such a way that you can use this solution a million times over, without ever doing it the same way twice.
    -- Christopher Alexander et al. A Pattern Language

    Τα πρότυπα σχέδια μας επιτρέπουν τη

    υπάρχουσας σχεδιαστικής γνώσης.

    Σε αντίθεση με αλγορίθμους και δομές δεδομένων τα στοιχεία που περιγράφουν δε χρησιμοποιούνται αυτούσια αλλά περιγράφουν πως θα υλοποιηθεί το σχέδιο του έργου.

    Επίσης, τα πρότυπα σχέδια περιγράφονται με τέτοιο τρόπο έτσι ώστε να μπορούν να συνδυάζονται μεταξύ τους.

    Κάθε περιγραφή ενός σχεδίου περιλαμβάνει:

    Παράδειγμα προτύπου σχεδίου

    Το παρακάτω κείμενο (Σπινέλλης και Ράπτης 2000) περιγράφει με τη μορφή ενός προτύπου σχεδίου τη σύνδεση εξαρτημάτων:
    Component Composition - Structural
    Intent
    The component composition pattern identifies the primary methods of encapsulated component composition and integration.

    Motivation
    Encapsulated components do not operate in a vacuum. They are composed to create more powerful components and integrated within an object-based system to provide specialised services. Moreover, composition of encapsulated components with component glue can be used to provide efficient access to off-line data, graphical user interfaces, and a multitude of other component-based services. As an example a spelling checker can be easily constructed by composing the translate, sort, unique, and common components, while the gluing of a editbox and listbox components can be used to provide a GUI front end.

    Applicability
    Many of the problems solved under the Unix programming environment using shell programming constructs and pipelines can be transformed to component composition structures. Of particular relevance are sequences of filter type components, where each one receives a data stream, performs some operations on it, and forwards it to another filter to perform some other operations. Examples include pipelines of tools that process text, images, sound, and object code. Meunier [13] describes a complete pattern language for a ``Pipes and Filters Architecture'' that can be used as a base to structure applications.

    Structure


    Figure 4: A spell checker with a GUI.

    Figure 4 depicts the component interaction diagram of a filter-based spell checker built from Unix-mined and glue components. The text to be spell-checked is retrieved from the GUI edit box using a data source glue component. It is transformed into a list of words using the translate component which is a direct equivalent of the Unix tr command. The word list is then transformed into a sorted list of unique words using the sort and unique components which correspond to the Unix sort and uniq commands. At the same time, the system dictionary and a user dictionary are passed using appropriate file connectors to the merge component which merges two sorted streams; the merge component is a specialisation of sort which provides this functionality. Finally, the two sorted streams of words to be spelled and acceptable words are checked by common - derived from the Unix comm command - which outputs a list of words contained in the first stream and not contained in the second one. This stream of misspelled words is sent using the ListBoxSink glue component to a GUI list box. It is important to note that the integration of GUI elements using the same component object paradigm and the merging of two data streams could not be implemented using the standard Unix linear pipeline system.

    Participants
    The components composed are object instances of either active process components that are connected to existing data sources and sinks, or connector and glue components (pipes and environment interfacing classes) that provide such sources and sinks.

    Consequences
    Using the component composition pattern it is possible to implement sophisticated component interaction topologies. In addition, it is possible to package together existing components to provide new standard and reusable components.

    Implementations
    The implementation of the composition pattern is independent of the component-framework used. Most relevant decisions are taken when implementing the encapsulation and the glue patterns. Designs based on the composition pattern should be portable across different component frameworks.

    Προγραμματισμός με εξαρτήματα

    Ένα εξάρτημα (component) είναι μια μονάδα σύνθεσης που ορίζεται μόνο από: Μπορούν να χρησιμοποιηθούν: Όπως και τα αντικείμενα ένα εξάρτημα: Τα εξαρτήματα επιπλέον:

    Παραδείγματα εξαρτημάτων

    Κατηγορίες εξαρτημάτων από το δικτυακό τόπο http://www.componentsource.com (http://www.componentsource.com):

    Πλαίσια εφαρμογών

    Ένα πλαίσιο εφαρμογής: Για παράδειγμα ένα πλαίσιο για εφαρμογές που περιλαμβάνουν γραφική διεπαφή με το χρήστη ορίζεται ως έτοιμο πλαίσιο με βάση το σχέδιο: μοντέλο, εικόνα, ελεγκτής (model view controller (MVC)).

    Μελέτη περίπτωσης: Java Beans

    Η τεχνολογία JavaBeans επιτρέπει την υλοποίηση και χρήση εξαρτημάτων με οπτική παράσταση στο περιβάλλον της γλώσσας Java. Οι βασικές αρχές της τεχνολογίας είναι οι παρακάτω:
    Εμφάνιση ενός bean στο περιβάλλον εργασίας και αλλαγή των ιδιοτήτων του (εικόνα από το δικτυακό τόπο της Sun).

    Περιέχοντες και επαναλήπτες στην STL

    Η πρότυπη βιβλιοθήκη της C++ περιέχει ένα σύνολο από αλγορίθμους που χρησιμοποιούνται με τη χρήση ενός επαναλήπτη (iterator) πάνω σε έναν περιέχοντα (container). Οι λειτουργίες αυτές αποτελούν τη βιβλιοθήκη με το όνομα Standard Template Library (STL). Η STL ορίζει μια σειρά από περιέχοντες (containers) όπως την ουρά, τη στοίβα, την απεικόνιση και τον πίνακα. Πάνω στους περιέχοντες αυτούς επιτρέπει την εκτέλεση αλγορίθμων, όπως την εύρεση ενός στοιχείου, η ένωση δύο περιεχόντων, η ταξινόμηση, κ.λπ.

    Στην STL ορίζονται οι παρακάτω πρότυποι (ως προς τα στοιχεία που περιέχουν) περιέχοντες:

    list
    διπλά συνδεδεμένη λίστα
    queue
    ουρά
    deque
    ουρά με πρόσβαση και στις δύο άκρες
    map
    απεικόνιση (π.χ. από συμβολοσειρές σε ακέραιους)
    set
    απεικόνιση με μοναδικά στοιχεία στο πεδίο τιμών
    stack
    στοίβα
    vector
    πίνακας
    Κάθε περιέχων μπορεί να περιλαμβάνει στοιχεία οποιουδήποτε τύπου.

    Η πρόσβαση των στοιχείων ενός περιέχοντα από τους αλγορίθμους γίνεται μέσω επαναληπτών (iterators). Οι επαναλήπτες - ανάλογα με τη δομή των δεδομένων του περιέχοντα - μπορούν να επιτρέπουν την παρακάτω ιεραρχία κινήσεων:

    Επίσης, μπορούν να επιτρέπουν την παρακάτω ιεραρχία πρόσβασης στα δεδομένα που δείχνουν: Η κλάση των επαναληπτών ορίζεται στην επικεφαλίδα iterator. Μερικές μέθοδοι που ορίζονται σε επαναλήπτες είναι οι παρακάτω: Για κάθε περιέχοντα ορίζονται μέθοδοι όπως (στην περίπτωση της διπλής ουράς):
    assign
    ανάθεση τιμής
    at
    αναφορά σε στοιχείο
    back
    το τελευταίο στοιχείο
    begin
    επαναλήπτης που δείχνει στην αρχή της δομής
    clear
    διαγραφή όλων των στοιχείων
    empty
    αληθές αν η δομή είναι άδεια
    end
    επαναλήπτης που δείχνει στο τέλος της δομής
    erase
    διαγραφή σειράς στοιχείων
    front
    το πρώτο στοιχείο
    insert
    προσθήκη στοιχείου
    operator[]
    πρόσβαση σε στοιχείο
    pop_back
    αφαίρεση στοιχείου από το τέλος
    pop_front
    αφαίρεση στοιχείου από την αρχή
    push_back
    προσθήκη στοιχείου στο τέλος
    push_front
    προσθήκη στοιχείου στην αρχή
    rbegin
    ανάστροφος επαναλήπτης που δείχνει στην αρχή της δομής
    rend
    ανάστροφος επαναλήπτης που δείχνει στο τέλος της δομής
    resize
    καθορισμός του αριθμού των στοιχείων
    size
    αριθμός των στοιχείων
    swap
    εναλλαγή δύο στοιχείων μεταξύ τους

    Παράδειγμα STL: απεικόνιση

    Το παρακάτω παράδειγμα τυπώνει πόσες φορές εμφανίστηκε κάθε λέξη στην είσοδο του προγράμματος:
    #include <map>
    #include <iostream>
    #include <string>

    using namespace std;

    typedef map <string, int> smap_t;

    int
    main()
    {
            string s;
            smap_t m;                       // Our map

            while (!cin.eof()) {
                    cin >> s;
                    m[s]++;                 // Use overloaded [] operator
            };

            smap_t::iterator i;             // Iterator for printing the results
            for (i = m.begin(); i != m.end(); i++)
                    cout << i->first << " " << i->second << endl;
            return (0);
    }

    Πρόσθετες λειτουργίες στην STL

    Επικεφαλίδα algorithm

    Στην επικεφαλίδα algorithm ορίζονται μέθοδοι που ενεργούν πάνω σε περιέχοντες:
    adjacent_find
    βρίσκει δύο ίσα στοιχεία σε διπλανές θέσεις
    binary_search
    δυαδική ανίχνευση
    copy
    αντιγραφή περιοχής
    copy_backward
    αντίστροφη αντιγραφή περιοχής
    count
    μέτρημα
    count_if
    μέτρημα υπό συνθήκη
    equal
    σύγκριση περιοχών
    equal_range
    σύγκριση περιοχών με συγκεκριμένη ακρίβεια
    fill
    πλήρωση περιοχής με τιμή
    fill_n
    πλήρωση αριθμού στοιχείων με τιμή
    find
    εύρεση στοιχείου
    find_end
    εύρεση στοιχείου από το τέλος
    find_first_of
    εύρεση στοιχείου ίσου με κάποιο μέλος από σύνολο στοιχείων
    find_if
    εύρεση στοιχείου που να ικανοποιεί συνθήκη
    for_each
    εκτέλεση συνάρτησης για όλα τα στοιχεία σε περιοχή
    generate
    πλήρωση περιοχής με αποτέλεσμα συνάρτησης
    generate_n
    πλήρωση αριθμού στοιχείων με αποτέλεσμα συνάρτησης
    includes
    έλεγχος αν μια περιοχή εμπεριέχει μια άλλη
    inplace_merge
    σύζευξη δεδομένων στον ίδιο περιέχοντα
    iter_swap
    εναλλαγή δύο τιμών
    lexicographical_compare
    σύγκριση δύο περιοχών α, β για α < β
    lower_bound
    εύρεση μιας ελάχιστης τιμής σε περιοχή σε σχέση με μιαν άλλη τιμή
    make_heap
    μετατροπή περιοχής σε σωρό (heap) (δυαδικό δένδρο στο οποίο τα παιδιά έχουν τιμή μικρότερη ή ίση από αυτή των γονέων τους).
    max
    το μέγιστο από δύο στοιχεία
    max_element
    εύρεση του μέγιστου στοιχείου σε περιοχή
    merge
    σύζευξη δύο περιοχών σε τρίτη
    min
    το ελάχιστο από δύο στοιχεία
    min_element
    εύρεση του ελαχίστου στοιχείου σε περιοχή
    mismatch
    εύρεση του πρώτου διαφορετικού στοιχείου ανάμεσα σε δύο περιοχές
    next_permutation
    υπολογισμός της επόμενης μετάθεσης σε μια περιοχή
    nth_element
    θέτει ένα στοιχείο στη θέση που θα έπρεπε να έχει αν η περιοχή ήταν ταξινομημένη
    partial_sort
    ταξινομεί τα πρώτα στοιχεία μιας περιοχής
    partial_sort_copy
    ταξινομεί τα πρώτα στοιχεία μιας περιοχής σε μιαν άλλη
    partition
    χωρίζει μια περιοχή στα δύο με βάση μια συνάρτηση και επιστρέφει το σημείο που είναι ο χωρισμός
    pop_heap
    αφαίρεση στοιχείου από σωρό
    prev_permutation
    υπολογισμός της προηγούμενης μετάθεσης σε μια περιοχή
    push_heap
    προσθήκη στοιχείου από σωρό
    random_shuffle
    ανακατεύει μια περιοχή
    remove
    αφαιρεί στοιχεία ίσα με μια τιμή
    remove_copy
    αφαιρεί στοιχεία ίσα με μια τιμή μεταφέροντας το αποτέλεσμα σε μιαν άλλη περιοχή
    remove_copy_if
    αφαιρεί στοιχεία για τα οποία μια συνάρτηση είναι αληθής μεταφέροντας το αποτέλεσμα σε μιαν άλλη περιοχή
    remove_if
    αφαιρεί στοιχεία για τα οποία μια συνάρτηση είναι αληθής
    replace
    αλλάζει τιμή σε στοιχεία ίσα με μια τιμή
    replace_copy
    αλλάζει τιμή σε στοιχεία ίσα με μια τιμή μεταφέροντας το αποτέλεσμα σε μιαν άλλη περιοχή
    replace_copy_if
    αλλάζει τιμή σε στοιχεία για τα οποία μια συνάρτηση είναι αληθής μεταφέροντας το αποτέλεσμα σε μιαν άλλη περιοχή
    replace_if
    αλλάζει τιμή σε στοιχεία για τα οποία μια συνάρτηση είναι αληθής
    reverse
    αντιστρέφει τη σειρά σε μια περιοχή
    reverse_copy
    αντιστρέφει τη σειρά σε μια περιοχή μεταφέροντάς την σε μιαν άλλη περιοχή
    rotate
    περιστρέφει τη σειρά των στοιχείων σε μια περιοχή
    rotate_copy
    περιστρέφει τη σειρά των στοιχείων σε μια περιοχή μεταφέροντάς την σε μιαν άλλη περιοχή
    search
    εύρεση σειράς στοιχείων σε μια περιοχή ίσης με στοιχεία μιας άλλης
    search_n
    εύρεση σειράς στοιχείων σε μια περιοχή ίσης με αριθμό στοιχείων μιας άλλης
    set_difference
    θέτει μια περιοχή ίση με τη διαφορά των στοιχείων δύο άλλων περιοχών (διαφορά συνόλων)
    set_intersection
    θέτει μια περιοχή ίση με την τομή των στοιχείων δύο άλλων περιοχών (τομή συνόλων)
    set_symmetric_difference
    θέτει μια περιοχή ίση με τα μη κοινά των στοιχείων δύο άλλων περιοχών
    set_union
    θέτει μια περιοχή ίση με την ένωση των στοιχείων δύο άλλων περιοχών (ένωση συνόλων)
    sort
    ταξινομεί μια περιοχή
    sort_heap
    ταξινομεί έναν σωρό
    stable_partition
    χωρίζει μια περιοχή στα δύο με βάση μια συνάρτηση και επιστρέφει το σημείο που είναι ο χωρισμός. Ο χωρισμός γίνεται χωρίς να αλλάξει η σχετική σειρά των στοιχείων.
    stable_sort
    ταξινομεί μια περιοχή. Η ταξινόμηση γίνεται χωρίς να αλλάξει η σχετική σειρά των στοιχείων που είναι μεταξύ τους ίσα.
    swap
    αντιστρέφει μεταξύ τους δύο στοιχεία
    swap_ranges
    αντιστρέφει μεταξύ τους δύο περιοχές
    transform
    εφαρμόζει έναν τελεστή σε μια περιοχή ή μεταξύ δύο περιοχών
    unique
    αφαιρεί τα όμοια στοιχεία από μια περιοχή
    unique_copy
    αφαιρεί τα όμοια στοιχεία από μια περιοχή μεταφέροντάς την σε μιαν άλλη περιοχή
    upper_bound
    εύρεση μιας μέγιστης τιμής σε περιοχή σε σχέση με μια άλλη τιμή

    Επικεφαλίδα numeric

    Στην επικεφαλίδα algorithm ορίζονται αριθμητικές μέθοδοι που ενεργούν πάνω σε περιέχοντες:
    accumulate
    υπολογίζει ένα σύνολο πάνω σε μια περιοχή
    adjacent_difference
    υπολογίζει τις διαφορές τιμών μεταξύ στοιχείων μιας περιοχής
    inner_product
    υπολογίζει ένα εσωτερικό γινόμενο μεταξύ δύο περιοχών
    partial_sum
    υπολογίζει ένα μερικό άθροισμα τιμών μιας περιοχής σε μιαν άλλη

    Άλλες επικεφαλίδες

    Ακόμα στην STL ορίζονται οι παρακάτω επικεφαλίδες:
    utility
    πρότυπη κλάση που ορίζει διάταξη σε ζεύγη τιμών
    functional
    κλάση που επιτρέπει συναρτησιακό προγραμματισμό
    memory
    ορίζει την κλάση allocator η οποία κατανέμει τη μνήμη σε όλους τους περιέχοντες. Ο επανακαθορισμός της επιτρέπει την υλοποίηση άλλων στρατηγικών καταμερισμού και πρόσβασης στη μνήμη.

    Κατανεμημένα συστήματα βασισμένα σε εξαρτήματα

    Πριν δύο δεκαετίες, η φύση των υπολογιστικών συστημάτων εκφράζονταν με την ύπαρξη ισχυρών κεντρικών υπολογιστικών συστημάτων (mainframes) στα οποία ήταν εγκατεστημένες εφαρμογές οι οποίες μπορούσαν να προσπελαστούν από τους χρήστες μέσα από τα τερματικά του συστήματος.

    Με την εμφάνιση και την ανάπτυξη των προσωπικών υπολογιστών και καθώς οι εφαρμογές άρχισαν να γίνονται ολοένα και πιο μεγάλες και σύνθετες, άρχισαν να μεταμορφώνονται από ενιαία προγράμματα σε κομμάτια ικανά να συνεργάζονται μεταξύ τους. Στην διάσπαση των εφαρμογών σε περισσότερα από ένα μέρη, συνέβαλλε η ανάπτυξη της αρχιτεκτονικής πελάτη/εξυπηρετητή (client/server) βάσει της οποίας γινόταν η υλοποίησή τους. Κατά την αρχιτεκτονική πελάτη/εξυπηρετητή, μία διεργασία καλείται πελάτης (client process) όταν αιτείται την υλοποίηση κάποιων υπηρεσιών-μεθόδων από μία διεργασία η οποία είναι ικανή να της προσφέρει τις επιθυμητές υπηρεσίες. Η τελευταία αυτή διεργασία καλείται διεργασία του εξυπηρετητή (server process).

    Αργότερα με την ανάπτυξη των υπολογιστικών δικτύων τα συνθετικά μέρη των εφαρμογών, προκειμένου να υπάρξει καλύτερη και αποτελεσματικότερη εκμετάλλευση των νέων δυνατοτήτων, άρχισαν να διαμοιράζονται στους υπολογιστές του δικτύου. Με τον τρόπο αυτό αυξανόταν η απόδοση και εκμετάλλευση των πόρων του δικτύου. Αυτού του είδους οι εφαρμογές ονομάζονται κατανεμημένες εφαρμογές (distributed applications).

    Η δυνατότητα διασύνδεσης, σε δίκτυα, υπολογιστικών συστημάτων διαφορετικής αρχιτεκτονικής είχε σαν αποτέλεσμα την δημιουργία ενός ανομοιογενούς υπολογιστικού περιβάλλοντος. Θα έπρεπε, λοιπόν, και οι εφαρμογές να μπορέσουν να εξελιχθούν έτσι ώστε να είναι δυνατή η λειτουργία τους σε τέτοια ετερογενή συστήματα υπολογιστών. Αυτή η εξέλιξη οδήγησε στην εμφάνιση των ετερογενών κατανεμημένων εφαρμογών (heterogeneous distributed applications).

    Τεχνολογίες διαλειτουργικότητας κατανεμημένων εφαρμογών

    Τα βασικά στοιχεία που χαρακτηρίζουν ένα σύγχρονο υπολογιστικό περιβάλλον είναι τα εξής: Με βάση τα παραπάνω στοιχεία η χρησιμοποίηση μοντέλων-μεθοδολογιών τα οποία θα διευκολύνουν την λειτουργία των εφαρμογών κάτω από τις συνθήκες ενός ετερογενούς περιβάλλοντος και θα επιτελούν τις λειτουργίες επικοινωνίας με τρόπο τέτοιο έτσι ώστε να είναι διαφανής προς τους τελικούς χρήστες, είναι επιβεβλημένη και η υιοθέτησή τους αποτελεί πλέον ζήτημα για τους οργανισμούς και τις επιχειρήσεις οι οποίες συντηρούν τέτοιου είδους υπολογιστικά συστήματα και δίκτυα.

    Τρία είναι τα βασικά μοντέλα των οποίων σκοπός είναι η υλοποίηση των παραπάνω και αυτά είναι:

    Και τα τρία αυτά μοντέλα βασίζονται πάνω στις ίδιες αρχές (και οι τρεις τεχνολογίες λειτουργούν βασιζόμενες στην έννοια του αντικειμένου) και εξυπηρετούν τον ίδιο σκοπό. Κάθε ένα από αυτά έχει όμως τις δικές του ιδιαιτερότητες από τις οποίες κρίνονται και επιλέγονται.

    OMG CORBA

    Η OMG (Object Management Group) αναπτύσσει πρότυπα βασιζόμενη στην τεχνολογία του αντικειμένου.

    Σύμφωνα με την αρχιτεκτονική που προτείνεται από την OMG, την OMA (Object Management Architecture), το κάθε κομμάτι λογισμικού παρουσιάζεται σαν αντικείμενο (Object).

    Τα διάφορα αντικείμενα επικοινωνούν μεταξύ τους μέσω του ORB (Object Request Broker), ο οποίος αποτελεί το στοιχείο-κλειδί γι' αυτήν την επικοινωνία. Ο ORB παρέχει τους μηχανισμούς εκείνους μέσω των οποίων τα αντικείμενα κάνουν τις αιτήσεις και συλλέγουν τις αποκρίσεις.

    Η CORBA (Common Object Request Broker Architecture) αποτελεί το πρότυπο της OMG για τον ORB.

    Κατά την CORBA, ένας πελάτης ο οποίος ζητάει κάποιες υπηρεσίες από κάποιο αντικείμενο, κάνει μία αίτηση (request) η οποία μεταβιβάζεται στον ORB και ο οποίος είναι στη συνέχεια υπεύθυνος για την προώθηση της αίτησης προς τον κατάλληλο εξυπηρετητή.

    Η αίτηση αυτή περιέχει όλες τις απαραίτητες πληροφορίες που απαιτούνται προκειμένου να υλοποιηθεί και αυτές είναι:

    Για να είναι κατανοητή όμως η αίτηση θα πρέπει να έχει μία κατάλληλη μορφή και γι' αυτό το λόγο γίνεται προς τον ORB μέσω διασυνδετών (interfaces: "Dynamic Invocation" και "IDL Stubs").

    Για τον ίδιο λόγο η προώθηση της αίτησης προς τον εξυπηρετητή γίνεται μέσω διασυνδετών ("Static IDL Skeleton" και "IDL Skeleton").

    Ένας διασυνδέτης αποτελεί μία περιγραφή ενός συνόλου από πιθανές λειτουργίες τις οποίες ένας πελάτης μπορεί να αιτηθεί ενός αντικειμένου.

    Ένα αντικείμενο ικανοποιεί έναν διασυνδέτη εάν μπορεί να προσδιοριστεί σαν το αντικείμενο-στόχος (target object) για κάθε δυνατή αίτηση η οποία περιγράφεται από τον διασυνδέτη.

    Στο σημείο αυτό δεν θα πρέπει να αγνοήσουμε την ιδιότητα της κληρονομικότητας που χαρακτηρίζει τους διασυνδέτες και η οποία παρέχει τον συνθετικό εκείνο μηχανισμό που επιτρέπει σ' ένα αντικείμενο να υποστηρίζει πολλαπλούς διασυνδέτες.

    Οι διασυνδέτες καθορίζονται πλήρως μέσω της OMG IDL (Interface Definition Language). Η IDL δεν αποτελεί γλώσσα προγραμματισμού, όπως οι γνωστές γλώσσες προγραμματισμού, αλλά μία καθαρά περιγραφική γλώσσα η οποία δεν περιλαμβάνει δομές αλγορίθμων ή μεταβλητές. Η γραμματική της αποτελεί υποσύνολο της ANSI C++ με πρόσθετες κατασκευές για την υποστήριξη μηχανισμών για την επίκληση απομακρυσμένων λειτουργιών.

    Οι πελάτες δεν είναι "γραμμένοι" σε OMG IDL αλλά σε γλώσσα για την οποία έχει προσδιοριστεί η αντιστοιχία της με την OMG IDL.

    Microsoft COM/DCOM/COM+

    Το δεύτερο μοντέλο βασίζεται και αυτό στην τεχνολογία του αντικειμένου με την έννοια όμως εδώ των αυτόνομων συνθετικών εξαρτημάτων μίας εφαρμογής.

    Και εδώ, ο βασικός σκοπός του μοντέλου είναι να καταστήσει δυνατή την επικοινωνία δύο ή περισσοτέρων εφαρμογών ή συνθετικών, ακόμα και στην περίπτωση που αυτά διαφέρουν ως προς την προέλευση, τη γλώσσα προγραμματισμού, τα μηχανήματα στα οποία βρίσκονται και τα λειτουργικά συστήματα κάτω από τα οποία τρέχουν.

    Ο "μηχανισμός λειτουργίας του μοντέλου είναι παρόμοιος με αυτόν της CORBA. Βασικό ρόλο παίζουν οι διασυνδέτες τα οποία δεν είναι τίποτα άλλο από ένα σαφές διατυπωμένο "συμβόλαιο" μεταξύ των "κομματιών" λογισμικού, το οποίο περιέχει ένα σύνολο από σχετικές λειτουργίες. Όταν λέμε ότι ένα αντικείμενο υλοποιεί έναν διασυνδέτη αυτό σημαίνει ότι το αντικείμενο αυτό υλοποιεί κάθε λειτουργία του.

    Πως γίνεται, όμως, η διαδικασία της αιτήσεως κάποιων λειτουργιών από έναν πελάτη;

    Για να μπορέσει ένας πελάτης να εξυπηρετηθεί από κάποιο αντικείμενο, θα πρέπει η γλώσσα προγραμματισμού, στην οποία είναι υλοποιημένος, να έχει τη δυνατότητα δημιουργίας δεικτών και να καλεί συναρτήσεις μέσω των δεικτών. Θα πρέπει λοιπόν ο πελάτης να έχει τον κατάλληλο δείκτη προς τον επιθυμητό διασυνδέτη τον οποίο περιέχει τις επιθυμητές από τον πελάτη λειτουργίες.

    Στην περίπτωση όμως που ο πελάτης δεν έχει τον κατάλληλο δείκτη προς το επιθυμητό διασυνδέτη, τότε απευθύνεται προς την COM δίνοντας σαν στοιχεία την ταυτότητα της κλάσης του εξυπηρετητή που επιθυμεί ο πελάτης και τον τύπο του, δηλαδή εάν είναι:

    Η COM τότε αναλαμβάνει να βρει τον επιθυμητό εξυπηρετητή και να επιστρέψει στον πελάτη τον επιθυμητό δείκτη.

    Όπως έγινε σαφές, ο κάθε πελάτης μπορεί να είναι υλοποιημένος σε οποιαδήποτε γλώσσα προγραμματισμού, αρκεί αυτή να υποστηρίζει την κατασκευή και την χρήση δεικτών. Για τα "interfaces", όμως, υπάρχει και εδώ μία "IDL" (interface Definition Language) η οποία επιτρέπει και βοηθάει τους σχεδιαστές να κατασκευάζουν διασυνδέτες.

    Sun Java RMI

    Το μοντέλο RMI της Sun, βασίζεται και αυτό στην τεχνολογία του αντικειμένου και είναι σχεδιασμένο για να προάγει την διαλειτουργικότητα μεταξύ αντικειμένων, κατασκευασμένων σε Java, μέσα σε ένα κατανεμημένο και ετερογενές περιβάλλον.

    Η τεχνολογία RMI αφορά αποκλειστικά αντικείμενα τα οποία είναι κατασκευασμένα με τη γλώσσα προγραμματισμού Java. Αυτό έχει ως αποτέλεσμα να δίνει την δυνατότητα της πλήρους εκμετάλλευσης των δυνατοτήτων της Java αλλά και το πλεονέκτημα του ομοιογενούς, ως προς τη γλώσσα προγραμματισμού, περιβάλλοντος.

    Η αρχιτεκτονική ενός RMI συστήματος ακολουθεί την δομή των στρωμάτων-επιπέδων (layers). Υπάρχουν τρία (συν ένα) επίπεδα:

    Υπάρχει, επίσης, το επίπεδο της Εφαρμογής (Application) το οποίο όμως δεν αποτελεί καθαρό κομμάτι της τεχνολογίας και το οποίο βρίσκεται πάνω απΤ τα υπόλοιπα.

    Η διαδικασία επίκλησης κάποιων υπηρεσιών από έναν πελάτη, δεν διαφέρει, ιδιαίτερα, σε σχέση με τις προαναφερθείσες τεχνολογίες. Ένας πελάτης, ο οποίος επιθυμεί την υλοποίηση κάποιων υπηρεσιών, υποβάλλει μία αίτηση προς το RMI-σύστημα. Στην αίτηση αυτή θα πρέπει να αναφέρονται οι κατάλληλες εκείνες πληροφορίες οι οποίες απαιτούνται για την αποστολή της αίτησης προς τον κατάλληλο εξυπηρετητή. Αυτές οι πληροφορίες-παράμετροι είναι: μία αναφορά του επιθυμητού αντικειμένου (object reference), οι επιθυμητές μέθοδοι και οι κατάλληλες παράμετροι για την υλοποίηση των μεθόδων.

    Από τη στιγμή που ο πελάτης καταθέσει την αίτησή του, το RMI-σύστημα είναι υπεύθυνο για την ανεύρεση του κατάλληλου εξυπηρετητή, την μεταβίβαση της αιτήσεων και την επιστροφή των αποτελεσμάτων στον πελάτη.

    Όμοια με την CORBA και την COM/DCOM, σε ένα RMI-σύστημα, οι πελάτες δεν έρχονται ποτέ σε απευθείας επικοινωνία με τα επιθυμητά αντικείμενα παρά μόνο μέσω των διασυνδετών αυτών των αντικειμένων. Και εδώ ο διασυνδέτης είναι αυτός που περιέχει τις μεθόδους-υπηρεσίες τις οποίες μπορεί να υλοποιήσει το αντικείμενο.

    Η επικοινωνία πελάτη-αντικειμένου, σΤ ένα σύστημα RMI, είναι η ίδια ανεξάρτητα με το που βρίσκεται το επιθυμητό αντικείμενο (αν δηλαδή βρίσκεται στην ίδια διεργασία με τον πελάτη, αν βρίσκεται τοπικά ή απομακρυσμένα).

    Βιβλιογραφία

    Ασκήσεις

    1. Ερευνήστε το περιβάλλον Windows και τις εφαρμογές που τρέχουν σε αυτό για παραδείγματα επαναχρησιμοποίησης.
    2. Εξετάστε τα εξαρτήματα με τις μεγαλύτερες πωλήσεις που εμφανίζει η εταιρία Componentsource (http://www.componentsource.com). Τι συμπεράσματα βγάζετε για το είδος των εφαρμογών που υλοποιούνται, τα εργαλεία που χρησιμοποιούνται, και τις αντίστοιχες αδυναμίες τους;

    Απόδοση και μεταφερσιμότητα

    Απόδοση

    Η απόδοση του λογισμικού μπορεί να εξεταστεί ως προς: Και οι δύο παράγοντες εξαρτώνται από: Επιπλέον υπάρχουν και άλλοι παράγοντες απόδοσης όπως:

    Πότε βελτιστοποιούμε

    Βελτίωση της ταχύτητας ενός προγράμματος έχει αξία μόνο αν: Επίσης, υπάρχουν κατηγορίες προγραμμάτων στις οποίες συχνά δε μας ενδιαφέρει η ταχύτητα:


    Χρήση επεξεργαστή κατά τη διόρθωση ενός προγράμματος


    Χρήση επεξεργαστή κατά την αποκωδικοποίηση MP3


    Χρήση επεξεργαστή κατά τον ορθογραφικό έλεγχο

    Τα πρώτα δύο προγράμματα πιθανότατα δε θα κερδίσουν από βελτιστοποίηση.

    Τρόποι βελτιστοποίησης

    Βελτιστοποίηση ενός προγράμματος επιτυγχάνουμε με γενικές τεχνικές καθώς και με τεχνικές σχετικές με το πεδίο εφαρμογής του.

    Γενικές τεχνικές είναι οι παρακάτω:

    Τεχνικές σχετικές με το πεδίο εφαρμογής εφαρμόζονται σε τομείς όπως:

    Ανάλυση κατανομής χρόνου

    Βασικό στοιχείο για τη βελτίωση της απόδοσης είναι η μέτρηση του προγράμματος. Μπορούμε να μετρήσουμε:

    Αποδοτικότητα των αλγορίθμων

    Παράδειγμα

    (Από συνέντευξη πρόσληψης στη Microsoft). Εύρεση αν υπάρχει βρόχος σε μια συνδεδεμένη λίστα (π.χ. αν έχουμε ξαναπεράσει από τον ίδιο υπάλληλο σε συναλλαγή με το δημόσιο):

    Τεχνικές βελτιστοποίησης του κώδικα

    Χρήση μνήμης

    Η μνήμη που χρησιμοποιεί ένα πρόγραμμα χωρίζεται στις παρακάτω κατηγορίες:
    Κώδικας (code)
    Οι εντολές του προγράμματος, τυπικά σταθερές κατά την εκτέλεσή του.
    Δεδομένα (data)
    Τα δεδομένα που έχουν οριστεί στατικά μέσα στο πρόγραμμα (π.χ. αρχικές τιμές) καθώς και η δυναμική μνήμη που απαιτείται κατά τη λειτουργία του (εντολή new στη Java / C++, malloc στη C). Σε πολλά προγράμματα αυτή είναι η κατηγορία της μνήμης που μας ενδιαφέρει να βελτιστοποιήσουμε.
    Στοίβα (stack)
    Τοπικές μεταβλητές, κλήση συναρτήσεων ιδίως σε αναδρομικές συναρτήσεις.
    Παράδειγμα χρήσης μνήμης προγράμματος (g++):
          1906  average shared memory size (κώδικας)
          9232  average unshared data size (δεδομένα)
           195  average unshared stack size (στοίβα)
    
    Όταν ο όγκος της κύριας μνήμης του υπολογιστή δεν επαρκεί μπορεί να χρησιμοποιηθεί: Τέλος, για οικονομία στο χώρο που απαιτεί ο κώδικας των προγραμμάτων στο δίσκο, χρησιμοποιούνται συχνά μοιρασμένες βιβλιοθήκες (shared libraries) (π.χ. .DLL, .so).

    Μεταφορά δεδομένων

    Η μεταφορά μεγάλου όγκου δεδομένων συχνά απαιτεί σεβαστό χρόνο, ειδικά αν γίνεται από μέσα με χαμηλό εύρος ζώνης (bandwidth). Βελτίωση του χρόνου μπορούμε να έχουμε με:

    Ενσωματωμένες συσκευές

    Σε ενσωματωμένες συσκευές (κινητά τηλέφωνα, συσκευές αναπαραγωγής MP3, ηλεκτρονικά σημειωματάρια κ.λπ.) οι παράγοντες που έχουν σημασία για την απόδοση είναι συχνά διαφορετικοί. Μπορεί να πρέπει να λάβουμε υπόψη μας:

    Τεχνικές ΣΒΔ

    Σε συστήματα που βασίζονται σε σχεσιακές βάσεις δεδομένων χρησιμοποιούμε συχνά τις παρακάτω τεχνικές για αύξηση της απόδοσης:

    Μεταφερσιμότητα

    Η μεταφερσιμότητα ενός προγράμματος εμποδίζεται από: Ο προγραμματισμός σύμφωνα με τις παρακάτω αρχές αυξάνει τη μεταφερσιμότητα του προγράμματος:

    Απομόνωση

    Μερικές φορές θα πρέπει να χρησιμοποιήσετε μη μεταφέρσιμα στοιχεία. Τότε προσπαθήστε:
    Τεχνικές μεταφερσιμότητας εφαρμογής με γραφική διεπαφή

    Διεθνοποίηση και τοπική προσαρμογή

    Στοιχεία που αφορούν τις παραπάνω ενέργειες είναι: Στο παρακάτω παράδειγμα φαίνεται η αυτόματη εμφάνιση της ημερομηνίας και ώρας σε διαφορετικές γλώσσες:
    en_US
    Sun 05 May 2002 03:19:46 AM EEST
    de_DE
    Son Mai 5 03:19:46 EEST 2002
    it_IT
    dom 05 mag 2002 03:19:46 EEST
    af_ZA
    So 05 Mei 2002 03:19:46 EEST

    Βιβλιογραφία

    Ασκήσεις

    1. Έχετε να επιλέξετε ανάμεσα σε αλγορίθμους που απαιτούν
      • 5000 + 1000 λογ10 ν,
      • ν2 / 1000, και
      • 50 ν πράξεις.
      Υπολογίστε πόσες πράξεις θα χρειαστούν για την επεξεργασία 10, 1.000, 1.000.000, 1.000.000.000 στοιχείων και εξηγήστε ποιόν αλγόριθμο θα διαλέγατε σε κάθε περίπτωση. Εκφράστε τα παραπάνω με τη χρήση της σημειογραφίας Ο().
    2. Διαβάστε και αναλύστε πως η γλώσσα Java διευκολύνει το πρόβλημα της μεταφερσιμότητας των προγραμμάτων.
    3. Αναλύστε τις τοπικές προσαρμογές που επιτρέπει το σύστημα Microsoft Windows.

    Έλεγχος

    Στόχοι του ελέγχου

    "On January 23, 2003, a Singapore Airlines (SIA) Boeing 747-400 experienced a complete loss of information on all six integrated display units (IDU) on the flight deck instrument panels while in cruise flight from Singapore to Sydney, Australia. The pilots flew the airplane for 45 minutes using standby flight instruments while they communicated with SIA maintenance personnel about the problem. SIA maintenance personnel advised the flight crew to pull out then push back in (or cycle) the circuit breakers for the EFIS/EICAS interface units (EIU), which returned the IDUs to normal operation. The flight continued to Sydney and landed without further incident."
    U.S. National Transportation Safety Board Recommendations A-03-55 and A-03-56 (http://www.ntsb.gov/Recs/letters/2003/A03_55_56.pdf)

    Μια ακραία θεώρηση της διεργασίας του ελέγχου είναι η παρακάτω:

    Βασικές αρχές

    Επαλήθευση και επικύρωση

    Λογισμικό που μπορεί να ελεγχθεί

    Για να μπορέσει το λογισμικό να ελεγχθεί αποτελεσματικά πρέπει να πληροί τις παρακάτω προϋποθέσεις: Αναλυτικά:

    Κατηγορίες ελέγχων

    Στρατηγικές δυναμικού ελέγχου

    Διακρίνουμε δύο τρόπους δυναμικού ελέγχου του λογισμικού:

    Στρατηγική μαύρου κουτιού

    Στρατηγική άσπρου κουτιού

    Σχέδιο δυναμικού ελέγχου

    1. Ταυτότητα
    2. Εισαγωγή
      1. Στόχοι
      2. Υποδομή
      3. Έκταση του ελέγχου
      4. Παραπομπές
    3. Στοιχεία προς έλεγχο
    4. Χαρακτηριστικά που θα ελεγχθούν
    5. Χαρακτηριστικά που δε θα ελεγχθούν
    6. Μεθοδολογία
    7. Κριτήρια αποδοχής
    8. Κριτήρια αναστολής και απαιτήσεις επανάληψης
      1. Αναστολή ελέγχου
      2. Επανάληψη ελέγχων
    9. Παραδοτέα
    10. Εργασίες ελέγχου
    11. Περιβάλλον ελέγχου
    12. Ευθύνες
      1. Ομάδα διοίκησης ελέγχου
      2. Ομάδα ανάπτυξης
      3. Ομάδα ελέγχου
    13. Προσωπικό και εκπαίδευση
      1. Προσωπικό
      2. Εκπαίδευση
    14. Χρονοδιάγραμμα
    15. Αντιμετώπιση προβλημάτων
    16. Έγκριση
    Οι έλεγχοι πραγματοποιούνται με βάση την παρακάτω τεκμηρίωση:

    Αυτοματοποιημένος έλεγχος

    Διαχείριση λαθών

    Η διαχείριση των λαθών πρέπει να γίνεται οργανωμένα. Σε αυτό απαραίτητη είναι μια ΒΔ ή ένα ειδικό πρόγραμμα. Για κάθε σφάλμα ή πρόβλημα είναι χρήσιμα τα παρακάτω στοιχεία:

    Βιβλιογραφία

    Παράρτημα: έλεγχοι συμμόρφωσης στο σύστημα Windows

    Κατά τη Microsoft ή συμμόρφωση ενός προγράμματος με το λειτουργικό σύστημα Windows πρέπει να ελέγχεται με τα παρακάτω κριτήρια:
    1	Set Up the Application
    1.1	Setup program should start when CD is inserted.
    1.2	Setup should also run from:
    1.2.1	Control Panel's add/remove programs applet (Application Manager).
    1.2.2	Taskbar's Start.Run.
    1.2.3	Command line.
    1.2.4	Windows Explorer (double-click the Setup program in Windows Explorer).
    1.2.5	Off the Internet (as a self-extracting executable).
    1.3	Aborting Setup, exiting or canceling Setup before completion should mean that:
    1.3.1	Temp directories are removed.
    1.3.2	Registry is rolled back (if changed).
    1.3.3	No files are installed.
    1.3.4	No system files are updated.
    1.3.5	No program groups or folders are left on the Start menu.
    1.4	Setup options should include:
    1.4.1	Change name of install directory.
    1.4.2	Install to compressed directory.
    1.4.3	Install on a drive different from the OS. (Install application on a FAT32 drive if Windows NT is installed on NTFS, for example.)
    1.4.4	Install on a system where the OS is not on C.
    1.4.5	Install on a system that has no autoexec.bat or config.sys in the root of C.
    1.4.6	Installation options to test:
    1.4.6.1	Choose "full" or "complete" to make sure everything installs.
    1.4.6.2	Choose partial options, to make sure core parts of the application are still installed.
    1.4.6.3	Rerun Setup to add options not installed during the partial installation, and verify that those options have been added.
    1.4.6.4	Update/patch installation from the Internet, if files are available.
    1.4.6.5	Administrative installation: Install on a server, and then test a local workstation installation.
    1.5	Setup should detect the following environment variables:
    1.5.1	The current version of Windows.
    1.5.2	A previous installation of the same application.
    1.5.3	Earlier versions of the application. (Setup should upgrade these.)
    1.5.4	Other, possibly newer, versions of applications it integrates with. (Test installation on machines with newest versions of Office suites and browsers, for example.)
    1.5.5	Disk space, including:
    1.5.5.1	Drives with "not enough" space.
    1.5.5.2	Very large drives (more than 8 gigabytes [GB]).
    1.5.5.3	Removable media (ZIP, Jazz).
    1.5.6	The presence or absence of sound cards and other special hardware. (Setup should then select the correct installation options.)
    1.5.7	Fonts:
    1.5.7.1	Verify that installed fonts are visible in \Fonts folder (Control Panel).
    1.5.7.2	Verify installed fonts in other applications (WordPad, Office suites).
    1.5.7.3	Print hard copy using fonts and verify.
    1.6	Program group/folder tests should verify that:
    1.6.1	The "Change default name" option works.
    1.6.2	All expected links (icons) appear.
    1.6.3	All links (icons) work.
    1.6.4	Only one group/folder is created.
    1.7	If the installation continues across two or more CDs:
    1.7.1	The installation should proceed without user intervention after the user mounts the next CD.
    1.7.2	If the application accesses content on the CDs (such as Clipart) after installation, open representative files from each CD, using:
    1.7.2.1	The same CD drive used to install the application.
    1.7.2.2	A separate CD drive for data CDs.
    1.7.2.3	Two or more drives for data CDs simultaneously.
    1.8	Uninstall should:
    1.8.1	Be available from Control Panel's add/remove programs applet (Application Manager).
    1.8.2	Remove all program files and folders.
    1.8.3	Remove all registry entries.
    1.8.4	Remove the program group/folder.
    1.8.5	Retain all shared files.
    1.8.6	Retain all system files.
    2	Start the Application
    2.1	From a Start program/shortcut.
    2.2	From Start, Run.
    2.3	From an Explorer icon/shortcut.
    2.4	From a desktop icon/shortcut.
    2.5	From a command line.
    2.6	By double-clicking the icon of a file associated with the application.
    2.7	From a shortcut in the Startup group:
    2.7.1	From a personal or common group on reboot.
    2.7.2	From a common group only when changing logged-on user.
    2.8	As service (when applicable):
    2.8.1	Manual, automatic, disabled.
    2.8.2	Log on as system account.
    2.8.3	Log on as specific user:
    2.8.3.1	With that user logged on.
    2.8.3.2	With a different user logged on.
    2.9	As a Darwin-aware application (when applicable):
    2.9.1	Advertised.
    2.9.2	Published.
    2.10	As a second instance of the same app
    3	Close the Application
    3.1	Using File.Close or app's equivalent.
    3.2	Using the Close button.
    3.3	Using the system menu and accelerator.
    3.4	From the minimized icon on the taskbar.
    3.5	From the tray icon (for tray-enabled applications).
    3.6	From system shutdown:
    3.6.1	No dialog should appear if no "documents" are open and unsaved.
    3.6.2	If unsaved "documents" are open, the user should be prompted to save them.
    4	Run the Application
    4.1	File I/O:
    4.1.1	Open sample documents that ship with the application, or make several documents and use them in future testing.
    4.1.2	Save each document in each supported format using Long File Names (max path name length, using all legal naming characters) to:
    4.1.2.1	Local drives:
    4.1.2.1.1	NTFS drives:
    4.1.2.1.1.1	Compressed
    4.1.2.1.1.2	Uncompressed
    4.1.2.1.1.3	Encrypted
    4.1.2.1.1.4	Through reparse point to local machine
    4.1.2.1.1.5	Through reparse point to remote share
    4.1.2.1.2	FAT16 drives
    4.1.2.1.3	FAT32 drives
    4.1.2.2	Remote (network) machines mapped to drive letters:
    4.1.2.2.1	NTFS drives:
    4.1.2.2.1.1	Compressed
    4.1.2.2.1.2	Uncompressed
    4.1.2.2.1.3	Encrypted
    4.1.2.2.1.4	Through reparse point to local machine
    4.1.2.2.1.5	Through reparse point to remote share
    4.1.2.2.2	FAT16 drives
    4.1.2.2.3	FAT32 drives
    4.1.2.2.4	Win9x systems
    4.1.2.2.5	Netware network
    4.1.2.2.6	Macintosh systems
    4.1.2.2.7	Other operating systems (if mounting systems are available)
    4.1.2.3	Remote (network) machines using UNC (Uniform Naming Convention):
    4.1.2.3.1	NTFS drives:
    4.1.2.3.1.1	Compressed
    4.1.2.3.1.2	Uncompressed
    4.1.2.3.1.3	Through reparse point to local machine
    4.1.2.3.1.4	Through reparse point to remote share
    4.1.2.3.2	FAT16 drives
    4.1.2.3.3	FAT32 drives
    4.1.2.3.4	Win9x systems
    4.1.2.3.5	Netware network
    4.1.2.3.6	Macintosh systems
    4.1.2.3.7	Other operating systems (if mounting systems are available)
    4.1.3	Open each of the saved documents from each drive or share:
    4.1.3.1	Verify that document is unchanged from the original.
    4.1.3.2	Change the document, resave, reopen, and verify changes.
    4.1.4	Open (create), save, reopen, and verify special-case files, including:
    4.1.4.1	Very small (zero length) files.
    4.1.4.2	Very large files.
    4.1.4.3	Files in formats not native to the application.
    4.1.4.4	Damaged or misnamed files.
    4.1.4.5	Files the application can recognize from earlier versions or other applications.
    4.1.5	Open a large number of files:
    4.1.5.1	In MDI applications:
    4.1.5.1.1	Cascade windows.
    4.1.5.1.2	Tile windows.
    4.1.5.1.3	Minimize windows.
    4.1.5.1.4	Switch among windows.
    4.1.5.2	Verify that Most Recently Used file lists behave as expected.
    4.1.5.3	Verify Close All, if implemented.
    4.1.6	Open by drag/dropping file icons onto open application window.
    4.2	Printing
    4.2.1	Create or open sample documents that contain the following, if supported:
    4.2.1.1	Text in various sizes, styles and colors using:
    4.2.1.1.1	TrueType fonts, including at least one font not resident on attached printers.
    4.2.1.1.2	Postscript fonts.
    4.2.1.1.3	Printer resident fonts.
    4.2.1.2	Rotated text.
    4.2.1.3	Reversed text.
    4.2.1.4	Plain and reversed text:
    4.2.1.4.1	On top of other text.
    4.2.1.4.2	Under other text.
    4.2.1.4.3	On top of other lines created by application.
    4.2.1.4.4	Under other lines created by application.
    4.2.1.4.5	On top of other graphics.
    4.2.1.4.6	Under other graphics.
    4.2.1.5	Graphics:
    4.2.1.5.1	Vector
    4.2.1.5.2	Bitmap
    4.2.1.5.3	Scripted (.wmf files, for example)
    4.2.1.5.4	Opaque and transparent backgrounds
    4.2.1.5.5	Rotated graphics
    4.2.1.5.6	Graphics that extend off the edge of the page
    4.2.1.5.7	Graphics framed and cropped by the app
    4.2.1.6	Objects drawn by the application (arrows, lines, borders, shapes):
    4.2.1.6.1	Thick objects
    4.2.1.6.2	Thin objects (hairlines)
    4.2.1.6.3	Hatching, dotted, dashed, solid colors and grays
    4.2.1.7	Objects embedded from other OLE/COM servers.
    4.2.2	Print each sample to printers with Long File Names (printer names include all legal Long File Name characters and are at least 128 characters long):
    4.2.2.1	Ink jet
    4.2.2.2	PostScript black
    4.2.2.3	PostScript printer
    4.2.2.4	Non-Postscript black laser
    4.2.2.5	Non-Postscript color laser
    4.2.2.6	Fax
    4.2.2.7	Special printers supported by the application (pen plotters, for example)
    4.2.2.8	Local printers created from network print servers
    4.2.2.9	Printers connected from net servers
    4.2.2.10	Set properties and print in the following formats:
    4.2.2.10.1	Landscape
    4.2.2.10.2	Portrait
    4.2.2.10.3	Rotated
    4.2.2.10.4	Duplex
    4.2.2.10.5	Enlarged/reduced
    4.2.2.10.6	Stapled/collated
    4.2.2.10.7	Color as black-and-white
    4.3	Normal Windows user actions:
    4.3.1	Check all menus.
    4.3.1.1	Open documents or perform other actions that expose new menus.  (For example, some applications do not show menus or disable/gray-out choices unless objects are selected on a document.)
    4.3.1.2	Open all second-level and lower-level menus.
    4.3.1.3	Choose menu options and verify results using:
    4.3.1.3.1	Menu command.
    4.3.1.3.2	Access key (Alt+underlined-letter).
    4.3.1.3.3	Accelerator. (For example, Ctrl+O often performs File.Open.)
    4.3.1.4	Toggle and verify checked menu commands.
    4.3.1.5	Tear off and float menus (if supported).
    4.3.1.6	Add and remove menu commands (if supported).
    4.3.1.7	Close and reopen the application, verify persistence of menu changes.
    4.3.2	Test dialogs:
    4.3.2.1	Resize (if supported) and look for text clipping or controls that overlap.
    4.3.2.2	Move dialog over application and off application to desktop and other running applications, verify repainting.
    4.3.2.3	Test all controls for "normal" operation. (Note: Many controls can have restricted behaviors on some dialogs by design and custom controls that simulate standard Windows controls may have unusual behaviors, by design.)
    4.3.2.3.1	Enter unexpected text in Edit boxes .
    4.3.2.3.2	Move scroll bars and spin controls to extreme limits.
    4.3.2.3.3	Click check boxes several times to toggle states.
    4.3.2.3.4	Only one option (radio) button in a group should be "set" at any time, although by default all may be un-set when a dialog opens.
    4.3.2.3.5	Select several contiguous and discontiguous items in multiline list boxes.
    4.3.2.3.6	Select several different items in sequence from combo boxes.
    4.3.2.3.7	Click header controls to change sort order of lists.
    4.3.2.3.8	Right-click in all dialogs at several places. Any context menus that appear should make sense in the context of the dialog and click location. (For example, the "copy," "cut," "clear," and "delete" commands, if present, should be disabled or grayed out if nothing is selected.)
    4.3.2.3.9	Click on areas that do not look like controls to verify that nothing happens.
    4.3.2.4	Check all labels (static text) for clipping or truncated strings.
    4.3.2.5	Check appearance of bitmaps that are not controls.
    4.3.2.6	Close the dialog using:
    4.3.2.6.1	OK button.
    4.3.2.6.2	Cancel button.
    4.3.2.6.3	Close button.
    4.3.2.6.4	System menu and accelerator (usually Ctrl+F4).
    4.3.2.6.5	Escape key.
    4.3.3	Test toolbars:
    4.3.3.1	Show/hide toolbars.
    4.3.3.2	Verify that buttons' states (either enabled or grayed-out) track the state of the application.
    4.3.3.3	Show/hide text.
    4.3.3.4	Change size, style of icons/bitmaps.
    4.3.3.5	Tear off/dock (on all edges).
    4.3.3.6	Overlap.
    4.3.3.7	Move off parent application's window.
    4.3.3.8	Resize, verify expected button behavior (some buttons disappear off the end of the toolbar, others warp to multiple lines).
    4.3.3.9	Customize:
    4.3.3.9.1	Remove buttons.
    4.3.3.9.2	Add buttons.
    4.3.3.9.3	Change button sequence.
    4.3.3.9.4	Change button properties:
    4.3.3.9.4.1	Bitmap/icon.
    4.3.3.9.4.2	Text.
    4.3.3.9.4.3	Action the button controls.
    4.3.3.10	Close the application, reopen, and verify that the expected toolbar preferences persist.
    4.4	Editing functions
    4.4.1	Select, using:
    4.4.1.1	Menu (Select All).
    4.4.1.2	Context menu.
    4.4.1.3	Accelerators (Ctrl+A).
    4.4.1.4	Mouse (click, drag).
    4.4.1.5	Arrow keys.
    4.4.2	Copy/cut/paste:
    4.4.2.1	From Menus.
    4.4.2.2	From Toolbars.
    4.4.2.3	Using Windows accelerators (Ctrl+C and Ctrl+Insert for Copy, and so on).
    4.4.2.4	Using context (right-click) menus.
    4.4.2.5	From other applications via the Clipboard (including text and graphics).
    4.4.2.6	To other applications (including text and graphics).
    4.4.3	Move items, using:
    4.4.3.1	Mouse (click, drag).
    4.4.3.2	Arrow keys.
    4.4.4	Delete items, (and verify they are not on the Clipboard), using:
    4.4.4.1	Menu.
    4.4.4.2	Context menu.
    4.4.4.3	Accelerators.
    4.4.4.4	Mouse (click, drag).
    4.4.4.5	Arrow keys.
    4.4.5	Test editing with application's Clipboard (if it's separate from the Windows Clipboard).
    4.5	OLE, ActiveX, COM, DCOM:
    4.5.1	Test containers with objects from a variety of servers.
    4.5.2	Drag/drop embedded objects from servers to containers.
    4.5.3	Use Insert or Paste.Special to embed objects in containers (test all variations); If the test application is an OLE/ActiveX server, insert its objects in other containers.
    4.5.4	In all documents with embedded objects, launch the servers from the objects:
    4.5.4.1	Test editing the objects in place.
    4.5.4.2	Test saving the objects in place.
    4.5.5	Save and reopen documents with embedded objects, verify results.
    4.5.6	Print documents with embedded objects, verify results.
    4.6	Appearance
    4.6.1	Test at various color depths (watch for changes in bitmaps on dialogs and toolbars, especially when grayed-out); test at various resolutions.
    4.6.2	Test maximize, minimize, restore/resize.
    4.6.3	Test with Taskbar:
    4.6.3.1	Select "Always on top" option.
    4.6.3.2	Select "Autohide" option.
    4.6.3.3	Show/hide clock.
    4.6.3.4	Dock the taskbar to all four sides of desktop.
    4.6.3.5	Make the taskbar larger (more rows/columns) than standard size.
    4.6.3.6	For applications that switch to full-screen mode (such as presentations applications) verify that taskbar appears normally after application returns from full-screen mode.
    4.6.4	Move the application over and under other running applications' windows to verify all for proper repainting.
    4.6.5	Test with "always on top" toolbars and trays from other applications, such as Office suites.
    4.6.6	Test on multiple monitors:
    4.6.6.1	Use at least two monitors, one offset below and to the right of the other.
    4.6.6.2	Use each available monitor as the primary monitor.
    4.6.6.3	Maximize the application on each monitor.
    4.6.6.4	Drag across multiple monitors.
    4.6.6.5	Verify that dialogs from the application do appear on parts of the virtual monitor not represented by real monitor screens, where the user cannot reach them with the mouse.
    4.6.6.6	Test left- and right-mouse clicks on all dialogs and application surfaces on all monitors for all combinations.
    4.6.6.7	Move the taskbar so it sits on divisions between the monitors.
    4.6.6.8	Float all possible application elements off the parent's monitor to other monitors; Verify that all toolbar and other functions still work.
    4.6.6.9	Test animation such as graphics rotations, drawing rendering, movies and screen savers across all monitors.
    4.7	Help:
    4.7.1	Open Help, using:
    4.7.1.1	Menu commands.
    4.7.1.2	The toolbar.
    4.7.1.3	Context menus, if supported.
    4.7.1.4	F1.
    4.7.1.5	Shift+F1.
    4.7.2	Verify all supported:
    4.7.2.1	Bookmarks.
    4.7.2.2	Annotations.
    4.7.2.3	Search Index.
    4.7.2.4	Links.
    4.7.2.5	Scrolling.
    4.7.2.6	Special functions and controls, such as buttons.
    4.7.3	Open all supported Help files, including files from other applications, if linked.
    4.8	Supported hardware:
    4.8.1	Scanners:
    4.8.1.1	Twain
    4.8.1.2	SCSI
    4.8.1.3	Parallel
    4.8.1.4	Serial
    4.8.1.5	USB
    4.8.2	Tape drives:
    4.8.2.1	SCSI
    4.8.2.2	Parallel
    4.8.2.3	IDE
    4.8.2.4	USB
    4.8.2.5	Proprietary driver hardware
    4.8.3	Video:
    4.8.3.1	Cameras
    4.8.3.2	Editing/frame capture
    4.8.3.3	Tuner
    4.8.4	Sound:
    4.8.4.1	Playback
    4.8.4.2	Record
    4.8.4.3	Tuner
    4.8.5	Telephony devices:
    4.8.5.1	POTS Modems
    4.8.5.2	ISDN
    4.8.5.3	ADSL
    4.8.6	Pointing devices:
    4.8.6.1	Touch pads
    4.8.6.2	Touch screens
    4.8.6.3	Mice with multiple buttons and wheels
    4.8.6.4	Trackballs and mice requiring special drivers
    4.8.7	Mass storage:
    4.8.7.1	Removable drives:
    4.8.7.1.1	SCSI
    4.8.7.1.2	IDE
    4.8.7.1.3	Parallel
    4.8.7.1.4	USB
    4.8.7.1.5	CD-R/W
    4.8.7.1.6	SCSI
    4.8.7.1.7	IDE
    4.8.7.1.8	USB
    4.8.8	IRDA
    4.9	Special functions:
    4.9.1	Send to.
    4.9.2	Launch applications from toolbars.
    4.9.3	Run in background, or as service, or scheduled. (Test other applications with background services/systems running.)
    4.9.4	Export to HTML. (Test resulting HTML with common browsers and other apps that can read or import HTML.)
    4.9.5	Databases:
    4.9.5.1	Concurrent user access, file locking.
    4.9.5.2	Complex queries.
    4.9.6	Other application-specific functions
    

    Ασκήσεις

    1. Περιγράψτε τις τιμές εισόδου για κάθε συνάρτηση για να ελεγχθεί ο παρακάτω κώδικας:
      int 
      min(int t1, int t2)
      {
        return t2 > t1 ? t1 : t2;
      }

      int 
      max(int t1, int t2)
      {
        return t1 > t2 ? t1 : t2;
      }

      int 
      min(int t1, int t2, int t3)
      {
        return min(min(t1, t2), t3);
      }

      int 
      max(int t1, int t2, int t3)
      {
        return max(max(t1, t2), t3);
      }

      int 
      range(int min, int max, int val)
      {
        return min(max(min, val), max);
      }
    2. Γράψτε ένα πρόγραμμα ελέγχου για τις παραπάνω συναρτήσεις
    3. Δοκιμάστε τη χρήση της κλάσης JUnit
    4. Υλοποιήστε στη ΒΔ Access ένα απλό σύστημα παρακολούθησης λαθών

    Αλλαγή και συντήρηση

    Τύποι συστημάτων

    Για να κατανοήσουμε την ανάγκη αλλαγών στο λογισμικό χωρίζουμε τα αντίστοιχα συστήματα σε τρεις κατηγορίες, σύμφωνα με το μοντέλο S-P-E
    S
    Ένα πρόγραμμα τύπου S πρέπει να ικανοποιεί μια συγκεκριμένη και γνωστή από πριν απαίτηση (specification).
    P
    Ένα πρόγραμμα τύπου P απαιτείται να δίνει λύση σε ένα πραγματικό πρόβλημα (problem).
    E
    Ένα πρόγραμμα τύπου E (evolutionary) ελέγχεται με βάση το περιβάλλον μέσα στο οποίο εκτελείται και εξελίσσεται. Κριτήρια για την αποδοχή του προγράμματος είναι τα αποτελέσματα της εκτέλεσής του μέσα στο περιβάλλον αυτό.

    Στρατηγικές αλλαγής του λογισμικού

    Δυναμική συντήρησης, οι νόμοι του Lehman

    Οι παρακάτω αρχές έχουν διατυπωθεί για προγράμματα τύπου Ε:
    Συνεχιζόμενη αλλαγή
    Τα προγράμματα που χρησιμοποιούνται πρέπει να αλλάζουν, αλλιώς γίνονται όλο και λιγότερο χρήσιμα.
    Αυξανόμενη πολυπλοκότητα
    Καθώς ένα πρόγραμμα αλλάζει γίνεται όλο και πιο πολύπλοκο απαιτώντας όλο και περισσότερους πόρους για τη συντήρησή του.
    Εξέλιξη μεγάλων συστημάτων
    Η εξέλιξη μεγάλων συστημάτων είναι μια αυτοελεγχόμενη διεργασία. Παράγοντες όπως το μέγεθος, ο χρόνος ανάμεσα σε εκδόσεις και ο αριθμός των λαθών παραμένουν σταθερά ανάμεσα σε εκδόσεις.
    Οργανωσιακή σταθερότητα
    Κατά τη διάρκεια ζωής ενός προγράμματος η ανάπτυξή του παραμένει σταθερή και ανεξάρτητη των πόρων που αφιερώνονται σε αυτή
    Διατήρηση της εξοικείωσης
    Κατά τη διάρκεια ζωής ενός προγράμματος το μέγεθος των αλλαγών από τη μια έκδοση στην επόμενη παραμένει σταθερό.
    Διατήρηση του ρυθμού αύξησης
    Για να διατηρηθεί η ικανοποίηση των χρηστών, πρέπει τα λειτουργικά χαρακτηριστικά του προγράμματος να αυξάνονται διαρκώς.
    Φθίνουσα ποιότητα
    Αν δεν υπάρχει διαρκής προσπάθεια συντήρησης στο περιβάλλον της χρήσης, η ποιότητα του προγράμματος θα θεωρείται από τους χρήστες του ως φθίνουσα.
    Ανατροφοδοτούμενο σύστημα
    Η διεργασία προγραμματισμού συστημάτων τύπου Ε πρέπει να αντιμετωπίζεται ως μια ανατροφοδοτούμενη διεργασία για να μπορέσει να βελτιωθεί.

    Είδη συντήρησης

    Το κόστος της συντήρησης

    Το κόστος της συντήρησης είναι μεγαλύτερο από αυτό της ανάπτυξης. Μερικοί λόγοι είναι για αυτό είναι:

    Διεργασία συντήρησης

    Προγραμματισμένες

    Με πίεση χρόνου

    Μετρικές

    Ο ρυθμός αλλαγών στο σύστημα εξαρτάται από τους παρακάτω παράγοντες: Κατά τη διάρκεια ζωής του συστήματος εξετάζουμε και τους παρακάτω παράγοντες:

    Αρχιτεκτονική εξέλιξη

    Η αρχιτεκτονική εξέλιξη ενός συστήματος επηρεάζεται από τους παρακάτω παράγοντες:

    Κληρονομημένα συστήματα

    Παλιά κληρονομημένα συστήματα (legacy systems) μπορούν να προσαρμοστούν σε νέες αρχιτεκτονικές με επέμβαση σε ένα από τα παρακάτω επίπεδα:

    Επανυλοποίηση

    Η επανυλοποίηση ενός συστήματος μπορεί να περιλάβει τα παρακάτω στάδια:

    Βιβλιογραφία

    Ασκήσεις

    1. Δώστε παραδείγματα για προγράμματα τύπου S, P, E.
    2. Κατηγοριοποίστε το είδος των αλλαγών που οδήγησαν στα παρακάτω προϊόντα:
      • Windows 95 Service Pack 2
      • Windows CE
      • Windows 98
      • Windows NT 3.51
      • Windows NT 3.51 for Alpha architecture
      • Windows NT 3.51 Service Pack 2
      • Windows XP
    3. Επανυλοποιήστε ένα δικό σας παλιό πρόγραμμα. Κατηγοριοποιήστε τα είδη των αλλαγών που κάνατε.
    4. Προσπαθήστε να απαριθμήσετε αρθρώματα από τα οποία πιθανώς αποτελείται το πρόγραμμα Microsoft Word.

    Διαχείριση σχηματισμών

    Ανάγκες

    Η διαχείριση σχηματισμών (configuration management) είναι η διεργασία που ελέγχει τον τρόπο με τον οποίο συνθέτονται τα στοιχεία του λογισμικού για να αποτελέσουν το τελικό προϊόν. Η διεργασία αυτή έχει ως στόχο να δώσει απάντηση στα παρακάτω προβλήματα:

    Απαντήσεις

    Ένα σύστημα διαχείρισης σχηματισμών μπορεί να μας δώσει απαντήσεις στα παρακάτω ερωτήματα:

    Τα στοιχεία ενός σχηματισμού

    Τα παρακάτω στοιχεία πρέπει να βρίσκονται κάτω από έλεγχο σχηματισμών λογισμικού:

    Σχέδιο διαχείρισης σχηματισμών

    Το σχέδιο διαχείρισης σχηματισμών (configuration management plan) του λογισμικού περιλαμβάνει τα παρακάτω στοιχεία:
    1. Εισαγωγή
      1. Σκοπός
      2. Εμβέλεια
      3. Ορισμοί και συντομογραφίες
      4. Αναφορές
    2. Διοίκηση
      1. Οργανισμός
      2. Υπευθυνότητες
      3. Ορισμός διεπαφών
      4. Τρόπος υλοποίησης
      5. Εφαρμόσιμες πολιτικές, κατευθύνσεις, διαδικασίες
    3. Δραστηριότητες
      1. Καθορισμός σχηματισμού
      2. Έλεγχος αλλαγών
      3. Προσδιορισμός κατάστασης σχηματισμού
      4. Έλεγχος σχηματισμού
    4. Εργαλεία, τεχνικές, μέθοδοι
      • Βασικές εκδόσεις
      • Τρόπος αναγνώρισης τμημάτων
      • Επιθεωρήσεις
      • Αυτόματες και μη διεργασίες
      • Έντυπα και αρχεία
      • Εργαλεία
    5. Έλεγχος προμηθευτή
    6. Συλλογή και διαφύλαξη στοιχείων

    Ονομασία οντοτήτων

    Κάθε στοιχείο του σχηματισμού του λογισμικού πρέπει να μπορεί να απεικονίζεται μονοσήμαντα για μια συγκεκριμένη έκδοσή του. Για το λόγο αυτό το χαρακτηρίζουμε με: Με βάση τα παραπάνω στοιχεία μπορούμε να σχηματίσουμε και την εικόνα ολόκληρου του σχηματισμού μιας έκδοσης του λογισμικού

    Εκδόσεις και παραλλαγές του στοιχείου cat.c στο λειτουργικό σύστημα NetBSD.

    Στοιχεία σχηματισμού του προγράμματος cat στο λειτουργικό σύστημα FreeBSD:

    $FreeBSD: src/lib/libc/i386/string/strncmp.S,v 1.6 1999/08/27 23:59:35 peter Exp $
    $FreeBSD: src/lib/libc/i386/string/strchr.S,v 1.5 1999/08/27 23:59:33 peter Exp $
    $FreeBSD: src/lib/libc/i386/string/strcat.S,v 1.5 1999/08/27 23:59:33 peter Exp $
    $FreeBSD: src/lib/libc/i386/string/strcpy.S,v 1.5 1999/08/27 23:59:34 peter Exp $
    $FreeBSD: src/lib/libc/i386/string/strcmp.S,v 1.5 1999/08/27 23:59:33 peter Exp $
    $FreeBSD: src/lib/libc/i386/string/memchr.S,v 1.8 1999/08/27 23:59:31 peter Exp $
    $NetBSD: bcopy.S,v 1.6 1996/11/12 00:50:06 jtc Exp $
    $FreeBSD: src/lib/libc/i386/string/memset.S,v 1.5 1999/08/27 23:59:32 peter Exp $
    $NetBSD: bcopy.S,v 1.6 1996/11/12 00:50:06 jtc Exp $
    $FreeBSD: src/lib/libc/i386/sys/brk.S,v 1.7 1999/08/27 23:59:38 peter Exp $
    $FreeBSD: src/lib/libc/i386/sys/sbrk.S,v 1.7 1999/08/27 23:59:44 peter Exp $
    $FreeBSD: src/lib/libc/i386/sys/cerror.S,v 1.10 1999/08/27 23:59:38 peter Exp $
    $FreeBSD: src/bin/cat/cat.c,v 1.14.2.1 2000/05/16 08:38:49 asmodai Exp $
    $FreeBSD: src/lib/libc/locale/setlocale.c,v 1.25.2.1 2000/06/04 21:47:39 ache Exp $
    $FreeBSD: src/lib/libc/gen/err.c,v 1.6 1999/08/27 23:58:33 peter Exp $
    $FreeBSD: src/lib/libc/i386/gen/isinf.c,v 1.6 1999/08/27 23:59:21 peter Exp $
    

    Διαχείριση αλλαγών

    Οι αποφάσεις για αλλαγές στο λογισμικό πρέπει να λαμβάνονται από μια οργανωμένη ομάδα διαχείρισης σχηματισμών (change control board) σύμφωνα με την παρακάτω διεργασία: Οι αιτήσεις για αλλαγές πρέπει να περιλαμβάνουν τα στοιχεία που έχουμε επισημάνει στην ενότητα του ελέγχου.

    Διαχείριση εκδόσεων

    Κάθε έκδοση του συστήματος πρέπει να περιλαμβάνει τα παρακάτω στοιχεία: Η δημιουργία νέων εκδόσεων εξαρτάται από τους παρακάτω παράγοντες:

    Βάση δεδομένων σχηματισμών

    Όλοι οι σχηματισμοί του λογισμικού πρέπει να φυλάσσονται σε μια βάση δεδομένων με τα παρακάτω στοιχεία για κάθε τμήμα και αλλαγή του σχηματισμού: Περίληψη αλλαγών σε στοιχείο σχηματισμού:
    
    RCS file: RCS/thread.pl
    Working file: thread.pl
    head: 1.20
    branch:
    locks: strict
    	dds: 1.20
    access list:
    symbolic names:
    keyword substitution: kv
    total revisions: 20;	selected revisions: 20
    description:
    Thread HTML pages.
    ----------------------------
    revision 1.20	locked by: dds;
    date: 2001/12/25 20:20:21;  author: dds;  state: Exp;  lines: +2 -2
    Fixed missing quote.
    ----------------------------
    revision 1.19
    date: 2001/12/03 17:13:39;  author: dds;  state: Exp;  lines: +21 -10
    Calculate and print the time of last modification in the "whole" files.
    Better handling of greek language indentification in the face of caching.
    ----------------------------
    revision 1.18
    date: 2001/12/03 16:51:00;  author: dds;  state: Exp;  lines: +12 -7
    Added URLs
    Fixed bug with handling of fmtcode.
    ----------------------------
    revision 1.17
    date: 2001/12/03 14:19:12;  author: dds;  state: Exp;  lines: +2 -2
    Print already defined words in english.
    ----------------------------
    revision 1.16
    date: 2001/11/16 15:12:27;  author: dds;  state: Exp;  lines: +27 -4
    Fixed handling of optimised formatted code scetions using a cache.
    ----------------------------
    revision 1.15
    date: 2001/11/16 14:43:53;  author: dds;  state: Exp;  lines: +5 -1
    Optimise fmtcode generation.
    ----------------------------
    revision 1.14
    date: 2001/11/12 21:52:31;  author: dds;  state: Exp;  lines: +25 -1
    Can format code.
    ----------------------------
    revision 1.13
    date: 2001/10/16 20:16:09;  author: dds;  state: Exp;  lines: +37 -32
    Works with native character set.
    ----------------------------
    revision 1.12
    date: 2001/09/30 16:50:52;  author: dds;  state: Exp;  lines: +31 -31
    Convert to ISO-8859-7
    ----------------------------
    revision 1.11
    date: 2001/09/30 16:48:09;  author: dds;  state: Exp;  lines: +2 -2
    Handle multiple hrefs to images on a line.
    ----------------------------
    revision 1.10
    date: 2001/06/29 11:19:57;  author: dds;  state: Exp;  lines: +28 -1
    Display my details in printed pages.
    ----------------------------
    revision 1.9
    date: 2001/06/29 10:31:49;  author: dds;  state: Exp;  lines: +25 -11
    Can now create english text.
    ----------------------------
    revision 1.8
    date: 2001/06/29 10:05:11;  author: dds;  state: Exp;  lines: +28 -2
    Only update changed items.
    ----------------------------
    revision 1.7
    date: 2001/03/19 23:24:28;  author: dds;  state: Exp;  lines: +3 -2
    Change file destination.
    ----------------------------
    revision 1.6
    date: 2000/08/19 18:23:05;  author: dds;  state: Exp;  lines: +3 -3
    Indexprint is now idxprint to work with 16 bit programs.
    ----------------------------
    revision 1.5
    date: 1999/12/07 22:35:50;  author: dds;  state: Exp;  lines: +4 -1
    Added pointer to toc in the detailed toc page.
    ----------------------------
    revision 1.4
    date: 1999/11/10 09:41:34;  author: dds;  state: Exp;  lines: +12 -3
    Added better support for printable pages.
    ----------------------------
    revision 1.3
    date: 1999/11/10 00:33:12;  author: dds;  state: Exp;  lines: +30 -3
    Added detailed table of contents.
    ----------------------------
    revision 1.2
    date: 1999/05/31 17:27:31;  author: dds;  state: Exp;  lines: +26 -11
    Added local file references.
    Added improved indexing.
    ----------------------------
    revision 1.1
    date: 1999/01/12 10:18:53;  author: dds;  state: Exp;
    Initial revision
    =============================================================================
    

    Εργαλεία ελέγχου σχηματισμών

    Τα εργαλεία ελέγχου σχηματισμών επιτρέπουν την αυτοματοποίηση πολλών από τις διεργασίες που έχουμε περιγράψει. Μερικά γνωστά εργαλεία είναι τα RCS, SCCS, CVS και Visual Source Safe. Για παράδειγμα το εργαλεία CVS παρέχει τις παρακάτω εντολές:
    add
    Add a new file/directory to the repository
    admin
    Administration front end for rcs
    annotate
    Show last revision where each line was modified
    checkout
    Checkout sources for editing
    commit
    Check files into the repository
    diff
    Show differences between revisions
    edit
    Get ready to edit a watched file
    editors
    See who is editing a watched file
    export
    Export sources from CVS, similar to checkout
    history
    Show repository access history
    import
    Import sources into CVS, using vendor branches
    init
    Create a CVS repository if it doesn't exist
    log
    Print out history information for files
    login
    Prompt for password for authenticating server.
    logout
    Removes entry in .cvspass for remote repository.
    rdiff
    Create 'patch' format diffs between releases
    release
    Indicate that a Module is no longer in use
    remove
    Remove an entry from the repository
    rtag
    Add a symbolic tag to a module
    status
    Display status information on checked out files
    tag
    Add a symbolic tag to checked out version of files
    unedit
    Undo an edit command
    update
    Bring work tree in sync with repository
    watch
    Set watches
    watchers
    See who is watching a file

    Εργαλεία ελέγχου παραγωγής κώδικα

    Η σωστή παραγωγή του λογισμικού προϋποθέτει την οργάνωση της διεργασίας δημιουργίας του τελικού εκτελέσιμου προγράμματος από τον πηγαίο κώδικα. Εργαλεία όπως το make και το ant επιτρέπουν την αυτοματοποίηση της διεργασίας αυτής. Παρέχουν της παρακάτω δυνατότητες:

    Εξαρτήσεις σχηματισμών στον apache web server.

    Βιβλιογραφία

    Ασκήσεις

    Διοίκηση έργου

    Οι δυσκολίες

    This project is extremely important, but it has no budget ...

    Ενέργειες της διαχείρισης

    Στοιχεία της διαχείρισης

    Η αποτελεσματική διαχείριση ασχολείται με τέσσερα βασικά στοιχεία:

    Τεκμηρίωση σχεδιασμού

    Ο τρόπος διαχείρισης ενός έργου περιγράφεται από τα παρακάτω σχέδια:

    Το σχέδιο του έργου

    Ο ρόλος της δέσμευσης

    Μεγάλα έργα απαιτούν τη συνεργασία πολλών ανθρώπων που να θέλουν και να μπορούν να δεσμευτούν για την επιτυχία του έργου. Για να είναι ουσιαστική και αποτελεσματική η δέσμευση θα πρέπει (Humphrey 1989): (βλέπε και The Decision Cycle in the IT Industry)

    Διαχείριση κινδύνων

    Η διαχείριση κινδύνων (risk management) ενός έργου περιλαμβάνει τα παρακάτω στάδια
    1. Προσδιορισμός των κινδύνων
    2. Ανάλυση των κινδύνων ως προς
      • την πιθανότητα (%)
      • τα αποτελέσματα (καταστροφικά, σοβαρά, υποφερτά, ασήμαντα)
    3. Προγραμματισμός διαχείρισης
    4. Παρακολούθηση των κινδύνων και αναθεώρηση του σχεδίου

    Κίνδυνοι του έργου

    Τα αποτελέσματα ενός κινδύνου μπορούν να επηρεάσουν: Χωρίζουμε τους κινδύνους στις παρακάτω κατηγορίες:

    Οι σημαντικότεροι κίνδυνοι

    Σύμφωνα με τον Boehm (1991) οι σημαντικότεροι κίνδυνοι ενός έργου ανάπτυξης λογισμικού είναι:

    Επιτήρηση

    Η πρόοδος του έργου πρέπει να ελέγχεται σε τακτικά διαστήματα. Ο έλεγχος γίνεται με αναφορές και σε συναντήσεις του έργου. Στοιχεία προς έλεγχο μπορεί να είναι:

    Οργάνωση ομάδων

    Μπορούμε να οργανώσουμε τις ομάδες υλοποίησης με τους παρακάτω τρόπους: Επιλέγουμε το είδος της ομάδας σύμφωνα με τους παρακάτω παράγοντες:

    Παράδειγμα στελέχωσης

    Η εταιρία NuMega (Sullivan 2001) οργανώνει την ανάπτυξη των προϊόντων γύρω από δύο ομάδες: Στον υπεύθυνο του έργου αναφέρονται οι παρακάτω: O υπεύθυνος του έργου ασχολείται με: O υπεύθυνος ανάπτυξης λογισμικού επιβλέπει τους υπεύθυνους ανά λειτουργική απαίτηση και ασχολείται με: O υπεύθυνος λειτουργικής απαίτησης επιβλέπει τους προγραμματιστές και ασχολείται με:

    Καθήκοντα μετά την υλοποίηση

    Μετά την υλοποίηση του έργου καλό είναι να γίνεται μια ανάλυση με τα παρακάτω στοιχεία:

    Βιβλιογραφία

    Ασκήσεις

    Παραγωγικότητα και κοστολόγηση

    Στοιχεία του προγραμματισμού

    Οι ερωτήσεις που πρέπει να απαντηθούν για τον προγραμματισμό ενός έργου είναι: Τα παραπάνω στοιχεία πρέπει να εκτιμηθούν από την αρχή του έργου, αλλά ενημερώνονται σε όλη τη διάρκειά του.

    Δέκα εμπειρικοί αφορισμοί

    1. Η ανακάλυψη και διόρθωση ενός προβλήματος του λογισμικού μετά την παράδοση, είναι 100 φορές πιο ακριβή από την ανακάλυψη και διόρθωσή του στο στάδιο των απαιτήσεων.
    2. Το πρόγραμμα ανάπτυξης του λογισμικού μπορεί να συμπιεστεί κατά 25% του ονομαστικού, αλλά όχι περισσότερο.
    3. Για κάθε 1 Ευρώ που ξοδεύεται στην ανάπτυξη του λογισμικού, θα ξοδεύονται 2 Ευρώ στη συντήρηση.
    4. Το κόστος ανάπτυξης και συντήρησης του λογισμικού είναι πρωταρχικά συνάρτηση του αριθμού των πηγαίων γραμμών στο προϊόν.
    5. Η ετερογένεια των ατόμων ευθύνεται για τις μεγαλύτερες διαφορές στην παραγωγικότητα λογισμικού.
    6. Η γενική αναλογία κόστους λογισμικού προς κόστος υλικού μεταβλήθηκε από 15/85 το 1955 σε 85/15 το 1985 και συνεχίζει να διευρύνεται.
    7. Η ανάπτυξη λογισμικού σήμερα ακολουθεί μια κατανομή 60-15-25. Το 60% της ανάπτυξης αφιερώνεται στην ανάλυση και σχεδιασμό, το 15% στον προγραμματισμό και 25% στον έλεγχο.
    8. Τα συστήματα λογισμικού και τα προϊόντα λογισμικού κοστίζουν τρεις φορές περισσότερο για να αναπτυχθούν από ότι ένα αυτόνομο πρόγραμμα λογισμικού.
    9. Στη διαδικασία του ελέγχου ανακαλύπτεται το 60% των λαθών.
    10. Πολλές πρακτικές και φαινόμενα λογισμικού ακολουθούν κατανομή Pareto, όπου το 80% της συνεισφοράς προέρχεται από το 20% των συμμετεχόντων.
    (Από το IEEE Software, Vol 4, No 5, Sept 1987, pp 84-85. Επίσης στο Merlin Dorfman, Richard H.Thayer. Software Engineering. Foreword by Barry W. Boehm. IEEE Computer Society Press, 1997. Μετάφραση από την Ιωάννα Γκρίνια)

    Ποσοτικά στοιχεία του κόστους

    Το κόστος ενός έργου περιλαμβάνει τα παρακάτω στοιχεία: Στο κόστος του ανθρώπινου δυναμικού υπολογίζονται εκτός από τους μισθούς, τα παρακάτω γενικά έξοδα (overheads): Τα παραπάνω τυπικά διπλασιάζουν το κόστος ανά μήνα εργασίας με βάση το μισθό. Στην Ελλάδα μην ξεχνάτε να υπολογίζετε 14 μισθούς το χρόνο!

    Παράγοντες που επηρεάζουν την τιμή

    Η τιμή που υπολογίζεται για την ανάπτυξη του λογισμικού συχνά επηρεάζεται από τους παρακάτω παράγοντες:

    Τρόποι μέτρησης

    Γραμμές κώδικα

    Παραδείγματα

    Λειτουργικά χαρακτηριστικά

    Τα στοιχεία που αθροίζονται είναι τα παρακάτω:
    ΣτοιχείοΑριθμός Απλό Μέτριο Πολύπλοκο Σύνολο
    Είσοδοι χρήστη  3 4 6  
    Έξοδοι χρήστη  4 5 7  
    Ερωτήσεις χρήστη  3 4 6  
    Αρχεία ή πίνακες  7 10 15  
    Εξωτερικές διεπαφές  5 7 10  
    Οι ρυθμίσεις είναι το άθροισμα (0: ασήμαντο - 5: ιδιαίτερα σημαντικό) στις παρακάτω ερωτήσεις:
    1. Απαιτείται αξιόπιστο σύστημα εφεδρείας των στοιχείων;
    2. Απαιτείται επικοινωνία δεδομένων;
    3. Απαιτείται κατανεμημένη επεξεργασία;
    4. Είναι σημαντική η απόδοση;
    5. Το σύστημα θα τρέξει σε υπάρχον περιβάλλον;
    6. Απαιτείται διεπαφή για την είσοδο των στοιχείων;
    7. Η είσοδος των στοιχείων θα είναι σε πολλαπλές οθόνες;
    8. Η ενημέρωση των κυρίων αρχείων θα γίνεται άμεσα;
    9. Είναι περίπλοκες οι είσοδοι, έξοδοι, ή οι ερωτήσεις;
    10. Είναι περίπλοκοι οι εσωτερικοί υπολογισμοί;
    11. Ο κώδικας θα πρέπει να επαναχρησιμοποιηθεί;
    12. Περιλαμβάνεται στο σχεδιασμό η μετάπτωση και η εγκατάσταση;
    13. Το σύστημα θα χρησιμοποιείται από διαφορετικούς οργανισμούς ή σε διαφορετικές εγκαταστάσεις;
    14. Θα μπορούν οι χρήστες να τροποποιούν το σύστημα;

    Λειτουργικά αντικείμενα

    ΣτοιχείοΑριθμός Απλό Μέτριο Πολύπλοκο Σύνολο
    Οθόνες  1 2 3  
    Αναφορές  2 5 8  
    Αρθρώματα 3GL  10 10 10  

    Σχέση ΛΧ και ΓΚ

    Ο παρακάτω πίνακας εμφανίζει τη σχέση ΓΚ/ΛΧ για ορισμένες γλώσσες προγραμματισμού:
    ΓλώσσαΓΚ/ΛΧ
    Συμβολική γλώσσα337
    Access35
    Ada154
    ASP69
    C++66
    C162
    COBOL77
    FORTRAN106
    Java62
    JSP59
    Pascal90
    Perl60
    Powerbuilder32
    Smalltalk26
    SQL40
    Visual Basic47

    Τεχνικές εκτίμησης της τιμής

    Αλγοριθμικές
    Χρησιμοποιούμε ιστορικά στοιχεία για να συσχετίσουμε μέγεθος με κόστος. Το μοντέλο υπολογίζει το έργο με βάση το μέγεθος. Παράδειγμα τέτοιων τεχνικών είναι οι τεχνικές COCOMO και COCOMO II.
    Κρίση του ειδικού (expert judgement)
    Ρωτάμε ειδικούς που έχουν εμπειρία σε παρόμοια ανάπτυξη. Οι γνώμες συγκρίνονται και σε περίπτωση διαφωνίας η διαδικασία επαναλαμβάνεται μετά από συζήτηση.
    Κατακερματισμός της εργασίας
    Το σύστημα κατακερματίζεται σε επιμέρους τμήματα για τα οποία υπάρχουν ιστορικά στοιχεία.
    Εκτίμηση με αναλογία
    Συγκρίνουμε το έργο με παρόμοια έργα.
    Νόμος του Parkinson
    Το έργο το χρόνο που είναι διαθέσιμος. Το κόστος εξαρτάται από τους πόρους που θα διατεθούν!
    Κέρδος
    Το κόστος καθορίζεται με βάση το ποσό που είναι διατεθειμένος να διαθέσει ο πελάτης.

    Η τεχνική COCOMO 2

    Αρχέτυπο

    PM = (NOP * (1 - %reuse/100)) / PROD
    Όπου:
    PM
    ΑΜ
    NOP
    Αριθμός από λειτουργικά αντικείμενα (number of object points)
    %reuse
    Ποσοστό επαναχρησιμοποίησης
    PROD
    Ικανότητα και εμπειρία των προγραμματιστών (4: πολύ χαμηλή, 6: χαμηλή, 15: μέση, 25: υψηλή, 50: πολύ υψηλή)

    Αρχικό σχέδιο

    PM = A * SizeB * M + PMM
    Όπου:
    A
    2.5
    Size
    Χιλιάδες γραμμές πηγαίου κώδικα
    B
    Βλ. "υπολογισμός του εκθέτη"
    Μ
    PERS * RCPX * RUSE * RDIF * PREX * FCIL * SCED
    Όπου:
    PERS
    Ικανότητα προσωπικού
    RCPX
    Αξιοπιστία και πολυπλοκότητα (reliability and complexity)
    RUSE
    Επαναχρησιμοποίηση (reuse)
    RDIF
    Δυσκολία της πλατφόρμας υλοποίησης (platform difficulty)
    PREX
    Εμπειρία προσωπικού (personel experience)
    FCIL
    Μέσα υποστήριξης (support facilities)
    SCED
    Πρόγραμμα (schedule)
    PMM
    Υπολογίζεται σε έργα που μεγάλο ποσοστό του κώδικα παράγεται αυτόματα.
    PMM = (ASLOC * (AT / 100)) / ATPROD
    Όπου
    ASLOC
    Αυτόματα παραγόμενες γραμμές
    AT
    Ποσοστό του κώδικα που είναι αυτόματα παραγόμενος
    AT
    Παραγωγικότητα για αυτόματα παραγόμενο κώδικα

    Μετά τον αρχιτεκτονικό σχεδιασμό

    Στον παράγοντα Μ συμμετέχουν τα παρακάτω χαρακτηριστικά (οι τιμές δίνονται από πίνακες βαθμονόμησης σαν αυτόν που βρίσκεται στο τέλος). Υπολογίζεται και ο κώδικας από επαναχρησιμοποίηση σύμφωνα με τον τύπο
    ESLOC = ASLOC * (AA + SU + 0.4DM + 0.3CM + 0.3IM) / 100
    Όπου:
    ESLOC
    Ανάλογες χιλιάδες γραμμές πηγαίου κώδικα
    ASLOC
    Χιλιάδες γραμμές επαναχρησιμοποιούμενου κώδικα
    AA
    Έργο για εκτίμηση του κώδικα (0-8)
    SU
    Κόστος κατανόησης του κώδικα (50: κακογραμμένος, 10: δομημένος)
    DM
    Ποσοστό αλλαγής του σχεδίου
    CM
    Ποσοστό αλλαγής του κώδικα
    IM
    Ποσοστό του συνολικού έργου ολοκλήρωσης που απαιτείται για τον επαναχρησιμοποιούμενο κώδικα

    Υπολογισμός του εκθέτη

    Ο εκθέτης Β εξαρτάται από την οργανωσιακή πολυπλοκότητα του έργου και εκφράζει τις οικονομίες κλίμακας (economies of scale) ή τις αντίστοιχες αντιοικονομίες κλίμακας (diseconomies of scale) που συνδέονται με το έργο. Όταν είναι < 1 όσο μεγαλώνει το έργο, τόσο αυξάνεται η παραγωγικότητα, σε αντίθετη περίπτωση η παραγωγικότητα μειώνεται με την αύξηση του μεγέθους του έργου. Το Β υπολογίζεται ως
    Β = Σ / 100 + 1.01
    όπου Σ το άθροισμα των παρακάτω παραγόντων στην κλίμακα (5: πολύ χαμηλό - 0: πολύ υψηλό):

    Βαθμονόμηση των πολλαπλασιαστών

    Παράγοντας ΠΧ Χ Μ Υ ΠΥ ΕΥ
    RELY 0.75 0.88 1.00 1.15 1.40  
    DATA   0.94 1.00 1.08 1.16  
    CPLX 0.75 0.88 1.00 1.15 1.30 1.65
    RUSE   0.89 1.00 1.16 1.34 1.56
    DOCU 0.85 0.93 1.00 1.08 1.17  
    TIME     1.00 1.11 1.30 1.66
    STOR     1.00 1.06 1.21 1.56
    PVOL   0.87 1.00 1.15 1.30  
    ACAP 1.5 1.22 1.00 0.83 0.67  
    PCAP 1.37 1.16 1.00 0.87 0.74  
    PCON 1.26 1.11 1.00 0.91 0.83  
    AEXP 1.23 1.10 1.00 0.88 0.80  
    PEXP 1.26 1.12 1.00 0.88 0.80  
    LTEX 1.24 1.11 1.00 0.9 0.82  
    TOOL 1.20 1.10 1.00 0.88 0.75  
    SITE 1.24 1.10 1.00 0.92 0.85 0.79
    SCED 1.23 1.08 1.00 1.04 1.10  
    Οι τιμές για τους πολλαπλασιαστές του αρχικού σχεδίου προκύπτουν από τη σύνθεση των παραπάνω πολλαπλασιαστών, σύμφωνα με τον παρακάτω πίνακα:
    Αρχικός Τελικοί
    RCPX RELY, DATA, CPLX, DOCU
    RUSE RUSE
    PDIF TIME, STOR, PVOL
    PERS ACAP, PCAP, PCON
    PREX AEXP, PEXP, LTEX
    FCIL TOOL, SITE
    SCED SCED

    Εκτίμηση χρόνου με βάση την τεχνική COCOMO

    Ο χρόνος υλοποίησης του έργου μπορεί να υπολογιστεί ως
    TDEV = 3 * PM0.33 + 0.2 * (B - 1.01)

    36-hour watches

    Παράγοντες που επηρεάζουν την παραγωγικότητα

    Εμπειρία στο συγκεκριμένο τομέα

    Ποιότητα της διεργασίας ανάπτυξης (+)

    Μέγεθος του έργου (-)

    Τεχνολογική υποστήριξη (+)

    Περιβάλλον εργασίας (+)

    Βιβλιογραφία

    Ασκήσεις

    1. Εφαρμόστε κάθε έναν από τους τρόπους μέτρησης του έργου πάνω στην εργασία που υλοποιήσατε για το μάθημα. Συγκρίνετε τα αποτελέσματά σας με αυτά άλλων ομάδων.

    Μη συμβατικές μεθοδολογίες

    Ευέλικτη ανάπτυξη: στοιχεία

    Η ευέλικτη ανάπτυξη λογισμικού (agile software development) προσδίδει αξία:

    Ευέλικτη ανάπτυξη: αρχές

    Οι αρχές της ευέλικτης ανάπτυξης που έχουν διατυπωθεί στον αντίστοιχο δικτυακό τόπο (http://www.AgileAlliance.org/) είναι οι παρακάτω:
    1. Η μεγαλύτερή μας προτεραιότητα είναι η ικανοποίηση του πελάτη μέσω της άμεσης και συνεχούς παράδοσης χρήσιμου λογισμικού.
    2. Οι αλλαγές στις προδιαγραφές είναι ευπρόσδεκτες, ακόμα και αργά στο στάδιο της ανάπτυξης. Οι ευέλικτες διεργασίες δαμάζουν τις αλλαγές προς όφελος της ανταγωνιστικότητας του πελάτη.
    3. Παραδίδουμε λογισμικό τακτικά, σε διαστήματα μερικών εβδομάδων ή μηνών, προτιμώντας τα μικρά διαστήματα.
    4. Αυτοί που ασχολούνται με το επιχειρηματικό τμήμα και αυτοί που ασχολούνται με την ανάπτυξη πρέπει να συνεργάζονται καθημερινά σε όλη τη διάρκεια του έργου.
    5. Βάση για τα έργα είναι οι άνθρωποι με κίνητρα και το αντίστοιχο ενδιαφέρον. Δώστε τους το περιβάλλον και την υποστήριξη που χρειάζονται και εμπιστευτείτε τους να περατώσουν το έργο.
    6. Ο πιο αποδοτικός και αποτελεσματικός τρόπος μεταφοράς πληροφορίας προς την και μέσα στην ομάδα ανάπτυξης είναι η συζήτηση πρόσωπο-με-πρόσωπο.
    7. Η κύριος τρόπος μέτρησης της προόδου είναι το λογισμικό που λειτουργεί.
    8. Οι εύκαμπτες διεργασίες συμβάλλουν σε μια αειφόρο διεργασία ανάπτυξης. Οι χρηματοδότες, το προσωπικό ανάπτυξης και οι χρήστες θα πρέπει να μπορούν να συνεχίζουν για πάντα με τον ίδιο σταθερό ρυθμό.
    9. Συνεχής προσοχή στην τεχνολογική αρτιότητα και το σωστό σχεδιασμό βελτιώνει την ευελιξία.
    10. Η απλότητα--η τέχνη της μεγιστοποίησης του ποσού της εργασίας που δεν πραγματοποιείται-- είναι απαραίτητη.
    11. Οι καλύτερες αρχιτεκτονικές, απαιτήσεις, και τα καλύτερα σχέδια πηγάζουν από αυτο-οργανωνόμενες ομάδες.
    12. Σε τακτά διαστήματα η ομάδα αναλογίζεται πως μπορεί να γίνει πιο αποδοτική. Έτσι συντονίζει και προσαρμόζει ανάλογα τη συμπεριφορά της.

    Ακραίος προγραμματισμός

    Ο ασυμβίβαστος προγραμματισμός (ΑΠ) (eXtreme programing (XP)) εδραιώθηκε ως μεθοδολογία ανάπτυξης για μικρές ομάδες ανάπτυξης έργων στα οποία αλλάζουν συχνά οι προδιαγραφές. Βασικά του χαρακτηριστικά είναι: Η μεθοδολογία δεν είναι κατάλληλη για:

    Αξίες του ΑΠ

    Αρχές του ΑΠ

    Ενέργειες του ΑΠ

    Πρακτικές του ΑΠ

    Πλάνο της κάθε έκδοσης
    Τα στοιχεία που μπορούν να μεταβληθούν είναι: ο χρόνος, το κόστος, η ποιότητα και το εύρος του έργου. Τα επιχειρηματικά στελέχη αποφασίζουν σχετικά με
    • το εύρος,
    • τις προτεραιότητες,
    • τι θα περιέχει η έκδοση,
    • ημερομηνίες των εκδόσεων.
    Τα στελέχη ανάπτυξης έχουν τον τελικό λόγο για:
    • το χρόνο που απαιτεί κάθε στοιχείο,
    • τα αποτελέσματα των επιχειρηματικών αποφάσεων,
    • τη διεργασία ανάπτυξης
    • το λεπτομερή χρονικό προγραμματισμό
    Μικρές εκδόσεις
    Κάθε έκδοση του λογισμικού πρέπει να είναι η μικρότερη δυνατή έτσι ώστε να είναι μικρός ο αντίστοιχος χρονικός κύκλος.
    Μεταφορά (metaphor)
    Χρήση μιας μεταφοράς που εκφράζει την αρχιτεκτονική του συστήματος.
    Απλό σχέδιο
    Το σχέδιο πρέπει να είναι το απλούστερο δυνατό με την προϋπόθεση να:
    • Τρέχει όλους τους ελέγχους
    • Να μην περιέχει διπλά στοιχεία
    • Να εκφράζει κάθε σκοπό που έχει σημασία για τους προγραμματιστές
    • Να έχει τις λιγότερες δυνατές κλάσεις και μεθόδους
    Έλεγχος
    Για κάθε λειτουργία του προγράμματος πρέπει να υπάρχει ο αντίστοιχος έλεγχος. Οι έλεγχοι γράφονται σε συνεργασία με τον πελάτη.
    Αναπαραγοντοθέτηση (refactoring)
    Σχέδια και αντίστοιχες υλοποιήσεις που μπορούν να βελτιωθούν, χωρίς να αλλάξουν οι λειτουργικές προδιαγραφές, ξαναγράφονται.
    Προγραμματισμός σε ζευγάρια
    Ένα ζευγάρι μοιράζεται τον υπολογιστή. Όταν το ένα μέλος πληκτρολογεί, το άλλο ελέγχει:
    • Θα δουλέψει το σύνολο της προσέγγισης;
    • Υπάρχουν έλεγχοι που δεν έχουν υλοποιηθεί;
    • Μήπως μπορεί το σύστημα να απλοποιηθεί;
    Τα ζευγάρια αλλάζουν δυναμικά.
    Συλλογική ιδιοκτησία (collective ownership)
    Ο κώδικας ανήκει σε όλα τα μέλη της ομάδας. Κάθε ένας έχει δικαίωμα να βελτιώσει οποιοδήποτε τμήμα του και όλοι είναι υπεύθυνοι για την ποιότητα του συνόλου του κώδικα.
    Συνεχής ολοκλήρωση
    Τα τμήματα του κώδικα ενώνονται τακτικά μεταξύ τους.
    Εβδομάδα 40 ωρών
    Οι υπερωρίες είναι δείγμα προβλημάτων στο έργο.
    Πελάτης στο χώρο της εργασίας
    Εκπρόσωπος του πελάτη βρίσκεται στο χώρο της ανάπτυξης. Βοηθά στο σχεδιασμό, τους ελέγχους και τις προδιαγραφές.
    Πρότυπα κώδικα
    Με βάση τα πρότυπα ο κώδικας μπορεί να είναι ιδιοκτησία όλης της ομάδας.

    Σημείωση

    Γιατί η λέξη refactoring αποδίδεται ως αναπαραγοντοθέτηση και όχι ... ; Βλέπε την ανάλυση του κ. Κώστα Βαλεοντή, προέδρου της ΕΛΕΤΟ (http://www.eleto.gr/) και μια σχετική συζήτηση που προηγήθηκε και ακολούθησε.

    Ανάπτυξη λογισμικού στη Microsoft

    Η ανάπτυξη λογισμικού στη Microsoft γίνεται με βάση τις παρακάτω αρχές (Cusumano & Selby 1995):

    Βιβλιογραφία

    Ασκήσεις

    1. Θα μπορούσατε να υιοθετήσετε ΑΠ για την υλοποίηση της άσκηση του μαθήματος; Ποιες πρακτικές του ΑΠ δε θα μπορούσαν να εφαρμοστούν;
    2. Εντοπίστε και σχολιάστε διαφορές ανάμεσα στον τρόπο που υλοποιείται λογισμικό στη Microsoft και το μοντέλο διεργασίας ανάπτυξης του καταρράκτη.

    Ανάπτυξη εφαρμογών Internet

    Η δομή του Internet

    Εφαρμογή

    Το επίπεδο εφαρμογής στο Internet καλύπτει τα επίπεδα εφαρμογής και παρουσίασης του OSI. Τα πιο συχνά πρωτόκολλα που χρησιμοποιούνται από τους χρήστες είναι:
    HTTP/HTML
    πρόσβαση στο Web
    FTP
    μεταφορά αρχείων
    SMTP
    μεταφορά email
    POP/IMAP
    ανάγνωση email
    Telnet
    χρήση από απόσταση

    Μια σειρά από πρωτόκολλα στο επίπεδο αυτό υποστηρίζουν τη λειτουργία και τη διαχείριση του δικτύου:

    DNS
    Κατανεμημένος κατάλογος ονομάτων
    SNMP
    Διαχείριση από απόσταση
    BOOTP
    Αρχικό φόρτωμα κώδικα
    RARP
    Αντίστροφη μετατροπή διευθύνσεων

    Μεταφορά

    Στο επίπεδο της μεταφοράς χρησιμοποιούνται δύο πρωτόκολλα:
    TCP
    Transmission Control Protocol
    UDP
    User Datagram Protoco

    Δίκτυο

    Στο επίπεδο του δικτύου το Internet Protocol (IP) μαζί με το Internet Control Message Protocol εξασφαλίζουν τη μεταφορά δεδομένων από τον αποστολέα στον παραλήπτη. Το παρακάτω σχήμα παριστάνει τη σχέση ανάμεσα στα διάφορα πρωτόκολλα του internet:

    Αρχιτεκτονική του παγκόσμιου ιστού

    Προσδιορισμός στοιχείων με URI

    Ο προσδιορισμός στοιχείων στο πρωτόκολλο HTTP γίνεται με τη χρήση των Uniform Resource Identifiers. Η χρήση τους επιτρέπει τον προσδιορισμό άλλων σελίδων τοπικά, σε άλλα μηχανήματα, καθώς και ερωτήσεων:
    http://www.dmst.aueb.gr/dds
    http://www.altavista.com/cgi-bin/query?pg=q&text=yes&q=link%3akerkis%2emath%2eaegean%2egr%2f%7edspin+%2dhost%3akerkis%2emath%2eaegean%2egr&stq=10&c9k
    

    Το πρωτόκολλο HTTP

    Το πρωτόκολλο HTTP υποστηρίζει τις παρακάτω μεθόδους επικοινωνίας: Παράδειγμα:
    GET /pub/WWW/TheProject.html HTTP/1.1
    Host: www.w3.org
    

    Περιγραφή σελίδων με HTML

    H HTML είναι μια εφαρμογή της SGML για την περιγραφή σελίδων στο Web. Περιοχές του κειμένου σημειώνονται με ετικέτες (tags). Κάθε ετικέτα περιλαμβάνει το όνομά της και παραμέτρους. Οι ετικέτες γράφονται ως εξής:
    <όνομα ετικέτας παράμετροι>
    
    Μια περιοχή του κειμένου μπορεί να σημειωθεί ως εξής:
    <ετικέτα>
    περιοχή που σημειώνεται
    </ετικέτα>
    
    Βασικές ετικέτες που υποστηρίζει η HTML είναι οι παρακάτω:
    HTML
    περιγραφή ολόκληρης σελίδας
    HEAD
    επικεφαλίδα της σελίδας
    BODY
    κείμενο της σελίδας
    H1-H6
    επικεφαλίδες του κειμένου
    P
    αλλαγή παραγράφου
    UL
    λίστα με τελείες
    OL
    αριθμημένη λίστας
    LI
    στοιχείο λίστας
    BR
    αλλαγή γραμμής
    HR
    οριζόντια γραμμή
    IMG
    εικόνα
    A
    (anchor) σημείο πρόσβασης από ή σε υπερκείμενο
    PRE
    προστοιχειοθετημένο κείμενο
    DL, DT, DD
    λίστα περιγραφών, περιγραφές
    I
    πλάγιοι χαρακτήρες
    B
    έντονοι χαρακτήρες
    Παράδειγμα σελίδας:
    <!doctype html public "-//IETF//DTD HTML//EN">
    <HTML>
    <HEAD>
    <TITLE>Τίτλος της σελίδας</title>
    
    <META NAME="GENERATOR" CONTENT="thread.pl">
    <META NAME="AUTHOR" CONTENT="Diomidis Spinellis">
    <META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=ISO-8859-7">
    <LINK REV="made" HREF="mailto:dds@aueb.gr"> 
    <LINK REL="ToC" href="./web/index.htm">
    <LINK REV="Subdocument" href="./web/index.htm">
    <LINK REL="previous" href="./web/http.htm">
    <LINK REL="next" href="./web/cgi.htm">
    
    </HEAD>
    
    <BODY>
    <H1>Επικεφαλίδα πρώτου επιπέδου</H1><HR>
    Κείμενο που περιέχει ένα σημείο κατάληξης υπερκειμένου
    <a name="G42"> (<em>με έντονο κείμενο</em>)</a> 
    και μια λίστα:
    <ul>
    <li> στοιχείο 1
    <li> στοιχείο 2
    </ul>
    
    <p>
    Νέα παράγραφος με ένωση υπερκειμένου στο
    <A HREF="http://www.aueb.gr">Οικονομικό Πανεπιστήμιο</A>
    
    <HR>
    </BODY>
    </HTML>
    
    Αυτή θα εμφανιστεί ως εξής:

    Επικεφαλίδα πρώτου επιπέδου


    Κείμενο που περιέχει ένα σημείο κατάληξης υπερκειμένου (με έντονο κείμενο) και μια λίστα:

    Νέα παράγραφος με ένωση υπερκειμένου στο Οικονομικό Πανεπιστήμιο (http://www.aueb.gr)


    Χαρακτηριστικά της Java

    Κατηγορίες ενεργού περιεχομένου

    Ενεργό περιεχόμενο στον πελάτη

    Επικοινωνία πελάτη εξυπηρετητή

    Τρόποι υλοποίησης ενεργού περιεχομένου στον εξυπηρετητή

    Τεχνολογίες υλοποίησης ενεργού περιεχομένου στον εξυπηρετητή

    CGI

    Υλοποίηση

    Προβλήματα

    Fast CGI

    Υλοποίηση στον εξυπηρετητή

    Προβλήματα

    Παράδειγμα

    #!/usr/bin/perl

    #load the necessary modules
    use Pg;
    use CGI qw/:standard/;
    use CGI::Fast;

    #connect to the database
    $conn = Pg::connectdb("dbname=comments host=193.250.160.3\
                                 user=george password=george");
    die $conn->errorMessage unless PGRES_CONNECTION_OK eq $conn->status;

    #Create a new FastCGI object
    #This is the main program loop
    while(new CGI::Fast){
       $name=param("name");
       $email=param("email");
       $comments=param("comments");

       #insert the record to the database
       $query="insert into comments values('".$name."','".$email.\
                                                    "','".$comments."')";
       $result=$conn->exec($query);
       die $conn->errorMessage unless PGRES_COMMAND_OK eq $result->resultStatus;
       print "All done OK";
    }
    #close the connection
    $conn->requestCancel

    Servlets

    Υλοποίηση

    Πλεονεκτήματα

    Υποστήριξη

    Παράδειγμα

    import java.io.*;
    import java.lang.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.sql.*;
     
     
    public class comments extends HttpServlet {
     
        Connection con=null;
        //This is executed only once during servlet loading
        public void init(ServletConfig config) throws ServletException{
            super.init(config);
            try {
                Class.forName("org.postgresql.Driver");
                con=DriverManager.getConnection("jdbc:postgresql:comments",
                                                        "george","george");
            }
            catch (ClassNotFoundException e) {
                System.out.println("No such class:"+e.getMessage());
            }
            catch (SQLException s) {
                System.out.println("Connection error"+s.getMessage());
            }
        }
        //The function that handles POST requests
        public void doPost (HttpServletRequest req, HttpServletResponse res)
        throws ServletException,IOException{
            //Get input parameters
            String name=req.getParameter("name");
            String email=req.getParameter("email");
            String comments=req.getParameter("comments");
            PrintWriter out=res.getWriter();
            res.setContentType("text/html");
            //Insert the record into the database
            try {
                Statement stmt=con.createStatement();
                stmt.execute("INSERT INTO comments values('"+name+"','"+email+
                                                        "','"+comments+"')");
                out.println("All done ok");
            }
            catch (SQLException s) {
                out.println("Connection error"+s.getMessage());
            }
     
            finally {
                out.println("</BODY></HTML>");
            }
     
        }
        //GET and POST requests are handled in the same way
        public void doGet (HttpServletRequest req, HttpServletResponse res)
        throws ServletException,IOException{
            doPost (req,res);
        }
        //Only called when the servlet is unloaded
        public void destroy() {
            try {
                con.close();
            }
            catch (SQLException s) {
                System.out.println("Connection error"+s.getMessage());
            }
     
        }

    PHP

    Παρόμοια αυστήματα

    Χαρακτηριστικά PHP

    Παράδειγμα

    <?php
    $db = pg_pconnect ("host=localhost dbname=comments user=george password=george");
    $update="insert into comments(name,email,comment) values ('$name','$email','$comments')";
    echo $name,$email,$comments;
    pg_exec ($db,$update);
    ?>

    API εξυπηρετητή

    Υλοποιήσεις

    Μεταφορά δεδομένων

    Μεταφορά δεδομένων από τον πελάτη στον εξυπηρετητή μέσω HTTP μπορεί να γίνει με τους παρακάτω τρόπους:

    Υλοποίηση συνεδρίας

    Παραδείγματα URL:
    http://www.driveme.gr/Athens/AthensMap.ASP?wcu=$cmd=2$id=4_2000_11_09_08_00_20_296
    http://www.perseus.tufts.edu/cgi-bin/perscoll?collection=Perseus:collection:Greco-Roman
    http://terraserver.microsoft.com/GetPageByXY.asp?XId=9782&YId=12293&SrcId=2&ImgDate=05/17/1992&ImgSize=2&DSize=0
    
    Παραδείγματα cookies:
    bbs.cordis.lu	FALSE	/	FALSE	2137621534	CFID	47215
    bbs.cordis.lu	FALSE	/	FALSE	2137621534	CFTOKEN	18919068
    .harvard.edu	TRUE	/	FALSE	2051222305	SITESERVER	ID=7f29e95efe695b0ab41c161acdfb0163
    search.support.microsoft.com	FALSE	/	FALSE	1019403742	AnswerWiz	1=serial+mouse+detection&Count=1
    search.support.microsoft.com	FALSE	/	FALSE	1019403742	Params	S=F&VR=http%3A%2F%2Fsupport%2Emicrosoft%2Ecom%2Fsupport%3Bhttp%3A%2F%2Fsupport%2Emicrosoft%2Ecom%2Fservicedesks%2Fwebcasts%3Bhttp%3A%2F%2Fsupport%2Emicrosoft%2Ecom%2Fhighlights&KT=ALL&FR=0&HSL=0&LN=EN%2DUS&FSL=0&TSL=0&A=T&SD=GN&SPR=W95&PSL=0&LQ=serial+mouse+detection&T=B&T1=7d&DU=C
    search.support.microsoft.com	FALSE	/	FALSE	1019403742	Global	LN=EN%2DUS
    

    Απλοί κανόνες

    Βιβλιογραφία

    Διαχείριση υπολογιστικών συστημάτων

    Σταθμοί εργασίας

    Κύριες εργασίες:

    Εξυπηρετητές

    Σημαντικά στοιχεία:


    Εξυπηρετητές σε ικρίωμα (rack)

    Υπηρεσίες

    Βασικές αρχές και προσεγγίσεις:

    Τεχνικές αποσφαλμάτωσης

    Βασική στρατηγική: Δύο τεχνικές: Παραδείγματα εργαλείων:

    Η αρχή της μοναδικής διόρθωσης

    Χώροι ονοματοδοσίας

    Χώροι ονομάτων: Πολιτικές ονοματοδοσίας: Διαδικασίες διαχείρισης:

    Καταστροφές: σχεδιασμός και αποκατάσταση

    Τύποι καταστροφών Προϋπολογισμός = κόστος καταστροφής * πιθανότητα καταστροφής

    Ενέργειες:

    Διαχείριση αλλαγών

    Αναβαθμίσεις

    Διαδικασία αναβάθμισης υπηρέτη:
    1. Κατάσταση προσφερομένων υπηρεσιών
      1. Ποιες υπηρεσίες προσφέρει ο υπηρέτης
      2. Ποιοι τις χρησιμοποιούν
      3. Ποιο λογισμικό τις προσφέρει
    2. Επιβεβαίωση πως κάθε λογισμικό θα δουλεύει στη νέα έκδοση
    3. Προγραμματισμός διαδικασίας ελέγχου για κάθε υπηρεσία
    4. Προγραμματισμός εφεδρείας
    5. Επιλογή του κατάλληλου χρόνου συντήρησης
    6. Ανακοίνωση
    7. Εκτέλεση των ελέγχων στην παλιά υπηρεσία
    8. Αναβάθμιση (μαζί με βοηθό)
    9. Επανάληψη των ελέγχων
    10. Αν αποτύχει, υποχώρηση σύμφωνα με την εφεδρεία
    11. Επικοινωνία με τους πελάτες


    Αναβάθμιση στην υπηρεσία TAXISnet.

    Συγκέντρωση και αποκέντρωση

    Για τις αποφάσεις σχετικά με συγκέντρωση και αποκέντρωση χρησιμοποιούμε τα παρακάτω στοιχεία: Υποψήφιοι για κεντρική διαχείριση:

    Η υπηρεσία βοηθείας

    Η υπηρεσία βοηθείας σχεδιάζεται με βάση τα παρακάτω στοιχεία: Βασικό στοιχείο για την εύρυθμη λειτουργία της είναι ένα πληροφοριακό σύστημα για την καταγραφή και διαχείριση των αιτήσεων. Κάθε αίτηση αποκτά ένα αναγνωριστικό στοιχείο (ticket) με το οποίο τα στελέχη της υπηρεσίας και ο τελικός πελάτης ενημερώνονται για την πρόοδο.

    Υποστήριξη πελατών

    Βήματα
    1. Χαιρετισμός
    2. Μαθαίνουμε το πρόβλημα
    3. Επαναλαμβάνουμε το πρόβλημα και συμφωνούμε με τον πελάτη
    4. Δοκιμάζουμε το πρόβλημα
    5. Μαζεύουμε προτάσεις για την αντιμετώπιση
    6. Επιλέγουμε τη λύση
    7. Εκτελούμε τη λύση
    8. Ελέγχουμε τη λύση
    9. Συμφωνούμε με τον πελάτη πως το πρόβλημα έχει λυθεί

    Οργάνωση του κέντρου πληροφορικής


    Εσωτερικό αίθουσας υπολογιστών


    Το κέντρο υπολογιστών στο εργαστήριο πολυμέσων του ΟΤΕ

    Δίκτυα

    Η τοπολογία του δικτύου μπορεί να καθοριστεί:


    Σημαντικό τμήμα της δικτύωσης είναι το ενδιάμεσο πλαίσιο τερματισμού (intermediate distribution frame (IDF)) Σε αυτό καταλήγουν οι δικτυακές συνδέσεις ενός ορόφου και με τη χρήση καλωδίων μπορούν να συνδεθούν οι υπολογιστές με το δίκτυο. Κάθε πλαίσιο πρέπει να είναι αριθμημένο με το κτίριο, όροφο και αριθμό του πλαισίου. Κάθε σύνδεση έχει έναν ξεχωριστό αριθμό με βάση τη θέση της και πιθανώς και τον αντίστοιχο υποδοχέα. Έτσι π.χ. η σύνδεση 1/4/2/12Α μπορεί να είναι η σύνδεση στο κτίριο 1, όροφο 4, πλαίσιο 2, γραφείο 12, υποδοχέας Α.


    Σε μεγάλες εγκαταστάσεις το ενδιάμεσο πλαίσιο τερματισμού τερματίζεται σε ένα κύριο πλαίσιο τερματισμού (main distribution frame (MDF)) το οποίο συνήθως είναι στο κέντρο υπολογιστών.

    Βασικές αρχές:


    Πλαίσιο τερματισμού - διακρίνονται τα συστήματα αδιάλειπτης τροφοδοσίας στο κάτω μέρος.

    Υπηρεσίες email

    Λειτουργικά στοιχεία: Βασικά στοιχεία για τη σωστή της υπηρεσίας email:

    Αντίγραφα εφεδρείας και ανάκτηση

    Αντίγραφα εφεδρείας χρειάζονται όταν: Για βελτιστοποίηση της διαδικασίας, διαχωρίζουμε τα παρακάτω αντίγραφα εφεδρείας Κάθε επίπεδο περιέχει τις αλλαγές από το προηγούμενο μικρότερο επίπεδο.

    Πρόσθετα στοιχεία:

    Βιβλιογραφία

    Ασκήσεις

    1. Παραθέστε τις υπηρεσίες που προσφέρει το κέντρο υπολογιστών του Πανεπιστημίου.
    2. Δώστε ένα παράδειγμα όπου διορθώνεται το σύμπτωμα αντί για την αιτία.
    3. Περιγράψτε την πολιτική ονοματοδοσίας και τις διαδικασίες διαχείρισης για τα ονόματα κάτω από το .gr domain.

    Θέματα εξετάσεων

    Εξεταστική περιόδος Ιουνίου 2002

    Τα θέματα σε μορφή PDF.

    Εξεταστική περιόδος Σεπτεμβρίου 2002

    Τα θέματα σε μορφή PDF.

    Εξεταστική περιόδος Ιουνίου 2003

    Τα θέματα σε μορφή PDF.

    Σχετικές απαντήσεις

    Θέμα 1ο
    βλ. καθορισμός μη λειτουργικών απαιτήσεων
    Θέμα 2ο
    μια μέθοδος επιτρέπεται μόνο να καλεί μεθόδους:
    1. της δικής της κλάσης
    2. αντικειμένων που έλαβε ως παραμέτρους
    3. αντικειμένων που δημιούργησε
    4. αντικειμένων που περιέχει
    Στον κώδικα του θέματος:
    • κλήση 1: περίπτωση 1
    • κλήση 2: περίπτωση 2
    • κλήση 3: -
    • κλήση 4: περίπτωση 3
    • κλήση 5: -
    • κλήση 6: περίπτωση 4 ή/και 3
    Θέμα 3ο
    βλ. Επαναχρησιμοποίηση: τρόποι και πλεονεκτήματα
    Θέμα 4ο
    βλ. oλοκληρωμένα περιβάλλοντα ανάπτυξης

    Εξεταστική περιόδος Νοεμβρίου 2003

    Τα θέματα σε μορφή PDF.

    Σχετικές απαντήσεις

    Θέμα 1ο
    βλ. στρατηγικές δυναμικού ελέγχου

    Θέμα 2ο
    Υπάρχουν πάρα πολλοί τρόποι να παρασταθούν οι σχέσεις σε UML. Μια ενδεικτική παράσταση είναι η παρακάτω:

    Θέμα 3ο
    βλ. τρόποι βελτιστοποίησης και τεχνικές ΣΒΔ.

    Θέμα 4ο