20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 1 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ (LAYOUT & STYLE) Διάταξη Κώδικα: ακραίο παράδειγμα προς αποφυγή (σε Pascal) procedure InsertionSort( Var Data: SortArray_t; FirstElmt: Integer; LastElmt: Integer ); { Use the insertion sort technique to sort the "Data" array in ascending order. This routine assumes that Data [ FirstElmt ] is not the FirstElmt element in Data and that Data [ FirstElmt−1 ] can be accessed. } Const SortMin = ''; Var SortBoundary: Integer; { upper end of sorted range } InsertPos: Integer; { position to insert element } InsertVal: SortElmt_t; { value to insert } LowerBoundary: SortElmt_t; { first value below range to sort } begin { Replace element at lower boundary with an element guaranteed to be first in a sorted list } LowerBoundary := Data[ FirstElmt−1 ]; Data [ FirstElmt−1 ] := SortMin; { The elements in positions FirstElmt through SortBoundary−1 are always sorted. In each pass through the loop, SortBoundary is increased, and the element at the position of the new SortBoundary probably isn't in its sorted place in the array, so it's inserted into the proper place somewhere between FirstElmt and SortBoundary. } for SortBoundary := FirstElmt+1 to LastElmt do begin InsertVal := Data [ SortBoundary ]; InsertPos := SortBoundary; while InsertVal < Data [ InsertPos−1 ] do begin Data[ InsertPos ] := Data[ InsertPos−1 ]; InsertPos := InsertPos−1; end; Data [ InsertPos ] := InsertVal; end; { Replace original lower-boundary element } Data[ FirstElmt−1 ] := LowerBoundary; end; { InsertionSort }
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 2 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ (LAYOUT & STYLE) Διάταξη Κώδικα: ο ίδιος κώδικας λίγο καλύτερα procedure InsertionSort( Var Data: SortArray_t; FirstElmt: Integer; LastElmt: Integer ); { Use the insertion sort technique to sort the "Data" array in ascending order. This routine assumes that Data[ FirstElmt ] is not the first element in Data and that Data[ FirstElmt−1 ] can be accessed. } Const SortMin = ''; Var SortBoundary: Integer; { upper end of sorted range } InsertPos: Integer; { position to insert element } InsertVal: SortElmt_t; { value to insert } LowerBoundary: SortElmt_t; { first value below range to sort } begin { Replace element at lower boundary with an element guaranteed to be first in a sorted list } LowerBoundary := Data[ FirstElmt−1 ]; Data[ FirstElmt−1 ] := SortMin; { The elements in positions FirstElmt through SortBoundary−1 are always sorted. In each pass through the loop, SortBoundary is increased, and the element at the position of the new SortBoundary probably isn't in its sorted place in the array, so it's inserted into the proper place somewhere between FirstElmt and SortBoundary. } for SortBoundary := FirstElmt+1 to LastElmt do begin InsertVal := Data[ SortBoundary ]; InsertPos := SortBoundary; while InsertVal < Data[ InsertPos−1 ] do begin Data[ InsertPos ] := Data[ InsertPos−1 ]; InsertPos := InsertPos−1; end; Data[ InsertPos ] := InsertVal; end; { Replace original lower-boundary element } Data[ FirstElmt−1 ] := LowerBoundary; end; { InsertionSort }
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 3 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ (LAYOUT & STYLE) Διάταξη Κώδικα: σωστά γραμμένος κώδικας procedure InsertionSort ( Var Data:SortArray_t; FirstElmt: Integer; LastElmt: Integer ); { Use the insertion sort technique to sort the "Data" array in ascending order. This routine assumes that Data[ FirstElmt ] is not the first element in Data and that Data[ FirstElmt−1 ] can be accessed. } Const SortMin = ''; Var SortBoundary: Integer; { upper end of sorted range } InsertPos: Integer; { position to insert element } InsertVal: SortElmt_t;{ value to insert } LowerBoundary: SortElmt_t;{ first value below range to sort } begin { Replace element at lower boundary with an element guaranteed to be first in a sorted list } LowerBoundary := Data[ FirstElmt−1 ]; Data[ FirstElmt−1 ] := SortMin; { The elements in positions FirstElmt through SortBoundary−1 are always sorted. In each pass through the loop, SortBoundary is increased, and the element at the position of the new SortBoundary probably isn't in its sorted place in the array, so it's inserted into the proper place somewhere between FirstElmt and SortBoundary.}
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 4 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ (LAYOUT & STYLE) Διάταξη Κώδικα: σωστά γραμμένος κώδικας (συνέχεια) for SortBoundary := FirstElmt+1 to LastElmt do begin InsertVal := Data[ SortBoundary ]; InsertPos := SortBoundary; while InsertVal < Data[ InsertPos−1 ] do begin Data[ InsertPos ] := Data[ InsertPos−1 ]; InsertPos := InsertPos−1; end; Data[ InsertPos ] := InsertVal; end; { Replace original lower-boundary element } Data[ FirstElmt−1 ] := LowerBoundary; end; { InsertionSort }
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 5 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ (LAYOUT & STYLE) Διάταξη Κώδικα: μορφοποίηση κώδικα που αξιοποιεί τυπογραφικά χαρακτηριστικά (με κατάλληλο εργαλείο)
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 6 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΘΕΜΕΛΙΩΔΕΙΣ ΑΡΧΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ Η ΒΑΣΙΚΗ ΑΡΧΗ ΤΗΣ ΣΩΣΤΗΣ ΜΟΡΦΟΠΟΙΗΣΗΣ Τεχνικές που ωραιοποιούν τον κώδικα είναι πάντα χρήσιμες, αλλά όχι τόσο σημαντικές όσο οι τεχνικές που αναδεικνύουν τη λογική του δομή και οργάνωση. ΑΝΘΡΩΠΙΝΗ ΚΑΙ ΥΠΟΛΟΓΙΣΤΙΚΗ ΕΡΜΗΝΕΙΑ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ Η διάταξη του κώδικα είναι μία χρήσιμη ένδειξη της δομής ενός προγράμματος. Ενώ ο υπολογιστής στηρίζεται αποκλειστικά σε εντολές όπως begin και end ή { και }, ο άνθρωπος δημιουργεί παραστάσεις αντίληψης από την οπτική παρουσίαση του κώδικα.
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 7 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΘΕΜΕΛΙΩΔΕΙΣ ΑΡΧΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ Παράδειγμα κώδικα που διαφορετική σημασία έχει για τον υπολογιστή και διαφορετική σημασία έχει για τον άνθρωπο /* swap left and right elements for whole array */ for ( i = 0; i < MAX_ELMTS; i++ ) LeftElmt= Left[ i ]; Left[ i ] = Right[ i ]; Right[ i ] = LeftElmt; Δεύτερο παράδειγμα κώδικα που διαφορετική σημασία έχει για τον υπολογιστή και διαφορετική σημασία έχει για τον άνθρωπο x = 3+4 * 2+7;
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 8 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΘΕΜΕΛΙΩΔΕΙΣ ΑΡΧΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ Είναι πιο απλή η συγγραφή κώδικα που να είναι αναγνώσιμος από τον υπολογιστή, αλλά πολύ περισσότερο σύνθετη η συγγραφή κώδικα που να είναι αναγνώσιμος από τον άνθρωπο. Το πείραμα με τη σκακιέρα, τους experts και τους αρχάριους: όταν τα πιόνια είναι τοποθετημένα σε θέσεις που θα μπορούσαν να εμφανιστούν στη διάρκεια ενός παιχνιδιού η μνήμη ενός expert λειτουργεί πιο αποτελεσματικά από τη μνήμη ενός αρχάριου. Όταν τα πιόνια τοποθετούνται τυχαία δεν υπάρχει διαφορά μεταξύ expert και αρχάριου.
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 9 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΘΕΜΕΛΙΩΔΕΙΣ ΑΡΧΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ ΣΥΜΠΕΡΑΣΜΑ: Όταν η πληροφορία αντιστοιχεί σε δομημένη γνώση - τοποθέτηση σε θέσεις που έχουν νόημα - ο ειδικός μπορεί να θυμάται καλύτερα. Όταν η πληροφορία δεν αντιστοιχεί σε δομημένη γνώση ο ειδικός δεν μπορεί να θυμάται πολύ καλύτερα από ότι ο αρχάριος. ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ: Όταν οι εντολές του προγράμματος είναι διευθετημένες σε λογική σειρά (που είναι εύκολα αντιληπτή) οι ειδικοί εμφανίζουν βελτιωμένες δυνατότητες απομνημόνευσης σε σχέση με τους αρχάριους. Όταν οι εντολές είναι ανακατεμένες (ή έτσι φαίνεται) δεν υπάρχει διαφορά στη δυνατότητα απομνημόνευσης της λογικής του κώδικα.
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 10 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΘΕΜΕΛΙΩΔΕΙΣ ΑΡΧΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ Δεδομένης της πληθώρας των στυλ διάταξης κώδικα και της εμμονής των προγραμματιστών στο δικό τους στυλ, οι λεπτομέρειες της συγκεκριμένης μεθόδου δόμησης προγράμματος είναι πολύ λιγότερο σημαντικές από το γεγονός ότι τελικά ο κώδικας έχει μια δομή. Οι καλοί προγραμματιστές θα πρέπει να είναι ανοιχτοί σε νέες πρακτικές διάταξης κώδικα και να υιοθετούν πρακτικές που αποδεδειγμένα είναι καλύτερες απ΄ αυτές που χρησιμοποιούν, παρόλο που η αλλαγή αυτή μπορεί αρχικά να δημιουργεί μία δυσκολία.
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 11 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΘΕΜΕΛΙΩΔΕΙΣ ΑΡΧΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ Στόχοι μιας σωστής διάταξης κώδικα: – Ακριβής αναπαράσταση της λογικής δομής του κώδικα – Συνεπής αναπαράσταση της λογικής δομής του κώδικα: κάποια στυλ έχουν τόσες πολλές εξαιρέσεις που είναι τελικά δύσκολο να διακρίνουμε συνεπείς κανόνες δόμησης κώδικα – Βελτίωση αναγνωσιμότητας – Ανθεκτικότητα σε τροποποιήσεις: στα καλά σχήματα διάταξης η τροποποίηση μιας γραμμής κώδικα δεν επιφέρει τροποποιήσεις στις υπόλοιπες γραμμές
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 12 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΤΕΧΝΙΚΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ Κενά: – Χρησιμοποιείτε χαρακτήρες κενού, tabs, χαρακτήρες αλλαγής γραμμής και κενές γραμμές για να βελτιώσετε την αναγνωσιμότητα του προγράμματος – Φανταστείτε το ρόλο των κεφαλαίων, των παραγράφων και των προτάσεων σε ένα βιβλίο: καταδεικνύουν στον αναγνώστη πως να οργανώσει νοητικά ένα θέμα. Η πληροφορία που περιέχεται σε ένα πρόγραμμα είναι πολύ πιο πυκνή από την πληροφορία που περιέχεται στα περισσότερα βιβλία.
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 13 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΤΕΧΝΙΚΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ Κενά: – Συνήθως σε ένα ή δύο λεπτά μπορούμε να διαβάσουμε και να καταλάβουμε μια σελίδα βιβλίου, αλλά οι περισσότεροι προγραμματιστές δεν μπορούν να κατανοήσουν ένα πρόγραμμα με αυτόν τον ρυθμό. ΣΥΜΠΕΡΑΣΜΑ: ένα πρόγραμμα πρέπει να παρέχει πολύ περισσότερες ενδείξεις οργάνωσης και δομής από ότι ένα βιβλίο. – Ομαδοποίηση: Τα κενά χρησιμοποιούνται για την ομαδοποίηση εντολών που σχετίζονται μεταξύ τους.
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 14 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΤΕΧΝΙΚΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ Κενά: – Κενές γραμμές: Όσο σημαντική είναι η ομαδοποίηση γραμμών που σχετίζονται μεταξύ τους, άλλο τόσο σημαντικός είναι ο διαχωρισμός εντολών που δε σχετίζονται μεταξύ τους. Αυτό γίνεται με τις κενές γραμμές που ουσιαστικά χρησιμοποιούνται για το άνοιγμα νέων παραγράφων κώδικα. Έχει βρεθεί ότι η βέλτιστη αναλογία κενών γραμμών σε ένα πρόγραμμα είναι 8 % με 16 %. Περισσότερες κενές γραμμές αυξάνουν δραματικά τον απαιτούμενο χρόνο αποσφαλμάτωσης.
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 15 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΤΕΧΝΙΚΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ Κενά: – Στοίχιση: Στοιχίζουμε τα όμοια στοιχεία (π.χ. τελεστές ανάθεσης) στις ομάδες εντολών που σχετίζονται μεταξύ τους. Αυτή η τακτική επιτείνει την ιδέα ότι οι συγκεκριμένες εντολές ανήκουν όλες στην ίδια ομάδα. – Εσοχές: Χρησιμοποιούμε εσοχές για να καταδείξουμε τη λογική δομή του προγράμματος. Σα βασικό κανόνα υιοθετούμε την εσοχή εντολών κάτω από την εντολή στην οποία λογικά αυτές υπάγονται. Μελέτες έχουν δείξει ότι όταν χρησιμοποιούνται εσοχές από δύο μέχρι τέσσερις θέσεις η κατανοησιμότητα των προγραμμάτων βελτιώνεται από 20% μέχρι 30%.
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 16 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΤΕΧΝΙΚΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ Παρενθέσεις: – Χρησιμοποιείτε παρενθέσεις πολύ πιο συχνά από όσο νομίζετε ότι σας χρειάζονται για να διευκρινίζετε τις εκφράσεις που συνδυάζουν περισσότερους από δύο όρους. Παράδειγμα C: πως αποτιμάται η έκφραση 12+4 % 3 * 7 / 8
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 17 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΣΤΥΛ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ Ένα block κώδικα περικλείεται σε λέξεις κλειδιά: στην Pascal μεταξύ begin και end και στη C μεταξύ { και }. Πολλά από τα θέματα που σχετίζονται με τη διάταξη του κώδικα έχουν να κάνουν με τη διάταξη blocks κώδικα. Τα τέσσερα πιο συχνά χρησιμοποιούμενα στυλ διάταξης είναι: – τα άψογα διευθετημένα blocks (pure blocks) – η διάταξη τέλους γραμμής – η προσομοίωση άψογα διευθετημένων blocks – χρήση ορίων block begin και end Το στυλ διάταξης που επιλέγεται εξαρτάται και από τη γλώσσα προγραμματισμού.
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 18 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΣΤΥΛ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ άψογα διευθετημένα blocks (pure blocks) παραδείγματα κώδικα Ada: if PixelColor = RedColor then statement1; statement2;... end if; while PixelColor = RedColor loop statement1; statement2;... end loop; case PixelColor of when RedColor => statement1; statement2;... when GreenColor => statement1; statement2;... when others => statement1; statement2;... end case;
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 19 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΣΤΥΛ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ διάταξη τέλους γραμμής μερικές φορές βολεύει: αλλά if ( SoldCount > 10 and PrevMonthSales > 10 ) then if ( SoldCount > 100 and PrevMonthSales > 10 ) then if ( SoldCount > 1000 ) then begin Markdown := 0.10; Profit := 0.05 end else Markdown := 0.05 else Markdown := else Markdown := 0.0; while PixelColor = RedColor do begin statement1; statement2;... end;
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 20 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΣΤΥΛ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ Αποφεύγετε τη διάταξη τέλους γραμμής γιατί δεν είναι ακριβής, είναι δύσκολο να εφαρμοστεί με συνέπεια και δύσκολο να συντηρηθεί. προσομοίωση άψογα διευθετημένων blocks if PixelColor = RedColor then begin statement1; statement2;... end;
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 21 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΣΤΥΛ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ χρήση ορίων block begin και end if PixelColor = RedColor then begin statement1; statement2;... end; Αυτό το στυλ είναι καλό, συμμορφώνεται στη βασική αρχή της σωστής μορφοποίησης, μπορεί εύκολα να εφαρμοσθεί με συνέπεια και δε δημιουργεί προβλήματα συντήρησης.
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 22 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΔΟΜΩΝ ΕΛΕΓΧΟΥ Αποφεύγετε τα ζεύγη begin – end χωρίς εσοχή Αποφεύγετε τη διπλή εσοχή με begin και end
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 23 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΔΟΜΩΝ ΕΛΕΓΧΟΥ Χρησιμοποιείτε κενές γραμμές μεταξύ παραγράφων: μερικά blocks δε διαχωρίζονται με ζεύγη begin και end. Ένα λογικό block πρέπει να αντιμετωπίζεται όπως οι παράγραφοι σε ένα συμβατικό κείμενο. Μορφοποιείτε με συνέπεια τα block που αποτελούνται από μία μόνο εντολή.
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 24 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΔΟΜΩΝ ΕΛΕΓΧΟΥ Στυλ για block μιας εντολής
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 25 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΔΟΜΩΝ ΕΛΕΓΧΟΥ Στις περίπλοκες εκφράσεις διαχωρείστε τις συνθήκες σε ξεχωριστές γραμμές if ( ( '0' <= InChar and InChar <= '9' ) or ( 'a' <= InChar and InChar <= 'z' ) or ( 'A' <= InChar and InChar <= 'Z' ) ) then... Αποφεύγετε εντολές τύπου goto
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 26 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ Περιορίστε το μήκος των εντολών το πόλύ στους 80 χαρακτήρες – γραμμές μεγαλύτερες από 80 χαρακτήρες είναι δύσκολα αναγνώσιμες – το όριο των 80 χαρακτήρων αποτρέπει τα πολλά επίπεδα εμφώλευσης – γραμμές μεγαλύτερες από 80 χαρακτήρες δε χωράνε σε χαρτί Α4 Χρησιμοποιείτε κενά για να βελτιώνετε την αναγνωσιμότητα των λογικών εκφράσεων Παράδειγμα μη αναγνώσιμου κώδικα: while(PathName[StartPath+Pos]<>';') and ((StartPath+Pos)<=length(PathName)) do
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 27 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ Χρησιμοποιείτε κενά για να βελτιώνετε την αναγνωσιμότητα των λογικών εκφράσεων – χρησιμοποιείτε κενά για να διαχωρίζετε τα ονόματα μεταξύ τους Παράδειγμα αναγνώσιμου κώδικα: while ( PathName[ StartPath + Pos ] <> ';' ) and (( StartPath + Pos ) <= length( PathName )) do Χρησιμοποιείτε κενά για να βελτιώνετε την αναγνωσιμότητα αναφορών σε στοιχεία πίνακα
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 28 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ Χρησιμοποιείτε κενά για να βελτιώνετε την αναγνωσιμότητα αναφορών σε στοιχεία πίνακα Παράδειγμα μη αναγνώσιμου κώδικα: GrossRate[Census[GroupID].Sex,Census[GroupID].AgeGroup] Παράδειγμα αναγνώσιμου κώδικα: GrossRate[ Census[ GroupID ].Sex, Census[ GroupID ].AgeGroup ] Χρησιμοποιείτε κενά για να βελτιώνετε την αναγνωσιμότητα ορισμάτων συναρτήσεων
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 29 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ Χρησιμοποιείτε κενά για να βελτιώνετε την αναγνωσιμότητα ορισμάτων συναρτήσεων Παράδειγμα μη αναγνώσιμου κώδικα: ReadEmployeeData(MaxEmps,EmpData,InputFile,EmpCount,InputError); Παράδειγμα μη αναγνώσιμου κώδικα: GetCensus( InputFile, EmpCount, EmpData, MaxEmps, InputError ); Στοίχιση εντολών που σχετίζονται μεταξύ τους Παράδειγμα λάθος στοίχισης: EmployeeName = InputName EmployeeSalary = InputSalary EmployeeBirthdate = InputBirthdate
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 30 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ Στοίχιση εντολών που σχετίζονται μεταξύ τους Παράδειγμα σωστής στοίχισης: EmployeeName = InputName EmployeeSalary = InputSalary EmployeeBirthdate = InputBirthdate Παράδειγμα λάθος στοίχισης: EmployeeName = InputName EmployeeAddress = InputAddress EmployeePhone = InputPhone BossTitle = Title BossDept = Department
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 31 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ Στοίχιση εντολών που σχετίζονται μεταξύ τους Παράδειγμα σωστής στοίχισης: EmployeeName = InputName EmployeeAddress = InputAddress EmployeePhone = InputPhone BossTitle = Title BossDept = Department Μορφοποίηση μη ολοκληρωμένων γραμμών: Να κάνετε εμφανές το ότι η εντολή δεν είναι ολοκληρωμένη
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 32 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ Παραδείγματα εμφανώς μη ολοκληρωμένων γραμμών:
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 33 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ Μορφοποίηση μη ολοκληρωμένων γραμμών: Να διατηρείτε μαζί στοιχεία του κώδικα που σχετίζονται μεταξύ τους όπως π.χ. αναφορές σε στοιχεία πίνακα, ορίσματα συναρτήσεων κ.α. Παράδειγμα όχι καλού διαχωρισμού γραμμής: CustomerBill := PrevBalance( PaymentHistory[ CustomerID ] ) + LateCharge( PaymentHistory[ CustomerID ] ); Παράδειγμα σωστού διαχωρισμού γραμμής: CustomerBill := PrevBalance( PaymentHistory[ CustomerID ] ) + LateCharge( PaymentHistory[ CustomerID ] );
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 34 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ Μορφοποίηση μη ολοκληρωμένων γραμμών: Χρησιμοποιείτε εσοχή για τη συνέχεια γραμμών κλήσης συναρτήσεων Παράδειγμα σωστού διαχωρισμού γραμμής: DrawLine( Window.North, Window.South, Window.East, Window.West, CurrentWidth, CurrentAttribute ); SetFontAttributes( Font.FaceName, Font.Size, Font.Bold, Font.Italic, Font.SyntheticAttribute[ FontID ].Underline, Font.SyntheticAttribute[ FontID ].Strikeout ); Ή για να τονίσουμε το όνομα της συνάρτησης: DrawLine( Window.North, Window.South, Window.East, Window.West, CurrentWidth, CurrentAttribute ); SetFontAttributes( Font.FaceName, Font.Size, Font.Bold, Font.Italic, Font.SyntheticAttribute[ FontID ].Underline, Font.SyntheticAttribute[ FontID ].Strikeout );
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 35 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ Μορφοποίηση μη ολοκληρωμένων γραμμών: Βάλτε εσοχή σε συνέχεια εντολής ελέγχου Παράδειγμα: while ( PathName[ StartPath + Pos ] != ';' ) && ( ( StartPath + Pos ) <= length( PathName ) ) {... } for ( RecNum = Employee.Rec.Start + Employee.Rec.Offset; RecNum <= Employee.Rec.Start + Employee.Rec.Offset + Employee.NumRecs; RecNum++ ) {... }
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 36 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ Μορφοποίηση μη ολοκληρωμένων γραμμών: Βάλτε εσοχή σε συνέχεια εντολών ανάθεσης πέρα από τον τελεστή ανάθεσης Παράδειγμα μη σωστού διαχωρισμού γραμμής: CustomerPurchases:= CustomerPurchases + CustomerSales( CustomerID ); CustomerBill := CustomerBill + CustomerPurchases; TotalCustomerBill := CustomerBill + PreviousBalance( CustomerID ) + LateCharge( CustomerID ); CustomerRating := Rating( CustomerID, TotalCustomerBill ); Παράδειγμα μη σωστού διαχωρισμού γραμμής: CustomerPurchases:= CustomerPurchases + CustomerSales( CustomerID ); CustomerBill := CustomerBill + CustomerPurchases; TotalCustomerBill := CustomerBill + PreviousBalance( CustomerID ) + LateCharge( CustomerID ); CustomerRating := Rating( CustomerID, TotalCustomerBill );
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 37 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ Βάζετε μόνο μία εντολή ανά γραμμή Να αποφεύγετε τα side effects (παράπλευρες επιπτώσεις της εκτέλεσης μιας εντολής) Παράδειγμα μη αποφυγής των side effects: printf( "%d %d \n", ++n, n + 2 ); Παράδειγμα σύνταξης αποφυγής των side effects: ++n; printf( "%d %d \n", n, n + 2 ); Ακραίο παράδειγμα μη αποφυγής των side effects: strcpy( char * t, char * s ) { while ( *++t = *++s ) ; }
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 38 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ Ακραίο παράδειγμα μη αποφυγής των side effects: strcpy( char * t, char * s ) { do { ++t; ++s; *t = *s; } while ( *t != ‘\0’ ); }
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 39 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ Διάταξη δηλώσεων: να χρησιμοποιείτε στοίχιση int SortBoundary; int InsertPos; SORT_STRING InsertVal; SORT_STRING LowerBoundary; Διάταξη δηλώσεων: μόνο μία δήλωση ανά γραμμή int RowIdx, ColIdx; COLOR PreviousScreen, CurrentScreen, NextScreen; POINT PreviousTop, PreviousBottom, CurrentTop, CurrentBottom, NextTop, NextBottom; FONT PreviousFace, CurrentFace, NextFace; COLOR Choices[ NUM_COLORS ];
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 40 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ Διάταξη δηλώσεων: βάζετε τις δηλώσεις σε μία λογική σειρά π.χ. ανά τύπο ή αλφαβητικά (έχει πολλή δουλειά) Διάταξη δηλώσεων: στις δηλώσεις μεταβλητών δείκτη βάζετε το αστεράκι δεξιά του τύπου εκτός και αν έχουμε περισσότερα του ενός αστεράκια EMP_LIST * Employees; FILE * InputFile;
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 41 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΠΡΟΤΕΙΝΟΜΕΝΟ ΒΙΒΛΙΟ Code Complete: A Practical Handbook of Software Construction Steve McConnell, Microsoft Press, 1993