Αμυντικός προγραμματισμός: Είναι η παράνοια ή η έξυπνη κωδικοποίηση;

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

Ο αμυντικός προγραμματισμός είναι ο μόνος πραγματικός προγραμματισμός.

Συντελεστές εικόνας: Pixabay.com

Ο αμυντικός προγραμματισμός είναι όταν ένας προγραμματιστής αναμένει προβλήματα και γράφει κώδικα για να τα αντιμετωπίσει.

Είναι σαν να βλέπετε ένα αυτοκινητιστικό δυστύχημα στο μέλλον ... .. και να παραμείνετε ήρεμοι επειδή έχετε ασφαλίσει γι 'αυτό.

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

· Αποτυχία πρόωρου: Ο κώδικας πρέπει να διασφαλίζει ότι όλες οι σημαντικές λειτουργίες τερματίζονται εκ των προτέρων, ειδικά εάν αυτές είναι υπολογιστικά δαπανηρές ή μπορεί να επηρεάσουν μη αναστρέψιμα τα δεδομένα.

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

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

Εντάξει. Μπορεί να υποστηρίξετε εδώ.

Δεν υπάρχουν προβλήματα στο παρόν. Ο κωδικός μου λειτουργεί όμορφα. Γιατί πρέπει να επενδύσω χρόνο και προσπάθεια σε ένα "μελλοντικό αναμενόμενο" πρόβλημα; Μετά από όλα, έχουμε διδαχθεί επανειλημμένα να χρησιμοποιήσουμε το "You Will not Need It" (YAGNI). Και είστε επαγγελματίας προγραμματιστής και όχι χομπίστας που μπορεί να συνεχίσει να προσθέτει στον κώδικα κατά βούληση.

Το κλειδί εδώ είναι ο πραγματισμός.

Ο Andrew Hunt στο βιβλίο του Pragmatic Programmer περιγράφει τον αμυντικό προγραμματισμό ως "Pragmatic Paranoia".

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

Ο Υγιής Παρανοϊκός Προγραμματισμός είναι ο σωστός προγραμματισμός. Αλλά η παράνοια μπορεί να ληφθεί πολύ μακριά. Το κλειδί χτυπά τη σωστή ισορροπία.

Και εδώ είναι μερικοί τρόποι για να κάνετε αμυντικό προγραμματισμό.

Ρωτήστε τον εαυτό σας: Εάν αυτό αποτύχει;

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

Για παράδειγμα, εξετάστε τον παρακάτω μη συμμορφούμενο κώδικα.

ΥΠΟΘΕΣΗ SY-INDEX. // Μη συμμορφούμενο. λείπει WHO OTHERS ρήτρα
ΠΟΤΕ ΕΝΑ.
Γράψτε "Ένα".
ΠΟΤΕ 2.
Γράψτε "Δύο".
ENDCASE.

Εδώ μπορούμε να θέσουμε τις ακόλουθες ερωτήσεις.

Τι συμβαίνει εάν το sy-index δεν είναι 1.

Τι συμβαίνει εάν ο sy-δείκτης δεν είναι 2.

Για να λύσουμε αυτό το πρόβλημα, προσθέτουμε μια δήλωση OTHERS.

ΥΠΟΘΕΣΗ SY-INDEX.
ΠΟΤΕ ΕΝΑ.
Γράψτε "Ένα".
ΠΟΤΕ 2.
Γράψτε "Δύο".
ΠΟΤΕ ΑΛΛΑ. // Συμμορφώνεται
Γράψτε το "Μη αναμενόμενο αποτέλεσμα"
ENDCASE.

Απλός. Δεν είναι;

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

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

Ελέγξτε προσεκτικά τους Όρους Ορίου.

Ο πρώτος έλεγχος είναι να εξακριβώσετε εάν χρειάζεστε μια οριακή κατάσταση, αφού τελικά οι βρόχοι είναι ακριβοί.

Οι οριακές (ή ακραίες) συνθήκες είναι εκεί όπου συμβαίνει όλη η ενέργεια. Ο βρόχος από το 0 έως το 100 και οι τιμές βρόχου 1 έως 98 είναι σχεδόν οι ίδιοι (με την προϋπόθεση ότι οι κωδικοί βέβαια δεν υπόκεινται στον κώδικα). Αλλά ο βρόχος 0 είναι όπου ο κώδικας εισέρχεται στον βρόχο, και οι συνθήκες αρχικοποίησης είναι ρυθμισμένες (και ενδεχομένως δεν έχουν ρυθμιστεί σωστά). Ομοίως, ο τελευταίος βρόχος είναι όπου τα πράγματα φεύγουν, και ό, τι έκανε ο βρόχος στις αξίες, σταματά.

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

Εξετάστε τον ακόλουθο μη συμβατό και συμβατό κώδικα. Σε αυτή την περίπτωση δεν χρειαζόμαστε βρόχο. Ένα απλό IF θα κάνει.

            Παράδειγμα μη κωδικού
