Διάλεξη 16: Σχεδίαση Λογισμικού



Σχετικά έγγραφα
Διάλεξη 16: Εργαλεία Ι

Διάλεξη 17: Έλεγχος Λογισμικού

ΑΦAΙΡΕΤΙΚΟΣ (ή ΑΦΗΡΗΜΕΝΟΣ) ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT) - σύνολο δεδομένων (data, objects) - σύνολο πράξεων στα δεδομένα

ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT)

Διάλεξη 12: Οργάνωση Προγραμμάτων σε Πολλαπλά Αρχεία ΙΙ

Διάλεξη 17: Έλεγχος Λογισµικού

Η γλώσσα προγραμματισμού C

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

Ενότητες στην C Τεχνική Υλοποίησης Αφαιρετικών Τύπων Δεδομένων στην C

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Προγραμματισμός Ι. Πολλαπλά Αρχεία. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διάλεξη 11: Οργάνωση Προγραμμάτων σε Πολλαπλά Αρχεία

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

Κεφάλαιο 2.3: Προγραμματισμός. Επιστήμη ΗΥ Κεφ. 2.3 Καραμαούνας Πολύκαρπος

ύο βασικές ιδέες Ενότητες Απόκρυψη Πληροφορίας, Αφηρηµένοι Τύποι εδοµένων 1) ιαχώρισε το πρόβληµα σεµικρότερα καλώς καθορισµένα υπο-προβλήµατα

ΚΕΦΑΛΑΙΟ 6. Περιβάλλοντα Ανάπτυξης Εφαρμογών. ΚΕΦΑΛΑΙΟ 6 Περιβάλλοντα Ανάπτυξης Εφαρμογών. Α Γενικού Λυκείου

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

Προγραμματισμός ΙΙ Εαρινό εξάμηνο Εργασία 3 Βιβλιοθήκη για λειτουργίες σε γράφους

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

Κεφάλαιο 6 ο Εισαγωγή στον Προγραμματισμό 1

Αρχές Προγραμματισμού Υπολογιστών

Προγραμματισμός Υπολογιστών με C++

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Εισαγωγή. Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής

Εισαγωγή ΕΙΣΑΓΩΓΗ. Γεώργιος Παπαϊωάννου ( )

Άσκηση 1 (ανακοινώθηκε στις 20 Μαρτίου 2017, προθεσμία παράδοσης: 24 Απριλίου 2017, 12 τα μεσάνυχτα).

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Βασικές Αρχές Προγραμματισμού

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Η γλώσσα προγραμματισμού C

Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 1: Εισαγωγικές Έννοιες

CE121 Προγραµµατισµός 2. Εισαγωγή σε Makefiles. CE121 -

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

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ

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

(programming interfaceή/και application programming interface API).

make Προγραμματισμός II 1

Κεφάλαιο : Εισαγωγή στην C: (Διαλέξεις 3-4)

Επιλογές και Κριτήρια Σχεδιασμού ΑΤΔ Ανεξαρτήτως από Γλώσσα Υλοποίησης 24/4/2012

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

08 Η γλώσσα UML I. Τεχνολογία Λογισμικού. Σχολή Hλεκτρολόγων Mηχανικών & Mηχανικών Yπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο. Χειμερινό εξάμηνο

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Οργάνωση Προγραμμάτων σε Πολλαπλά Αρχεία (Κεφάλαιο , KNK-2ED)

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

ΕΠΛ 003: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ

Προγραμματισμός Η/Υ. Ενότητα 3: Top Down Σχεδιασμός

Εργαστήριο Λειτουργικών Συστημάτων. Minix Overview

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

Περιεχόμενα. Πρόλογος... 17

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα.

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

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Προγραμματισμός Η/Υ. Προτεινόμενα θέματα εξετάσεων Εργαστήριο. Μέρος 1 ό. ΤΕΙ Λάρισας- Σχολή Τεχνολογικών Εφαρμογών Τμήμα Πολιτικών Έργων Υποδομής

