Χαρακτηριστικά ενοτήτων

Σχετικά έγγραφα
HY150a Φροντιστήριο 3 24/11/2017

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

Ανάπτυξη και Σχεδίαση Λογισμικού

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

Generics (Γενικότθτα)

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

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Goals of this Lecture. Generics(Γενικότητα) Generic Data Structures Example. Generic Data Structures Example

Φροντιστήριο 4 Σκελετοί Λύσεων

Διαδικασιακός Προγραμματισμός

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

Βιβλιοθήκη stdio. Προγραμματισμός II 1

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

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

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

Βιβλιοθήκη stdio. Προγραμματισμός II 1

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

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

υναµικές οµές εδοµένων

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

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

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

Επεξεργασία Αρχείων Κειµένου

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

Ανάπτυξη και Σχεδίαση Λογισμικού

Περιεχόµενα. Πρόλογος... 15

Φροντιστήριο 4 Σκελετοί Λύσεων

Στοίβες με Δυναμική Δέσμευση Μνήμης

#define, 70, 575 #elif, 580 #else, 580 #endif, 580 #error, 584 #if, 580 #ifdef, 583 #ifndef, 580, 583 #include, 70, 227, 574 #undef, 579

Συναρτήσεις πρότυπης βιβλιοθήκης 1. Μερικές συνήθεις συναρτήσεις βιβλιοθήκης int atoi(const char *p) int fclose(file *fp)

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

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

Προγραμματισμός Ι (ΗΥ120)

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

Πρόβλημα 1: Αναζήτηση Ελάχιστης/Μέγιστης Τιμής

Προγραμματισμός Δομές Δεδομένων

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

Δομές δεδομένων (2) Αλγόριθμοι

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Προγραμματισμός Η/Υ (ΤΛ2007 )

Σημειώσεις όγδοης εβδομάδας

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

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

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Δείκτες και Δομές. Info. Link. typedef struct NodeTag { InfoField Info; struct NodeTag *Link; } NodeType;

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

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

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

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

Διάλεξη 9: Δυναμική Δέσμευση Μνήμης

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

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

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Ι (ΗΥ120)

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

SOAP API. Table of Contents

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

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

Προγραµµατισµός Ι Αλφαριθµητικά Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Προγραµµατισµός Ι 1 Νικόλαος Δ.

Δείκτες σε συναρτήσεις. Προγραμματισμός II 1

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

Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα)

Διαδικασιακός Προγραμματισμός

Συλλογές, Στοίβες και Ουρές

The Simply Typed Lambda Calculus

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

Δομημένος Προγραμματισμός (ΤΛ1006)

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

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

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

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

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Διάλεξη 8η: Αλφαριθμητικά (strings)

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

Hancock. Ζωγραφάκης Ιωάννης Εξαρχάκος Νικόλαος. ΕΠΛ 428 Προγραμματισμός Συστημάτων

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

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραμματισμός Η/Υ. Ενότητα 9: Ειδικά θέματα Δομών Δεδομένων

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

Φροντιςτήριο. Linked-List

Instruction Execution Times

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Διαδικαστικός Προγραμματισμός

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

Δομημένος Προγραμματισμός (ΤΛ1006)

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ. Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out)

Transcript:

Χαρακτηριστικά ενοτήτων 1

Στόχοι Πώς να δημιουργήσεις ενότητες υψηλής ποιότητας στην C. Γιατί χρειάζεται; Η αφαίρεση είναι απαραίτητη τεχνική για την ανάπτυξη και κατανόηση μεγάλων, πολύπλοκλων συστημάτων Ο καλός προγραμματιστής γνωρίζει πώς να βρει κατάλληλες αφαιρέσεις σε ένα μεγάλο πρόγραμμα Ο καλός προγραμματιστής γνωρίζει πώς να παρουσιάζει τις αφαιρέσεις σε ένα μεγάλο πρόγραμμα μέσω των ενοτήτων. 2

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

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

Παράδειγμα Stack: Στοίβα που διαχειρίζεται strings Σχεδιαστική Επιλογή με Δυναμική Συνδεδεμένη Λίστα. Πράξεις new: Δημιουργία νέου Stack free: Απελευθέρωση push: ώθηση top: εξαγωγή στοιχείου κορυφής pop: απόρριψη στοιχείου κορυφής isempty: Return 1 αν η Stack κενό 5

Χωρίς απόκρυψη /* stack.c */ struct Node { /* client.c */ const char *item; struct Node *next; }; struct Stack { struct Node *first; }; struct Stack *Stack_new(void) { } void Stack_free(struct Stack *s) { } void Stack_push(struct Stack *s, const char *item) { } char *Stack_top(struct Stack *s) { } void Stack_pop(struct Stack *s) { } int Stack_isEmpty(struct Stack *s) { } #include "stack.c" /* Use the functions defined in stack.c. */ Δεν υπάρχει διεπαφή (υπάρχει μόνο ένα αρχείο) Αλλαγή stack.c => rebuild stack.c και πελάτη Χωρίς αφαίρεση, ορισμοί με αχρείαστες λεπτομέρειες είναι ορατοί. 6