DATA υπόλοιπο ΤΥΠΟΣ i.
DO 20 TIMES.
υπόλοιπο = SY-δείκτης MOD 2.
cl_demo_output => write_text ().
ΕΞΟΔΟΣ. "Noncompliant, ο βρόχος εκτελεί μόνο μία φορά. Μπορούμε να χρησιμοποιήσουμε IF
ENDDO.
          Συμβατικό παράδειγμα κώδικα
DATA υπόλοιπο ΤΥΠΟΣ i.
DO 20 TIMES.
υπόλοιπο = SY-δείκτης MOD 2.
cl_demo_output => write_text ().
ENDDO.

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

Χρησιμοποιήστε το TDD (Test Driven Development)

Η θεμελιώδης ιδέα του TDD είναι "οι πρώτες δοκιμασίες μονάδας εγγραφής, στη συνέχεια, να γράψω τον κώδικα, στη συνέχεια το refactor, και στη συνέχεια να επαναλάβω".

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

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

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

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

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

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

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

Να γράφετε πάντα βελτιστοποιημένο κώδικα.

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

Συνήθως, ένας τρόπος βέβαιης βολής για βελτιστοποίηση είναι να ενεργοποιήσετε τις βελτιστοποιήσεις που ο μεταγλωττιστής παρέχει ενσωματωμένο.

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

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

Συλλέξτε κοινές υποεκφράσεις.

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

Αντικαταστήστε τις ακριβές λειτουργίες από τις Φτηνές.

Η χειραγώγηση των συμβολοσειρών είναι πιθανώς μία από τις πιο συνηθισμένες λειτουργίες σε οποιοδήποτε πρόγραμμα. Ωστόσο, μπορεί να είναι μια δαπανηρή διαδικασία αν γίνει εσφαλμένα. Ομοίως, σε ορισμένες περιπτώσεις, μπορείτε να βελτιώσετε την απόδοση αντικαθιστώντας τον πολλαπλασιασμό με μια σειρά λειτουργιών μετατόπισης. Ακόμη και όταν αυτό είναι αποτελεσματικό (και δεν είναι πάντα) παράγει πολύ σύγχυση κώδικα. Λάβετε λοιπόν την απόφαση λαμβάνοντας υπόψη την αναγνωσιμότητα του κώδικα επίσης.

Εξαλείψτε τους βρόχους.

Οι βρόχοι είναι ως επί το πλείστον γενικά έξοδα. Προσπαθήστε να αποφύγετε βρόχους όπου αυτό είναι εφικτό αν οι επαναλήψεις δεν είναι πολλές.

Η μνήμη cache χρησιμοποιείται συχνά.

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

Ξαναγράψτε σε γλώσσα χαμηλότερου επιπέδου.

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

Θυμηθείτε στη βελτιστοποίηση, η επιλογή είναι ίσως το 90% του παιχνιδιού. Αξίζει να αφιερώσετε χρόνο για να αποφασίσετε τι κάνετε και να το κάνετε σωστά. Φυσικά: Εκεί βρίσκεται και η μαύρη μαγεία!

Και Τέλος, Μην εμπιστεύεστε κανέναν.

"Υπάρχουν γνωστά γνωστά. υπάρχουν πράγματα που γνωρίζουμε ότι γνωρίζουμε ", δήλωσε ο Donald Rumsfeld, ο υπουργός Άμυνας κατά τη διάρκεια της δεύτερης κυβέρνησης Μπους. "Γνωρίζουμε επίσης ότι υπάρχουν γνωστά άγνωστα. δηλαδή ότι γνωρίζουμε ότι υπάρχουν κάποια πράγματα που δεν γνωρίζουμε. Αλλά υπάρχουν και άγνωστα άγνωστα - αυτά που δεν γνωρίζουμε ότι δεν γνωρίζουμε. "

Ο Ράμσφελντ μιλούσε για τον πόλεμο στο Ιράκ, αλλά το ίδιο ισχύει και για τα δεδομένα. Με λίγα λόγια, αυτό σημαίνει να επαληθεύσετε όλα τα δεδομένα που δεν έχετε πλήρη έλεγχο.

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

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

Εν ολίγοις, τα εισερχόμενα δεδομένα πρέπει να είναι καθαρά αν έχετε κάποια ελπίδα ότι ο κώδικας σας θα κάνει αυτό που πρέπει να κάνει. Αν έχετε ακούσει ποτέ τη φράση "Σκουπίδια, σκουπίδια", από όπου προέρχεται.

Όπως ορθά είπε ο Edward Demming.

"Στον θεό που εμπιστευόμαστε. Όλοι οι άλλοι πρέπει να φέρουν δεδομένα. "
Σχετικά με τον Συγγραφέα-:
Ο Ravi Rajan είναι ένας παγκόσμιος διαχειριστής προγραμμάτων πληροφορικής με έδρα το Μουμπάι της Ινδίας. Είναι επίσης ένας άπληστος blogger, συγγραφέας ποίησης Haiku, ενθουσιώδης αρχαιολόγος και μανιακός ιστορίας. Συνδεθείτε με τον Ravi σε LinkedIn, Medium και Twitter.