Συμβολική γλώσσα Εκπαιδευτικού Υπολογιστή - Λογισμικό Υπολογιστών

Πληροφορική 2. Γλώσσες Προγραμματισμού

<<ΔΗΜΗΤΡΗΣ ΜΑΝΩΛΗΣ ΦΥΣΙΚΟΣ ΜCs>> 1

Εισαγωγή στην επιστήμη των υπολογιστών

Προγραμματισμός Ι. Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Μεθόδων Επίλυσης Προβλημάτων

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

Κεφάλαιο 6 Εισαγωγή στον Προγραμματισμό. 26-Jun-15 ΑΕΠΠ - Καραμαούνας Π. 1

8. Μέθοδοι (Methods)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ231: ομές εδομένων και Αλγόριθμοι

Επανάληψη για τις Τελικές εξετάσεις

Μαλούτα Θεανώ Σελίδα 1

FORTRAN & Αντικειμενοστραφής Προγραμματισμός ΣΝΜΜ 2016

Εισαγωγή στον Προγραμματισμό

Ηλεκτρονικοί Υπολογιστές

Εισαγωγή στο προγραμματιστικό περιβάλλον ANSI

Δομές Δεδομένων. Λουκάς Γεωργιάδης.

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

Περιεχόμενα. Πρόλογος... 21

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

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

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

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

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

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον κεφ.6 Εισαγωγή στον Προγραμματισμό

Προγραμματισμό για ΗΜΥ

Εισαγωγή στην Python. Διάλεξη 0

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Βασίλειος Κοντογιάννης ΠΕ19

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

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

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL)

CE121 Προγραµµατισµός 2. Εισαγωγή σε Makefiles. CE121 -

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Ευάγγελος Γ. Ούτσιος Θεόδωρος Γ. Λάντζος Διάλεξη Νο2-Νο3

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡ/ΣΜΟΣ C++

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διάλεξη 6: Δείκτες και Πίνακες

Προεπεξεργαστής C. Προγραμματισμός Ι 1

Transcript:

Τμήμα Πληροφορικής Πανεπιστήμιο Κύπρου ΕΠΛ132 Αρχές Προγραμματισμού II Διάλεξη 16: Σχεδίαση Λογισμικού (μέρος: Κεφάλαια 19.1-19.2, KNK-2ED) Δημήτρης Ζεϊναλιπούρ http://www.cs.ucy.ac.cy/courses/epl132 16-1

Περιεχόμενο Διάλεξης 17 Μεγάλης Κλίμακας Λογισμικό (Large-scale SW) Μέγεθος Λογισμικού και Προβλήματα Κύκλος Ανάπτυξης Λογισμικού Σχεδίαση Λογισμικού (Software Design) Χωρίς Εργαλεία Σχεδίασης Με Εργαλεία Αναπαράστασης Δομής Με Εργαλεία Model-Driven-Development (MDD) Μονάδες Προγράμματος (Modules) Εισαγωγή, Χαρακτηριστικά, Πλεονεκτήματα Συνοχή (Cohesion) και Διασύνδεση (Coupling) Παραδείγματα Μονάδων : glib-c, gzip, coreutils Τύποι Μονάδων, Μονάδες και Βιβλιοθήκες 16-2

Μεγάλης Κλίμακας Λογισμικό (Μέγεθος) Τα περισσότερα πλήρη προγράμματα (fullfeatured programs), είναι χιλιάδες Γραμμές Πηγαίου Κώδικα (Source Lines of Code - SLOC). Παραδείγματα gz124src.zip: To gzip εργαλείο σε UNIX (42 αρχεία με 6,972 SLOC!) http://www.gzip.org/ perl-5.14.2.tar.gz: Ο μεταφραστής και οι βασικές βιβλιοθήκες της γλώσσας PERL (3241 αρχεία και 667,323 SLOC!!) http://www.perl.org/get.html glibc-2.14.tar.gz: ο κώδικας όλων των βιβλιοθηκών της γλώσσας C (8552 αρχεία και 1,775,440 SLOC!!!) http://ftp.gnu.org/gnu/glibc/ 16-3