Η Μερική Απόκρυψη (διεπαφή) Ενότητα Stack αποτελείται από δυο αρχεία - Το stack.h (the interface) δηλώνει functions and ορίζει data structures (ο τύπος στοιχείου είναι char*) /* stack.h */ struct Node { const char *item; struct Node *next; }; struct Stack { struct Node *first; }; struct Stack *Stack_new(void); void Stack_free(struct Stack *s); void Stack_push(struct Stack *s, const char *item); char *Stack_top(struct Stack *s); void Stack_pop(struct Stack *s); int Stack_isEmpty(struct Stack *s); 7

Μερική Απόκρυψη (υλοποίηση) Το stack.c (η υλοποίηση) ορίζει functions #include stack.h Έλεγχος μεταγλωττιστή Οι συναρτήσεις έχουν πρόσβαση στα δεδομένα /* stack.c */ #include "stack.h" struct Stack *Stack_new(void) { } void Stack_free(struct Stack *s) { } void Stack_push(struct Stack *s, const char *item) { } char *Stack_top(struct Stack *s) { } void Stack_pop(struct Stack *s) { } int Stack_isEmpty(struct Stack *s) { } 8

Μερική Απόκρυψη (χρήση) Πελάτης #include την διεπαφή Αν αλλάξει το stack.c => μεταγλώττιση μόνο του stack.c, όχι του πελάτη. Καλύτερη αφαίρεση (οι προσβάσεις στην δομή μπορούν να γίνουν μέσω συναρτήσεων) /* client.c */ #include "stack.h" /* Use the functions declared in stack.h. */ 9

2. Ενθυλάκωση Δεδομένων (Ολική Απόκρυψη) Η πρόσβαση στη δομή αποκλειστικά μέσω συναρτήσεων Πληρης απόκρυψη λεπτομερειών υλοποίησης Συναρτήσεις για πρόσβαση Οι πελάτες δεν έχουν πρόσβαση απευθείας στα δεδομένα. Όφελος: Ευκρίνεια - μέσω της αφαίρεσης Ασφάλεια - οι πελάτες δεν μπορούν να καταστρέψουν αντικείμενα Ευελιξία Επιτρέπει αλλαγές στην υλοποίηση, ακόμα και στα δεδομένα, χωρίς να επηρεάζονται οι πελάτες. 10

Πρόβλημα με Μερική απόκρυψη /* stack.h */ struct Node { const char *item; struct Node *next; }; struct Stack { struct Node *first; }; Ορισμοί στο.h struct Stack *Stack_new(void); void Stack_free(struct Stack *s); void Stack_push(struct Stack *s, const char *item); char *Stack_top(struct Stack *s); void Stack_pop(struct Stack *s); int Stack_isEmpty(struct Stack *s); Διεπαφή αποκαλύπτει υλοποίηση με συνδεδεμένη λίστα Ο πελάτης μπορεί να αλλάξει/προσπελάσει απευθείας τα δεδομένα, πιθανά να τα αλλοιώσει. struct Stack S; S->item = NULL; 11

Ολική Απόκρυψη /* stack.h */ typedef struct Stack * Stack_T; Stack_T Stack_new(void); void Stack_free(Stack_T s); void Stack_push(Stack_T s, const char *item); char *Stack_top(Stack_T s); void Stack_pop(Stack_T s); int Stack_isEmpty(Stack_T s); Μετακίνηση ορισμού στο.c και χρήση δείκτη Αδιαφανής (opaque) δείκτης Stack_T Stack_T ο νέος τύπος Ο πελάτης δεν έχει πρόσβαση στα δεδομένα άμεσα; Τα δεδομένα είναι αδιαφανή. Stack_T S; S->item=NULL (syntax error). 12

Stdio Μερική απόκρυψη /* stdio.h */ struct FILE { int cnt; /* characters left */ char *ptr; /* next character position */ char *base; /* location of buffer */ int flag; /* mode of file access */ int fd; /* file descriptor */ }; Αλλά δεν χρειάζεται να δούμε τους ορισμούς 13

3. Διαχειρίζεται πόρους με συνέπεια Ελευθερώνει πόρους μόνο αν τους έχει δεσμεύσει. Π.χ malloc <=> free opens file <=> closes file Δέσμευση και αποδέσμευση σε διαφορετικά επίπεδα έχει κινδύνους Δεν κάνουμε free => memory leak (διαρροή) Δεν κάνουμε malloc => dangling pointer (αιωρούμενος), seg fault Δεν κλείνουμε close file => μη αποδοτική χρήση πόρου Δεν ανοίγουμε to open file => dangling pointer (αιωρούμενος), seg fault 14