Μεγάλης Κλίμακας Λογισμικό (Μέγεθος) Παράδειγμα Εύρεσης SLOC με το εργαλείο CLOC (Count Lines of Code: http://cloc.sourceforge.net/) Windows:http://sourceforge.net/projects/cloc/files/cloc/v1.55/cloc-1.55.exe Linux (με Perl): http://sourceforge.net/projects/cloc/files/cloc/v1.55/cloc-1.55.pl $./cloc-1.55.pl gzip124/ 89 text files. 82 unique files. 47 files ignored. Απλά τοποθετήστε το.pl ή.exe στον κατάλογο που θέλετε και μετά "./cloc-1.55.pl <directory> " ή απλά "./cloc-1.55.pl gzip.tar.gz" http://cloc.sourceforge.net v 1.55 T=0.5 s (84.0 files/s, 21174.0 lines/s) ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- C 22 1010 1910 5129 C/C++ Header 12 161 186 680 Bourne Shell 2 85 99 670 Assembly 2 69 92 458 DOS Batch 1 0 0 18 Perl 1 1 2 12 Teamcenter def 2 0 0 5 ------------------------------------------------------------------------------- SUM: 42 1326 2289 6972 ------------------------------------------------------------------------------- 16-4

Μεγάλης Κλίμακας Λογισμικό (Μέγεθος) Παραδείγματα SLOC γνωστών Λειτουργικών Συστημάτων. Σύνολο πολλών πλήρων υπο-προγραμμάτων Πηγή: http://en.wikipedia.org/wiki/source_lines_of_code 16-5

Μεγάλης Κλίμακας Λογισμικό (Προβλήματα) Τα προβλήματα τα οποία προκύπτουν όταν έχουμε να κάνουμε με μεγάλο κώδικα λογισμικού είναι: Στυλ / Ομοιομορφία Κώδικα (Style) Διάλεξη 4 και Google Style Guidelines στο εργαστήριο. Τεκμηρίωση (Documentation) Doxygen, Διάλεξη 4, εργασίες 1 5 και εργαστήριο. Σχεδίαση (Design) - Διάλεξη 11-12 (πολλαπλά αρχεία), Εργασίες 3-5 και σημερινή διάλεξη! Συντήρηση (Maintenance) Οδηγοί Δοκιμής (drivers) στις εργασίες 3-5 οι οποίες επιτρέπουν το λεγόμενο regression testing. 16-6

Μεγάλης Κλίμακας Λογισμικό (Κύκλος Ανάπτυξης) Ο Κύκλος Ανάπτυξης ενός λογισμικού & Παραλληλισμός Εκτός ΕΠΛ132 Ανάλυση / Analysis Π.χ., Εκφώνηση Εργασίας με αυτά που μάθαμε στο EΠΛ132. Διάλεξη 16 Σχεδιασμός / Design Δημιουργία Δομής Προγράμματος Code Design (μέσω δημιουργίας αρχείων κεφαλίδας) Όλο το ΕΠΛ132 Υλοποίηση / Implementation Υλοποίηση Συναρτήσεων (ατομικά ή ομαδικά) Διάλεξη 17 Έλεγχος & Δοκιμή / Testing Βασικό Αντικείμενο Μελέτης του μαθήματος Τεχνολογίας Λογισμικού Εκτός ΕΠΛ132 Λειτουργία / Συντήρηση Υλοποίηση Model-Driven- Οδηγών Δοκιμής Design (μέσω (ανά module / εργαλείου τύπου συνολικά) Rhapsody που θα δούμε σήμερα) Υπεύθυνος Εργαστηρίου (εκτός Συντήρησης) 16-7

Περιεχόμενο Διάλεξης 17 Μεγάλης Κλίμακας Λογισμικό (Large-scale SW) Μέγεθος Λογισμικού και Προβλήματα Κύκλος Ανάπτυξης Λογισμικού Σχεδίαση Λογισμικού (Software Design) Χωρίς Εργαλεία Σχεδίασης Με Εργαλεία Αναπαράστασης Δομής Με Εργαλεία Model-Driven-Development (MDA) Μονάδες Προγράμματος (Modules) Εισαγωγή, Χαρακτηριστικά, Πλεονεκτήματα Συνοχή (Cohesion) και Διασύνδεση (Coupling) Παραδείγματα Μονάδων : glib-c, gzip, coreutils Τύποι Μονάδων, Μονάδες και Βιβλιοθήκες 16-8

Σχεδίαση Λογισμικού (Χωρίς Εργαλεία Σχεδίασης) Μέχρι τώρα "σχεδιάζαμε" σε επίπεδο αρχείων κεφαλίδας Παράδειγμα Διάλεξης 12 (διάσπαση προγράμματος) stack.h def.h queue.h game.c stack.c queue.c 16-9

Σχεδίαση Λογισμικού #ifndef STACK_H #define STACK_H // A) Libraries #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include "def.h" // B) Declarations typedef struct { NODE *top; int } STACK; (Χωρίς Εργαλεία Σχεδίασης) size; [ stack.h ] // C) Function Prototypes /** * Doxygen Comment */ PUBLIC STACK *initstack(stack *stack); /* Comments*/ PUBLIC int initstack2(stack **stack); /* Comments */ PUBLIC bool IsEmptyStack(STACK *stack); /* Comments */ PUBLIC void topstack(stack *stack); /* Comments */ PUBLIC int pushstack(int value, STACK *stack); /* Comments */ PUBLIC int popstack(stack *stack, int *retval); #endif def.h #define PUBLIC // Ορατή Εκτός Αρχείου #define PRIVATE static // Ορατή Εντός Αρχείου 16-10

Σχεδίαση Λογισμικού (Με Εργαλεία Αναπαράστασης) Εργαλεία όπως το graphviz και doxygen μας βοήθησαν να εντοπίζουμε ενδεχόμενα προβλήματα δομής και να τα διορθώνουμε) Dependency Graph όπως παράγεται από το doxygen (με ενεργοποιημένα τα dot διαγράμματα στο doxygen) 16-11

Σχεδίαση Λογισμικού (Με Εργαλεία Αναπαράστασης) Call Graph όπως παράγεται από το doxygen) Πρόβλημα: Δεν είναι εύχρηστο για τη σχεδίαση μεγάλου, σύνθετου λογισμικού Απαιτείται ένα ολοκληρωμένο περιβάλλον σχεδίασης! 16-12

Σχεδίαση Λογισμικού (Με Εργαλεία Αναπαράστασης) Με χρήση του Eclox plugin (eclipse GUI για doxygen) μπορείτε να κάνετε τις ρυθμίσεις αυτές γραφικά! Install μέσω του eclipse Update: http://download.gna.org/eclox/update 16-13

Σχεδίαση Λογισμικού (Με Εργαλεία MDD) Σχεδίαση Βάσει Μοντέλου (Model-Driven Development - MDD): Μεθοδολογία ανάπτυξης λογισμικού κατά την όποια: Μοντελοποιείται διαγραμματικά το πρόβλημα Παράγεται αυτόματα η δομή της λύσης (μαζί με πολλά άλλα στοιχεία τα όποια δε θα δούμε αναλυτικά εδώ.) Παράδειγμα: ΙΒΜ Rational Rhapsody Designer, Sparx Systems Enterprise Architect, Papyrus (Eclipse) with Acceleo Code Gener. Άλλες Εφαρμογές της μεθοδολογίας MDD: Αντικειμενοστρεφής Γλώσσες: UML Διαγράμματα (Sparx, Visual Paradigm, Altova, απλή σχεδίαση: Visio, ArgoUML (open). Eclipse: UMLet) http://en.wikipedia.org/wiki/list_of_uml_tools Βάσεις Δεδομένων: ER Διαγράμματα ή Διαγράμματα Δομής (τα οποία παράγουν αυτόματα την δομή της βάσης (επόμενες διαφάνειες) 16-14