Παράδειγμα Stack: Ποιος δεσμεύει και αποδεσμεύει τα strings; Αποδεκτές Επιλογές (1) Client allocates and frees strings Stack_push() δεν δημιουργεί string, δέχεται δείκτη. Stack_pop() δεν ελευθερώνει το string Stack_free() δεν ελευθερώνει τα strings (2) Stack object allocates and frees strings Stack_push() δημιουργεί string Stack_pop() ελευθερώνει το string Stack_free() ελευθερώνει τα strings Η επιλογή μας η (1) για να έχουμε γενικό ορισμό του Stack. Μη αποδεκτές επιλογές: Ο πελάτης δημιουργεί string, Stack ελευθερώνει Stack δημιουργεί strings, ο πελάτης ελευθερώνει 15

4. Καλή επιλογή Ονομάτων Ονόματα με συνέπεια Όνομα συνάρτησης περιέχει το όνομα της δομής Βοηθάει στην συντήρηση του προγράμματος Μειώνει πιθανότητα σύγκρουσης ονομάτων Οι συναρτήσεις να έχουν συνεπή διάταξη παραμέτρων Βοηθάει στην κλήση τους 16

Παραδείγματα Stack (+) Συναρτήσεις ξεκινούν με πρόθεμα Stack_ (+) πρώτη παράμετρος τύπος δομής string (+) ξεκινούν με str (+) Προορισμός πρώτη, προέλευση δεύτερη; Μιμείται απόδοση τιμής stdio (-) Μερικές συναρτήσεις ξεκινούν f, άλλες όχι (-) Μερικές συναρτήσεις έχουν πρώτη παράμετρο FILE. Άλλες (e.g. putc()) διαφορετική. 17

5. Έχει ελάχιστη διεπαφή Δήλωση στο.h εφόσον Είναι απαραίτητη ή Βολική Περισσότερες συναρτήσεις σημαίνει υψηλότερο κόστος συντήρησης και χρόνο μάθησης 18

Παράδειγμα Στοίβα /* stack.h */ typedef struct Stack *Stack_T ; Stack_T Stack_new(void); void Stack_free(Stack_T s); void Stack_push(Stack_T s, const char *item); char *Stack_top(Stack_T s); void Stack_pop(Stack_T s); int Stack_isEmpty(Stack_T s); Όλες απαραίτητες 19

Παράδειγμα Stack Αν προσθέταμε την void Stack_clear(Stack_T s); Ακυρώνει όλα τα στοιχεία Δεν είναι απαραίτητη; Ο πελάτης μπορεί με συνεχόμενα pop() να επιτύχει το ίδιο Ίσως βολική 20

Παράδειγμα String /* string.h */ /* απαραίτητες*/ size_t strlen(const char *s); char *strncpy(char *dest, const char *src, size_t n); char *strncat(char *dest, const char *src, size_t n); char *strncmp(const char *s, const char *t, size_t n); char *strstr(const char *haystack, const char *needle); /* βολικές και αποδοτικές */ char n *strcpy(char functions are necessary *dest, const char *src); char *strcat(char *dest, const char *src); char *strcmp(const char *s, const char *t); 21

Παράδειγμα stdio /* απαραίτητες */ FILE *fopen(const char *filename, const char *mode); int fclose(file *f); int fflush(file *f); int fgetc(file *f); int putc(int c, FILE *f); int fscanf(file *f, const char *format, ); int fprintf(file *f, const char *format, ); /* βολικές */ int getchar(void); int printf(const char *format, ); int putchar(int c); int scanf(const char *format, ); /* τίποτα από τα δυο */ int getc(file *f); 22

6. Αναφέρει λάθη Αναφέρει λάθη στους πελάτες Η ενότητα διαπιστώνει λάθη, το οποία χειρίζεται ο πελάτης Τα λάθη τα χειρίζεται καλύτερα ο πελάτης 23

Αναφορά λαθών στην C Εντοπισμός λάθους if statement assert macro Αναφορά στον πελάτη Με καθολική μεταβλητή Ξεχνάμε να ελέγξουμε (δεν φαίνεται άμεσα) Δεν ενδείκνυται για πολυνηματικές εφαρμογές Επιστροφή τιμής Ποια τιμή να επιλέξουμε για λάθος Επιπλέον παράμετρος-σημαία (flag) Μια επιπλέον παράμετρος Κλήση assert macro Εντοπίζει, αλλά δεν ανακάμπτει Δεν υπάρχει ιδανική επιλογή 24