Σχεδίαση Λογισμικού (Με Εργαλεία MDD) IBM Rational Rhapsody Designer for Sys.Engr (C) Β) Συγγραφή Κώδικα (Συναρτήσεων) Α) Δημιουργία Αντικειμένου (δεδομένα και συναρτήσεις) Γ) Παραγωγή Κώδικα * 30 days free license 16-15

Σχεδίαση Λογισμικού (Με Εργαλεία MDD) ArgoUML (δημιουργία C++, JAVA, C#, PHP) Παραγωγή Δομής Κώδικα σε JAVA Παραγωγή Δομής Κώδικα σε PHP5 16-16

Σχεδίαση Λογισμικού (Με MDD Εργαλεία) Χρήση στο Μάθημα Βάσεων Δεδομένων (ΕΠΛ342) Στιγμιότυπο (Chen) ER Διαγράμματος στο Database Design Studio (DDS) 16-17

Περιεχόμενο Διάλεξης 17 Μεγάλης Κλίμακας Λογισμικό (Large-scale SW) Μέγεθος Λογισμικού και Προβλήματα Κύκλος Ανάπτυξης Λογισμικού Σχεδίαση Λογισμικού (Software Design) Χωρίς Εργαλεία Σχεδίασης Με Εργαλεία Αναπαράστασης Δομής Με Εργαλεία Model-Driven-Development (MDA) Μονάδες Προγράμματος (Modules) Εισαγωγή, Χαρακτηριστικά, Πλεονεκτήματα Συνοχή (Cohesion) και Διασύνδεση (Coupling) Παραδείγματα Μονάδων σε glib-c, gzip, coreutils Τύποι Μονάδων, Μονάδες και Βιβλιοθήκες 16-18

Μονάδες - Modules (Εισαγωγή) Oπως αναφέραμε ήδη, είναι ευκολότερο να βλέπουμε ένα πρόγραμμα ως μια συλλογή από ανεξάρτητες μονάδες (modules). Μονάδα Προγράμματος (Module): Συλλογή από "υπηρεσίες" (συναρτήσεις) οι οποίες είναι διαθέσιμες σε άλλα μέρη του προγράμματος, τα οποία ονομάζονται χρήστες (clients). Ορολογία C: Module ή Object με.o extension (κώδικας μηχανής που προκύπτει από την μεταγλώττιση) Ορολογία JAVA: Class ή Object με.class extension (ενδιάμεσος κώδικας που προκύπτει από την μεταγλώττιση απαιτεί JRE για εκτέλεση μπορεί να γίνει decompile, π.χ., ψάξε jad στο google.) Module tree.o PROGRAM Module stack.o Client (Object File) main.o Module queue.o 16-19

Μονάδες - Modules (Χαρακτηριστικά) Κάθε module έχει μια διεπαφή (interface), η οποία περιγράφει τις διαθέσιμες "υπηρεσίες" του module. Η διεπαφή αυτή την ονομάστηκε αρχείο κεφαλίδας. Κάθε module έχει την υλοποίηση (implementation). H υλοποίηση αυτή ονομάστηκε πηγαίος κώδικας. Κάθε Module αναπτύσσεται ξεχωριστά από τα υπόλοιπα modules. Κάθε Module μπορεί να αναπτύσσεται από διαφορετικούς προγραμματιστές (ή ζεύγη προγραμματιστών extreme programming) Κάθε Module δοκιμάζεται και συντηρείται ξεχωριστά από τα άλλα module (με τους οδηγούς δοκιμής που διερευνούν όλα τα μονοπάτια εκτέλεσης ενός προγράμματος) 16-20

Μονάδες - Modules (Πλεονεκτήματα) Πλεονεκτήματα διάσπασης ενός προγράμματος σε μονάδες: Αφαιρετικότητα (Abstraction) Γνωρίζουμε τι κάνει χωρίς να ξέρουμε πως. Επαναχρησιμοποίηση Κώδικα (Reusability) Κάθε μονάδα (π.χ., στοίβα) που παρέχει υπηρεσίες μπορεί εύκολα να είναι χρήσιμη σε άλλους πελάτες. Συντήρηση Κώδικα (Maintainability) Ένα σφάλμα βρίσκεται σε μια μόνο μονάδα, επομένως διευκολύνεται ο εντοπισμός & διόρθωση του προβλήματος. Η επανα-μεταγλώττιση γίνεται γρήγορα (ένα αρχείο). Μπορούμε να αλλάξουμε την υλοποίηση μιας μονάδας χωρίς να αλλάξει το υπόλοιπο πρόγραμμα (εφόσον η διεπαφή δεν αλλάζει πρότυπο) 16-21

Μονάδες - Modules (Ερωτηματικά) Κατά τη σχεδίαση ενός αρθρωτού μεγάλου προγράμματος προκύπτουν κάποια ερωτηματικά: Ποιες και πόσες μονάδες πρέπει να έχει ένα πρόγραμμα; Τι υπηρεσίες πρέπει να προσφέρει μια μονάδα; Ποιες υπηρεσίες να είναι εσωτερικές και ποιές εξωτερικές; Τι αλληλεξαρτήσεις πρέπει να έχουν οι μονάδες; Σίγουρα, θα έχετε προβληματιστεί για τα ερωτήματα αυτά, από την έως τώρα τριβή σας με τις εργασίες. 16-22

Συνοχή και Διασύνδεση (Cohesion and Coupling) Σε ένα καλά σχεδιασμένο πρόγραμμα, οι μονάδες πρέπει να έχουν τα ακόλουθα χαρακτηριστικά: Ψηλή Συνοχή (High cohesion): Τα στοιχεία (συναρτήσεις, δεδομένα, κτλ) κάθε μονάδας πρέπει να συσχετίζονται όσο το δυνατό περισσότερο Χαμηλή Διασύνδεση (Low coupling): Τα Modules πρέπει να είναι όσο πιο ανεξάρτητα γίνεται (χωρίς δηλαδή να κάνει το ένα include το άλλο). Ας δούμε τώρα κάποια πραγματικά παραδείγματα από τα προγράμματα glib-c (βιβλιοθήκες gnuc), gzip (εργαλείο C), coreutils (βασικές εντολές UNIX) 16-23

Ψηλή Συνοχή και Χαμηλή Διασύνδεση (Παραδείγματα) Οι μονάδες του προγράμματος gzip124 το οποίο υλοποιεί διάφορους αλγόριθμους συμπίεσης / αποσυμπίεσης Παρατηρούμε ότι έχουμε μια μονάδα (module) ανά αλγόριθμο, ένα πελάτη και άλλα gzip.c (Client προγράμματος) trees.c / unpack.c (Huffman αλγόριθμος!) zip.c / unzip.c (PKZIP αλγόριθμος) lzw.c / unlzw.c / lzw.h (LZW αλγ.) inflate.c / deflate.c (LZ77 + Huffman) Αλλα: getopt (command options), κτλ. Το αρχείο κεφαλίδας των πλείστων αρχείων είναι το gzip.h (κάθε συνάρτηση μπορεί να υλοποιείται από ξεχωριστό προγραμματιστή) Οι οδηγοί χρήσης μπορει να είναι υλοποιημένοι εξωτερικά (εκτός κώδικα, το οποίο είναι εφικτό) assembly 16-24

Ψηλή Συνοχή και Χαμηλή Διασύνδεση (Παραδείγματα) Υποσύνολο των μονάδων για τα core utilities (βασικές εντολές) του UNIX Διαθέσιμο μέσω : http://ftp.gnu.org/gnu/ coreutils/coreutils-8.9.tar.gz Τι παρατηρείται; Με ποια λογική έχουν δημιουργηθεί οι μονάδες; Τα δικά μας προγράμματα μέχρι στιγμής ήταν "πολύ μικρά" για αυτό σκόπιμα δημιουργήσαμε και μονάδες που ΔΕΝ θα χρειάζονταν στην πραγματικότητα. Σε μεγαλύτερα προγράμματα θα ήταν πιο ξεκάθαρο πώς να χωριστεί ο κώδικας σε μονάδες (όπως τα παραδείγματα) 16-25

Τύποι Μονάδων (Types of Modules) Mέχρι στιγμής είχαμε πει ότι μια Μονάδα (Module) θα αποτελείται από ένα.c και.h αρχείο. Τώρα είμαστε πιο έτοιμοι (ώριμοι) για να χαλαρώσουμε αυτό τον περιορισμό. Γενικότερα, μπορούμε να πούμε ότι οι μονάδες ανήκουν στις ακόλουθες κατηγορίες: A. Συλλογές Δεδομένων (Data pools) B. Βιβλιοθήκες (Libraries) C. Αφαιρετικά Αντικείμενα (Abstract objects) 16-26

Τύποι Μονάδων (Types of Modules) A. Συλλογή Δεδομένων (Data Pool): συσχετιζόμενες μεταβλητές ή/και σταθερές. Στη C, μια μονάδα αυτού του τύπου μπορεί να είναι ένα απλό αρχείο κεφαλίδας, π.χ., <float.h>, <limits.h> ή το "def.h" B. Βιβλιοθήκη (Library): μια συλλογή από συσχετιζόμενες συναρτήσεις. <string.h> είναι η διεπαφή (interface) της βιβλιοθήκης που αφορά το συναρτήσεις επεξεργασίας συμβολοσειρών. Βιβλιοθήκη glibc-2.14/string Μοντέλο Υλοποίησης AS5! 16-27

Μονάδες και Βιβλιοθήκες (Module and Library) Βιβλιοθήκη (Library): Μια συλλογή από modules (αντίστοιχο της έννοιας των JAR αρχείων στη JAVA) Executable Program Library (Βιβλιοθήκη) Module Object File (*.o) Module Object File (*.o) Library tree.o stack.o queue.o Module (Object File) myjpglib.a mybmplib.a main.o Library (Βιβλιοθήκη) Module Object File (*.o) libc.so Module Object File (*.o) Statically-linked (δηλ., κατά την μεταγλώττιση συνδέονται όλα σε ένα αρχείο, το εκτελέσιμο!) Dynamically-linked (δηλ., κατά την εκτέλεση το Λειτουργικό συνδέει το εκτελέσιμο με την βιβλιοθήκη) 16-29

Μονάδες και Βιβλιοθήκες (Module and Library) Παράδειγμα Δημιουργίας / Σύνδεσης με Στατική Βιβλιοθήκης: Α) Δημιουργία Αντικειμενικών Αρχείων: gcc -Wall -c f1.c f2.c Β) Δημιουργία Βιβλιοθήκης "mylibc.a" // ar -- create and maintain library archives ar -cvq libc.a f1.o f2.o Γ) Παρουσίαση Αρχείων στη Βιβλιοθήκης: ar t libc.a Δ) Σύνδεση προγράμματος πελάτη με τη Βιβλιοθήκη gcc -o game client.c mylibc.a Module Object File (f1.o) libc.a Module Object File (f2.o) Module Object File (client.o) game 16-30

Εκτελέσιμο Μονάδες και Βιβλιοθήκες (Module and Library) Σύνδεση με Στατική Βιβλιοθήκη (Static Library) Module Object File (*.o) Module Object File (*.o) libc.a Σύνδεση με Δυναμική Βιβλιοθήκη (Dynamic Library) Εκτελέσιμο (Εκτός Μαθήματος) Module Object File (*.o) Module Object File (*.o) libc.so Example: http://www.yolinux.com/tutorials/libraryarchives-staticanddynamic.html 16-31

Απόκρυψη Πληροφορίας (Information Hiding) Μια καλά σχεδιασμένη μονάδα αποκρύπτει πληροφορίες από τους πελάτες της (γνωστό ως απόκρυψη πληροφορίας information hiding) Π.χ., Οι πελάτες της στοίβας δε χρειάζεται να γνωρίζουν εάν η στοίβα αποθηκεύεται σε πίνακα, συνδεδεμένη λίστα ή αλλιώς. Λόγοι Απόκρυψης: Ασφάλεια (Security). Εάν οι πελάτες δεν γνωρίζουν πως αποθηκεύονται τα δεδομένα εσωτερικά δεν μπορούν να την μεταβάλουν συνειδητά ή ασυνείδητα. Ευελιξία (Flexibility). Η αλλαγές στα εσωτερικά ενός module δεν θα είναι δύσκολη από τον προγραμματιστή εφόσον το module εκθέτει (διαφημίζει) μόνο τη διεπαφή. της! 16-32