Αναφορά λαθών στην C (συνεχ.) Διαφοροποιούμε Λάθη χρήστη (User errors) Errors made by human user Example: Bad data in stdin Example: Bad command-line argument Errors that easily could happen To detect: Use if statement To report: Use return value or (by-pointer-value) parameter Λάθη Προγραμματιστή (Programmer errors) Errors made by a programmer Errors that never should happen Example: Call Stack_pop() with NULL stack, empty stack To detect and report: Use assert The distinction sometimes is unclear Example: Write to file fails because disk is full 25

Αναφορά λαθών στην C (συνεχ.) Stack /* stack.c */ void Stack_push(Stack_T s, const char *item) { struct Node *p; assert(s!= NULL); p = (struct Node*)malloc(sizeof(struct Node)); assert(p!= NULL); p->item = item; p->next = s->first; s->first = p; } Stack functions: Consider invalid parameter to be programmer error Consider malloc() failure to be programmer error Detect/report no user errors 26

Παραδείγματα string No error detection or reporting Example: NULL parameter to strlen() => probable seg fault stdlib Uses return values to indicate failure Note awkwardness of scanf() Sets global variable errno to indicate cause of failure 27

7. Ορίζει συμβόλαια A module should establish contracts with its clients Contracts should describe what each function does, esp: Οι λόγοι Meanings of parameters Valid/invalid parameter values Meaning of return value Side effects Establishing contracts facilitates cooperation between multiple programmers on a team Establishing contracts assigns blame to violators Catch errors at the door! Better that the boss yells at the programmer who is your client rather than at you!!! 28

Ορισμός συμβολαίων στην C Προτείνουμε Με σχόλια Η υλοποίηση ακολουθεί τα σχόλια 29

Παράδειγμα Stack /* stack.h */ char *Stack_top(Stack_T s); /* Return the top item of stack s. It is a checked runtime error for s to be NULL or empty. */ Comment defines contract: Meanings of function s parameters s is the pertinent stack Valid/invalid parameter values s cannot be NULL or empty Meaning of return value The return value is the top item Side effects (None, by default) 30

8. Συνάφεια Υψηλή Συνάφεια Οι συναρτήσεις να έχουν σχέση μεταξύ τους Βοηθάει την αφαίρεση 31

Υψηλή Συνάφεια Παραδείγματα Stack (+) All functions are related to the encapsulated data string stdio (+) Most functions are related to string handling (-) Some functions are not related to string handling memcpy(), memmove(), memcmp(), memchr(), memset() (+) But those functions are similar to string-handling functions (+) Most functions are related to I/O (-) Some functions don t do I/O sprintf(), sscanf() (+) But those functions are similar to I/O functions 32

9. Ασθενής Εξάρτηση Τι σημαίνει Να συνδέεται λίγο με άλλες ενότητες Διάδραση εσωτερικά σε ενότητες πιο έντονες από διάδραση μεταξύ ενοτήτων Παρατηρήσεις Συντήρηση : Με ασθενή εξάρτηση το πρόγραμμα αλλάζει πιο εύκολα Επαναχρησιμοποίηση: Η ασθενή εξάρτηση βοηθάει στην επαναχρησιμοποίηση σε άλλα προγράμματα Εμπειρία Ενότητες έχουν λιγότερα λάθη 33

Ασθενής Εξάρτηση Παράδειγμα Σχεδιασμός Airplane Airplane Κλήση συνάρτησης getlat() Simulator f() move() getlat() getlon() getalt() setlat() Simulator f() getlon() getalt() setlat() setlon() setlon() setalt() setalt() move() Πελάτης καλεί πολλές συναρτήσεις Δυνατή Εξάρτηση - σχεδιασμός Πελάτης καλεί λίγες συναρτήσεις Ασθενής εξάρτηση - σχεδιασμός 34

Ασθενής Εξάρτηση-Παράδειγμα Many function calls One function call Κατά την εκτέλεση-ασθενής εξάρτηση Client f() sort() Collection getn() setn() Client f() Collection getn() setn() sort() Πολλές κλήσεις Δυνατή Εξάρτηση Λίγες Κλήσεις Ασθενής Εξάρτηση 35

Ασθενής Εξάρτηση-Παράδειγμα Συντήρηση-εξάρτηση Changed together often Client My Module Client My Module f1() f1() f2() f2() f3() f3() Εξάρτηση συντήρησης Δυνατή εξάρτηση στην συντήρηση Όχι αλλαγές Ασθενής εξάρτηση στην συντήρηση 36

Επιτυγχάνοντας Ασθενή Εξάρτηση Μετακίνηση κώδικα Από πελάτες σε ενότητα Από ενότητα σε πελάτες Από πελάτες και ενότητες σε νέες ενότητες 37