Απόκρυψη Πληροφορίας (Information Hiding) Στη C, το βασικό εργαλείο για απόκρυψη πληροφορίας είναι η χρήση του static Μια static μεταβλητή με εμβέλεια αρχείου, είναι "ορατή" μόνο εσωτερικά του αρχείου (ούτε και οι πελάτες της μονάδας δεν το βλέπουν). Μια static συνάρτηση μπορεί να καλείται απευθείας μόνο από άλλες συναρτήσεις μέσα στο ίδιο αρχείο. def.h #define PUBLIC // Ορατή Εκτός Αρχείου #define PRIVATE static // Ορατή Εντός Αρχείου 16-33

Τύποι Μονάδων (Types of Modules) C. Αφηρημένο Αντικείμενο (Abstract Object): Συλλογή από συναρτήσεις που εργάζονται πάνω σε κάποια δομή η οποία είναι εσωτερική (hidden). Στη διάλεξη 11 χρησιμοποιήσαμε το static μπροστά από τις εσωτερικές μεταβλητές της στοίβας (η οποία ήταν αφηρημένο αντικείμενο) stack.h static int sp = 0; static double val[100]; Προβλήματα; Επόμενη Διαφάνεια main.ci #include "stack.h" int main() { STACK stack; int x = 1; push(&stack, x); // OK stack.sp = 2; // ERROR 16-34

Τύποι Μονάδων (Types of Modules) Πρόβλημα 1: Συγκρούσεις στα Ονόματα (π.χ., include "queue.h" και "stack.h" και τα δυο περιέχουν συνάρτηση top() Λύση: Πρόθεμα στις συναρτήσεις stack_top() και queue_top(). Πρόβλημα 2: Δεν θα μπορούσαμε να "κρύψουμε" τα δεδομένα του stack εάν είχαμε typedef Οι αντικειμενοστραφείς γλώσσες (JAVA, C++, C#) υποστηρίζουν ευκολότερα τους Αφηρημένους Τύπους Δεδομένων (ΑΤΔ) stack.h typedef struct { int sp = 0; double val[100]; } STACK; main.ci #include "stack.h" int main() { STACK stack; int x = 1; push(&stack, x); // OK stack.sp = 2; // ΟΚ!!! 16-35