Ένα παράδειγμα απλού προγράμματος C. Ένα παράδειγμα απλού προγράμματος σε γλώσσα C Προγράμματα σε C παραδείγματα με επεξήγηση

Από τον μεταφραστή. Έψαχνα στο Διαδίκτυο για μια απλή και εύκολα εφαρμόσιμη οδηγία για τη σύνταξη προγραμμάτων σε C++. Μια από τις επιλογές μου άρεσε και αποφάσισα να τη μεταφράσω και να τη δημοσιεύσω. Εάν αυτό το θέμα γίνει καλά αποδεκτό από τους χρήστες Habra, μπορώ να μεταφράσω άλλα σχετικά έγγραφα, καθώς και οδηγίες για τη σύνταξη κώδικα από άλλες εταιρείες.

1. Εισαγωγή

Αυτό το έγγραφο περιέχει οδηγίες για τη σύνταξη προγραμμάτων σε C++.

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

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

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

2. Οι κανόνες μπορούν να παραβιαστούν εάν υπάρχουν προσωπικές αντιρρήσεις σε αυτούς.

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

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

3 Συμβάσεις ονομασίας

3.1 Γενικές Συμφωνίεςσχετικά με την ονομασία
3. Τα ονόματα που αντιπροσωπεύουν τύπους πρέπει να γράφονται με μικτά γράμματα, ξεκινώντας με κεφαλαία.

Γραμμή, Λογαριασμός Ταμιευτηρίου

4. Τα ονόματα των μεταβλητών πρέπει να γράφονται με μικτά γράμματα, ξεκινώντας με πεζά.

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

5. Οι ονομασμένες σταθερές (συμπεριλαμβανομένων των τιμών απαρίθμησης) πρέπει να γράφονται με κεφαλαία με κάτω παύλες ως οριοθέτες.

MAX_ITERATIONS, COLOR_RED, PI
Κοινή πρακτική στην κοινότητα προγραμματιστών C++. Η χρήση τέτοιων σταθερών θα πρέπει να περιορίζεται στο ελάχιστο. Στις περισσότερες περιπτώσεις, η εφαρμογή της αξίας ως μεθόδου είναι η καλύτερη λύση:

Int getMaxIterations() // NOT: MAX_ITERATIONS = 25 (επιστροφή 25; )
Αυτή η φόρμα είναι πιο ευανάγνωστη και εγγυάται μια ενιαία διεπαφή με τις τιμές που είναι αποθηκευμένες στην κλάση.

6. Τα ονόματα των μεθόδων και των συναρτήσεων πρέπει να είναι ρήματα, γραμμένα σε μικτά γράμματα και να ξεκινούν με πεζό.

GetName(), computeTotalWidth()
Ίδιος με τον κανόνα για τις μεταβλητές, αλλά η διαφορά μεταξύ τους έγκειται στις συγκεκριμένες μορφές τους.

7. Τα ονόματα των χώρων ονομάτων πρέπει να γράφονται με πεζά.

Μοντέλο::αναλυτής, io::iomanager, κοινά::μαθηματικά::γεωμετρία
Κοινή πρακτική στην κοινότητα προγραμματιστών C++.

8. Τα ονόματα των τύπων στα πρότυπα πρέπει να ονομάζονται με ένα μόνο κεφαλαίο γράμμα.

Πρότυπο ...πρότυπο ...
Κοινή πρακτική στην κοινότητα προγραμματιστών C++. Σας επιτρέπει να διακρίνετε ονόματα προτύπων από άλλα χρησιμοποιούμενα ονόματα.

9. Οι συντομογραφίες και οι συντομογραφίες στα ονόματα πρέπει να γράφονται με πεζά γράμματα.
exportHtmlSource(); // DON'T: exportHTMLSource(); openDvdPlayer(); // NOT: openDVDPlayer();
Η χρήση κεφαλαίων μπορεί να έχει ως αποτέλεσμα τη διένεξη ονομασίας που περιγράφεται παραπάνω. Διαφορετικά, οι μεταβλητές θα ονομάζονταν dVD, hTML κ.λπ., το οποίο δεν είναι αναγνώσιμο. Ένα άλλο πρόβλημα έχει ήδη περιγραφεί παραπάνω. Όταν ένα όνομα συσχετίζεται με ένα άλλο, η αναγνωσιμότητα μειώνεται. η λέξη που ακολουθεί τη συντομογραφία δεν ξεχωρίζει όσο θα έπρεπε.

10. Οι καθολικές μεταβλητές πρέπει πάντα να χρησιμοποιούνται με τον τελεστή ανάλυσης πεδίου (::).

::mainWindow.open(), ::applicationContext.getName()
Η χρήση καθολικών μεταβλητών θα πρέπει να αποφεύγεται. Είναι προτιμότερο να χρησιμοποιείτε μονότονα.

11. Μέλη τάξης με τροποποιητήιδιωτικός θα πρέπει να εκχωρηθεί ένα επίθημα υπογράμμισης.

Κατηγορία SomeClass ( ιδιωτική: int length_; )
Εκτός από το όνομα και τον τύπο, το πεδίο εφαρμογής είναι η πιο σημαντική ιδιότητα μιας μεταβλητής. Ο ρητός καθορισμός του τροποποιητή πρόσβασης με τη μορφή υπογράμμισης εξαλείφει τη σύγχυση μεταξύ των μελών της κλάσης και των τοπικών μεταβλητών. Αυτό είναι σημαντικό επειδή οι μεταβλητές κλάσης είναι πιο σημαντικές από τις μεταβλητές μεθόδου και θα πρέπει να αντιμετωπίζονται με μεγαλύτερη προσοχή.

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

Κενό setDepth (int depth) ( depth_ = depth; )
Το πρόβλημα είναι ότι υπάρχουν δύο επιλογές για υπογράμμιση - ως επίθημα και ως πρόθεμα. Και οι δύο επιλογές χρησιμοποιούνται ευρέως, αλλά η πρώτη επιλογή συνιστάται επειδή παρέχει καλύτερη αναγνωσιμότητα. Θα πρέπει να σημειωθεί ότι ο καθορισμός του τροποποιητή πρόσβασης για τις μεταβλητές είναι μερικές φορές ένα αμφιλεγόμενο ζήτημα. Αν και φαίνεται ότι η συνιστώμενη πρακτική κερδίζει οπαδούς και γίνεται πιο κοινή μεταξύ των επαγγελματιών.

12. Οι προσαρμοσμένες μεταβλητές θα πρέπει να έχουν το ίδιο όνομα με τον τύπο τους.

Κενό setTopic(Θέμα* θέμα) // NOT: void setTopic(Τιμή θέματος*) // NOT: void setTopic(Topic* aTopic) // NOT: void setTopic(Θέμα* t) void σύνδεση(βάση δεδομένων* βάση δεδομένων) // NOT : void connect(Βάση δεδομένων* db) // NOT: void connect (Βάση δεδομένων* oracleDB)
Μειώστε την πολυπλοκότητα μειώνοντας τον αριθμό των όρων και των ονομάτων που χρησιμοποιούνται. Επίσης διευκολύνει την αναγνώριση του τύπου απλά από το όνομα της μεταβλητής.

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

Σημείο αφετηρίας, κέντρο Σημείο; Όνομα loginName;

13. Όλα τα ονόματα πρέπει να είναι γραμμένα στα αγγλικά.

14. Οι μεταβλητές με μεγάλο εύρος πρέπει να ονομάζονται μεγάλα ονόματα και αυτές με μικρό εύρος θα πρέπει να ονομάζονται σύντομα ονόματα.

Τα ονόματα των προσωρινών μεταβλητών που χρησιμοποιούνται για την αποθήκευση προσωρινών τιμών ή ευρετηρίων είναι καλύτερα να διατηρούνται σύντομα. Ένας προγραμματιστής που διαβάζει τέτοιες μεταβλητές θα πρέπει να μπορεί να υποθέσει ότι οι τιμές τους δεν χρησιμοποιούνται πέρα ​​από μερικές γραμμές κώδικα. Συνήθως αυτές είναι μεταβλητές Εγώ, ι, κ, μεγάλο, Μ, n(για ακέραιους), και επίσης ντοΚαι ρε(για σύμβολα).

15. Τα ονόματα των αντικειμένων δεν καθορίζονται ρητά.

(Λείπει η ρήτρα Νο. 16. - Σημείωση του μεταφραστή.)

3.2 Ειδικοί κανόνες ονομασίας
17. Λέξειςετοιμάσου πρέπει να χρησιμοποιείται οπουδήποτε γίνεται απευθείας πρόσβαση στο χαρακτηριστικό.

Employee.getName(); punonjës.setName(όνομα); matrix.getElement(2, 4); matrix.setElement(2, 4, value);
Κοινή πρακτική στην κοινότητα προγραμματιστών C++. Στην Java, αυτή η σύμβαση έχει γίνει περισσότερο ή λιγότερο τυπική.

18. Λέξηυπολογίζω μπορεί να χρησιμοποιηθεί σε μεθόδους που υπολογίζουν κάτι.

ValueSet->computeAverage(); matrix->computeInverse()
Ξεκαθαρίστε αμέσως στον αναγνώστη ότι πρόκειται για μια χρονοβόρα λειτουργία.

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

Vertex.findNearestVertex(); matrix.findMinElement();
Ενημερώστε τον αναγνώστη αμέσως ότι πρόκειται για μια απλή μέθοδο αναζήτησης που δεν απαιτεί πολύ υπολογισμό.

20. Λέξηαρχικοποίηση μπορεί να χρησιμοποιηθεί όταν αρχικοποιείται ένα αντικείμενο ή οντότητα.

Printer.initializeFontSet();
Θα πρέπει να προτιμάται η αμερικανική έκδοση του αρχικού z e παρά το βρετανικό αρχικό μικρόμι. Η συντομογραφία init πρέπει να αποφεύγεται.

21. Στις μεταβλητές που αντιπροσωπεύουν το GUI θα πρέπει να δοθεί ένα επίθημα που αντιστοιχεί στο όνομα του τύπου στοιχείου.

MainWindow, propertiesDialog, widthScale, loginText, leftbarScrollbar, mainForm, fileMenu, minLabel, exitButton, yesToggle, κ.λπ.
Βελτιώνει την αναγνωσιμότητα επειδή το όνομα δίνει στον χρήστη μια άμεση υπόδειξη σχετικά με τον τύπο της μεταβλητής και επομένως τους πόρους των αντικειμένων.

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

Διάνυσμα Πόντοι? τιμές int?
Βελτιώνει την αναγνωσιμότητα επειδή το όνομα δίνει στο χρήστη μια άμεση υπόδειξη σχετικά με τον τύπο της μεταβλητής και τις λειτουργίες που μπορούν να εφαρμοστούν σε αυτά τα στοιχεία.

23. Πρόθεμα n πρέπει να χρησιμοποιείται για να αναπαραστήσει τον αριθμό των αντικειμένων.

NPoints, nLines
Ο συμβολισμός λαμβάνεται από τα μαθηματικά, όπου είναι μια καθιερωμένη σύμβαση για τον προσδιορισμό του αριθμού των αντικειμένων.

24. ΕπίθημαΟχι πρέπει να χρησιμοποιείται για την ένδειξη του αριθμού οντότητας.

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

Μια άλλη καλή εναλλακτική είναι το πρόθεμα Εγώ: iTable, iEmployee. Καθιστά σαφές ότι πρόκειται για επώνυμο επαναληπτικό.

25. Οι μεταβλητές Iterator πρέπει να ονομάζονται i, j, k και τα λοιπά.

Για (int i = 0; i< nTables); i++) { : } for (vector::iterator i = list.begin(); i != list.end(); i++) ( Στοιχείο στοιχείου = *i; ... )
Η σημείωση έχει ληφθεί από τα μαθηματικά, όπου είναι μια καθιερωμένη σύμβαση για τη σημείωση επαναληπτικών.

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

26. Πρόθεμαείναι θα πρέπει να χρησιμοποιείται μόνο για μεταβλητές και μεθόδους Boolean.

IsSet, isVisible, isFinished, isFound, isOpen
Μια κοινή πρακτική στην κοινότητα ανάπτυξης C++, που μερικές φορές χρησιμοποιείται και στην Java.

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

Σε ορισμένες περιπτώσεις το πρόθεμα είναιΕίναι καλύτερα να το αντικαταστήσετε με άλλο: έχει, μπορώή πρέπει:

Bool hasLicense(); bool canEvaluate(); bool shouldSort();

27. Για τις κατάλληλες πράξεις πρέπει να χρησιμοποιούνται συμμετρικά ονόματα.

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

28. Οι συντομογραφίες στα ονόματα πρέπει να αποφεύγονται.

ComputeAverage(); // NOT: compAvg();
Ας δούμε δύο είδη λέξεων. Οι πρώτες είναι συνηθισμένες λέξεις που παρατίθενται σε λεξικά που δεν μπορούν να συντμηθούν. Μην συντομεύετε ποτέ:

Cmd αντί για εντολή cp αντί για αντιγραφή pt αντί για point comp αντί για compute init αντί για αρχικοποίηση κ.λπ.

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

HypertextMarkupLanguage αντί για html CentralProcessingUnit αντί για cpu PriceEarningRatio αντί για pe, κ.λπ.

29. Θα πρέπει να αποφεύγεται η πρόσθετη ονομασία δεικτών.

Γραμμή* γραμμή; // ΔΕΝ ΣΥΝΙΣΤΑΤΑΙ: Line* pLine; // ΔΕΝ ΣΥΝΙΣΤΑΤΑΙ: Γραμμή* linePtr;
Πολλές μεταβλητές στο C/C++ είναι δείκτες. Μόνο όταν ο τύπος ενός αντικειμένου C++ είναι ιδιαίτερα σημαντικός θα πρέπει το όνομα να τον αντικατοπτρίζει.

30. Δεν μπορείτε να δώσετε ονόματα Boolean (λογικές) μεταβλητές που περιέχουν άρνηση.

Bool isError; // IMPOSSIBLE: isNoError bool isFound; // NOT: isNotFound
Το πρόβλημα προκύπτει όταν ένα τέτοιο όνομα χρησιμοποιείται σε συνδυασμό με έναν λογικό τελεστή άρνησης, ο οποίος συνεπάγεται διπλή άρνηση. Το αποτέλεσμα δεν χρειάζεται να είναι αρνητικό !δεν βρέθηκε.

31. Οι σταθερές στις απαριθμήσεις μπορούν να έχουν ένα πρόθεμα - το κοινό όνομα του τύπου.

Αριθμός Χρώμα ( COLOR_RED, COLOR_GREEN, COLOR_BLUE );
Αυτό παρέχει πρόσθετες πληροφορίες σχετικά με το πού βρίσκεται η δήλωση, ποιες σταθερές περιγράφονται σε μία απαρίθμηση και ποια έννοια αντιπροσωπεύουν οι σταθερές.

Μια άλλη προσέγγιση είναι η αναφορά στις σταθερές με βάση τον γενικό τους τύπο: Χρώμα::ΚΟΚΚΙΝΟ, Αεροπορική εταιρεία::AIR_FRANCE, κ.λπ.

Σημειώστε ότι το όνομα enum γράφεται συνήθως στον ενικό αριθμό, για παράδειγμα: enum Χρώμα (...). Το όνομα του πληθυντικού φαίνεται καλό όταν δηλώνεται, αλλά δεν λειτουργεί καλά στην πρακτική χρήση.

32. Οι τάξεις εξαίρεσης πρέπει να έχουν επίθημαΕξαίρεση .

Class AccessException ( : )
Οι κλάσεις εξαίρεσης δεν αποτελούν πραγματικά μέρος της αρχιτεκτονικής του προγράμματος και η ονομασία τους με αυτόν τον τρόπο τις διαχωρίζει από άλλες κλάσεις.

33. Οι συναρτήσεις (μέθοδοι που επιστρέφουν τιμές) θα πρέπει να ονομάζονται ανάλογα με το τι επιστρέφουν και οι διαδικασίες θα πρέπει να ονομάζονται ανάλογα με το τι εκτελούν (μέθοδοι κενού).

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

4 Αρχεία

4.1 Αρχεία πηγής
34. Τα αρχεία κεφαλίδας C++ θα πρέπει να έχουν την επέκταση.h (προτιμάται) ή.hpp . Τα αρχεία πηγαίου κώδικα μπορεί να έχουν επεκτάσεις.c++ (συνιστάται).ΝΤΟ , .cc ή.cpp .

MyClass.c++, MyClass.h
Πρόκειται για επεκτάσεις εγκεκριμένες από το πρότυπο C++.

35. Μια κλάση πρέπει να δηλωθεί σε ένα αρχείο κεφαλίδας και να οριστεί (υλοποιηθεί) σε ένα αρχείο πηγαίος κώδικας, τα ονόματα των αρχείων είναι ίδια με το όνομα της κλάσης.

MyClass.h, MyClass.c++

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

36. Όλοι οι ορισμοί πρέπει να βρίσκονται στα αρχεία πηγαίου κώδικα.

Κατηγορία MyClass ( δημόσια: int getValue () (επιστρεφόμενη τιμή_;) // ΟΧΙ! ... ιδιωτική: int value_; )
Τα αρχεία κεφαλίδας δηλώνουν τη διεπαφή, τα αρχεία πηγαίου κώδικα την υλοποιούν. Εάν ένας προγραμματιστής χρειάζεται να βρει μια υλοποίηση, πρέπει να είναι σίγουρος ότι θα τη βρει στο αρχείο πηγαίου κώδικα.

37. Τα περιεχόμενα του αρχείου δεν πρέπει να υπερβαίνουν τις 80 στήλες.

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

38. Δεν μπορούν να χρησιμοποιηθούν ειδικοί χαρακτήρες (όπως TAB) και αλλαγές σελίδας.

Τέτοια σύμβολα προκαλούν μια σειρά προβλημάτων με προγράμματα επεξεργασίας, εξομοιωτές τερματικών και προγράμματα εντοπισμού σφαλμάτων που χρησιμοποιούνται σε προγράμματα συνεργασίας ανάπτυξης και περιβάλλοντα πολλαπλών πλατφορμών.

39. Η μη πληρότητα των διακεκομμένων γραμμών πρέπει να είναι προφανής.

ΣύνολοΆθροισμα = a + b + c + d + e; συνάρτηση (param1, param2, param3); setText("Διαίρεση μεγάλης γραμμής" "σε δύο μέρη."); για (int tableNo = 0; tableNo< nTables; tableNo += tableStep) { ... }
Οι αλλαγές σειρών εμφανίζονται όταν παραβιάζεται το όριο των 80 στηλών που περιγράφεται παραπάνω. Είναι δύσκολο να δοθούν σκληροί και γρήγοροι κανόνες για την ανάλυση, αλλά τα παραπάνω παραδείγματα δείχνουν γενικές αρχές.

Γενικά:

  • δεκαδικό διάλειμμα?
  • διάλειμμα μετά χειριστή?
  • ισοπέδωση νέα γραμμήμε την αρχή της έκφρασης στην προηγούμενη γραμμή.
4.2 Συμπεριλήψεις αρχείων
40. Τα αρχεία κεφαλίδας πρέπει να περιέχουν προστασία ένθεσης.

#ifndef COM_COMPANY_MODULE_CLASSNAME_H #define COM_COMPANY_MODULE_CLASSNAME_H: #endif // COM_COMPANY_MODULE_CLASSNAME_H
Ο σχεδιασμός σας επιτρέπει να αποφύγετε σφάλματα μεταγλώττισης. Αυτή η σύμβαση σάς επιτρέπει να βλέπετε τη θέση του αρχείου στη δομή του έργου και αποτρέπει τις διενέξεις ονομάτων.

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

#περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #include "com/company/ui/PropertiesDialog.h" #include "com/company/ui/MainWindow.h"
Οι διαδρομές συμπερίληψης δεν χρειάζεται να είναι απόλυτες. Αντ' αυτού θα πρέπει να χρησιμοποιούνται οδηγίες μεταγλωττιστή.

42. Οι οδηγίες συμπερίληψης πρέπει να τοποθετούνται μόνο στην αρχή του αρχείου.

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

5 Εκφράσεις

5.1 Τύποι
43. Οι τοπικοί τύποι που χρησιμοποιούνται σε ένα αρχείο πρέπει να δηλώνονται μόνο σε αυτό το αρχείο.

Βελτιώνει την απόκρυψη πληροφοριών.

44. Τμήματα Τάξηςδημόσιο , προστατεύονται Καιιδιωτικός πρέπει να ταξινομηθεί. Όλες οι ενότητες πρέπει να προσδιορίζονται ρητά.

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

45. Η χύτευση τύπου πρέπει να είναι σαφής. Ποτέ μην βασίζεστε σε χύτευση σιωπηρού τύπου.

FloatValue = static_cast (intValue); // NOT: floatValue = intValue;
Κάνοντας αυτό, ο προγραμματιστής δείχνει ότι γνωρίζει τη διαφορά στους τύπους και ότι η σύγχυση είναι σκόπιμη.

5.2 Μεταβλητές
46. ​​Οι μεταβλητές πρέπει να αρχικοποιούνται στον τόπο όπου δηλώνονται.

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

Int x, y, z; getCenter(&x, &y, &z);
Σε αυτές τις περιπτώσεις, είναι καλύτερο να αφήσετε τις μεταβλητές μη αρχικοποιημένες αντί να τους εκχωρήσετε οποιεσδήποτε τιμές.

47. Οι μεταβλητές δεν πρέπει ποτέ να έχουν διπλή σημασία.

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

48. Η χρήση καθολικών μεταβλητών θα πρέπει να αποφεύγεται.

Δεν υπάρχει λόγος να χρησιμοποιηθούν καθολικές μεταβλητές στη C++ (στην πραγματικότητα υπάρχει. - Σημείωση του μεταφραστή). Το ίδιο ισχύει για τις καθολικές συναρτήσεις και τις (στατικές) μεταβλητές των οποίων το εύρος είναι ολόκληρο το αρχείο.

49. Δεν πρέπει να δηλώνετε μεταβλητές κλάσης ωςδημόσιο .

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

Λάβετε υπόψη ότι οι δομές στη C++ διατηρούνται μόνο για συμβατότητα με το C. Η χρήση τους βλάπτει την αναγνωσιμότητα του κώδικα. Χρησιμοποιήστε τάξεις αντί για δομές.

(Λείπει η ρήτρα αρ. 50. - Σημείωση μεταφραστή.)

Float* x; // ΔΕΝ ΣΥΝΙΣΤΑΤΑΙ: float *x; int&y; // ΔΕΝ ΣΥΝΙΣΤΑΤΑΙ: ενθ
Το ότι μια μεταβλητή είναι δείκτης ή αναφορά αναφέρεται στον τύπο της και όχι στο όνομά της. Οι προγραμματιστές C συχνά ακολουθούν διαφορετική προσέγγιση, αλλά στη C++ είναι καλύτερα να μείνετε σε αυτή τη σύσταση.

(Λείπει η ρήτρα αρ. 52. - Σημείωση μεταφραστή.)

53. Η σιωπηρή σύγκριση Boolean (λογικών) μεταβλητών και δεικτών με μηδέν θα πρέπει να αποφεύγεται.

Αν (nLines != 0) // ΔΕΝ ΣΥΝΙΣΤΑΤΑΙ: if (nLines) if (τιμή != 0,0) // ΔΕΝ ΣΥΝΙΣΤΑΤΑΙ: εάν (τιμή)
Το πρότυπο C++ δεν εγγυάται ότι οι τιμές των μεταβλητών int και float ίσες με το μηδέν θα αντιπροσωπεύονται ως δυαδικό 0. Επίσης, με μια ρητή σύγκριση, ο τύπος που συγκρίνεται είναι ορατός.

Θα ήταν λογικό να υποθέσουμε ότι οι δείκτες δεν πρέπει επίσης να συγκρίνονται σιωπηρά με το μηδέν, για παράδειγμα, εάν (γραμμή == 0) αντί για αν (γραμμή). Το τελευταίο είναι πολύ διαδεδομένη πρακτική στη C/C++, άρα μπορεί και να χρησιμοποιηθεί.

54. Οι μεταβλητές πρέπει να δηλώνονται σε όσο το δυνατόν μικρότερο εύρος.

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

5.3 Κύκλοι
55. Δεν μπορείτε να συμπεριλάβετε εκφράσεις στη δομή for() που δεν σχετίζονται με τον έλεγχο βρόχου.

Άθροισμα = 0; // ΟΧΙ: για (i = 0, άθροισμα = 0; i< 100; i++) for (i = 0; i < 100; i++) sum += value[i]; sum += value[i];
Βελτιώστε την υποστήριξη και την αναγνωσιμότητα. Διατηρήστε τον έλεγχο του κύκλου αυστηρά ξεχωριστό από αυτό που περιέχει.

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

57. Οι βρόχοι Do-while μπορούν να αποφευχθούν.

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

Οι βρόχοι Do-while δεν είναι απολύτως απαραίτητοι. Οποιοσδήποτε τέτοιος βρόχος μπορεί να αντικατασταθεί από βρόχο while ή for.

Λιγότερες κατασκευές που χρησιμοποιούνται βελτιώνουν την αναγνωσιμότητα.

58. Αποφύγετε τη χρήσηΔιακοπή Καινα συνεχίσει σε κύκλους.

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

(Λείπει η ρήτρα Νο. 59. - Σημείωση του μεταφραστή.)

60. Για άπειρους βρόχους θα πρέπει να χρησιμοποιήσετε τη φόρμαενώ (αλήθεια) .

Ενώ (αληθές) ( : ) για (;;) ( // ΟΧΙ! : ) ενώ (1) ( // ΟΧΙ! : )
Η δοκιμή για κάποιον είναι περιττή και ανούσια. Η φόρμα για (;;) δεν είναι πολύ ευανάγνωστη. Επίσης δεν είναι προφανές ότι ο βρόχος είναι άπειρος.

5.4 Εκφράσεις υπό όρους
61. Αποφύγετε αυστηρά τις σύνθετες φράσεις. Αντίθετα, εισαγάγετε μεταβλητές boolean.

Bool isFinished = (στοιχείο Αρ< 0) || (elementNo >maxElement); bool isRepeatedEntry = elementNo == lastElement; if (isFinished || isRepeatedEntry) ( : ) // NOT: if ((στοιχείοNo< 0) || (elementNo >maxElement)|| elementNo == lastElement) ( :)
Η ρύθμιση μεταβλητών Boolean για εκφράσεις θα κάνει το πρόγραμμα να αυτο-τεκμηριωθεί. Ο σχεδιασμός θα είναι ευκολότερος στην ανάγνωση, τον εντοπισμό σφαλμάτων και τη συντήρηση.

62. Το αναμενόμενο τμήμα πρέπει να βρίσκεται στο τμήμααν , εξαίρεση - εν μέρειαλλού .

Bool isOk = readFile(fileName); αν (είναι ΟΚ) ( : ) αλλιώς ( : )
Αυτό βοηθά να διασφαλιστεί ότι οι εξαιρέσεις δεν θολώνουν την κανονική εκτέλεση. Σημαντικό για αναγνωσιμότητα και απόδοση.

63. Η συνθήκη πρέπει να τοποθετηθεί σε ξεχωριστή γραμμή.

64. Οι εκτελέσιμες εκφράσεις σε όρους και προϋποθέσεις θα πρέπει να αποφεύγονται αυστηρά.

File* fileHandle = open(fileName, "w"); if (!fileHandle) ( : ) // NOT: if (!(fileHandle = open(fileName, "w"))) ( : )
Οι εκτελέσιμες εκφράσεις σε συνθήκες περιπλέκουν την αναγνωσιμότητα. Αυτό ισχύει ιδιαίτερα για αρχάριους στην C/C++.

5.5 Διάφορα
65. Οι «μαγικοί» αριθμοί στον κωδικό πρέπει να αποφεύγονται. Αριθμοί διαφορετικοί από το 0 ή το 1 πρέπει να δηλώνονται ως ονομαστικές σταθερές.

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

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

Διπλό σύνολο = 0,0; // ΔΕΝ ΣΥΝΙΣΤΑΤΑΙ: διπλό σύνολο = 0; διπλή ταχύτητα = 3,0e8; // ΔΕΝ ΣΥΝΙΣΤΑΤΑΙ: διπλή ταχύτητα = 3e8; διπλό άθροισμα? : άθροισμα = (a + b) * 10,0;
Αυτό τονίζει τις διαφορετικές προσεγγίσεις κατά την εργασία με ακέραιους αριθμούς και αριθμούς κινητής υποδιαστολής. Από μαθηματική άποψη, αυτά τα δύο μοντέλα είναι εντελώς διαφορετικά και ασύμβατα.

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

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

Το σύστημα αριθμών και παραστάσεων C++ προέρχεται από τα μαθηματικά και θα πρέπει να τηρείτε την παραδοσιακή σημείωση όποτε είναι δυνατόν. Μεταξύ άλλων, το 0,5 είναι πιο ευανάγνωστο από το 0,5 (η πρώτη επιλογή δεν μπορεί να συγχέεται με τον αριθμό 5).

68. Οι συναρτήσεις πρέπει να προσδιορίζουν τον τύπο της τιμής επιστροφής.

Int getValue() // NOT: getValue() ( : )
Εκτός εάν ορίζεται ρητά, η C++ υποθέτει ότι η επιστρεφόμενη τιμή είναι τύπου int. Δεν πρέπει ποτέ να βασίζεστε σε αυτό, καθώς μπορεί να μπερδέψει προγραμματιστές που δεν είναι εξοικειωμένοι με αυτό.

69. Δεν πρέπει να χρησιμοποιείταιπαω σε .

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

70. Το "0" θα πρέπει να χρησιμοποιείται αντί του "NULL".

Το NULL είναι μέρος της τυπικής βιβλιοθήκης C και έχει καταργηθεί στη C++.

6 Σχεδιασμός και σχόλια

6.1 Σχεδιασμός
71. Η κύρια εσοχή πρέπει να είναι δύο κενά.

Για (i = 0; i< nElements; i++) a[i] = 0;
Μία εσοχή διαστήματος είναι αρκετά μικρή ώστε να αντικατοπτρίζει τη λογική δομή του κώδικα. Η εσοχή περισσότερων από 4 διαστημάτων καθιστά τον βαθιά ένθετο κώδικα μη αναγνώσιμο και αυξάνει την πιθανότητα να χρειαστεί να σπάσουν οι γραμμές. Οι επιλογές με 2, 3 ή 4 κενά είναι ευρέως διαδεδομένες. και 2 και 4 - ευρύτερα.

72. Τα μπλοκ κώδικα θα πρέπει να μορφοποιούνται όπως φαίνεται στο παράδειγμα 1 (συνιστάται) ή στο παράδειγμα 2, αλλά σε καμία περίπτωση όπως φαίνεται στο παράδειγμα 3. Η μορφοποίηση των συναρτήσεων και των κλάσεων θα πρέπει να ακολουθεί το παράδειγμα 2.

Ενώ (!done) ( doSomething(); done = moreToDo(); )

Ενώ (!done) ( doSomething(); done = moreToDo(); )

Ενώ (!done) ( doSomething(); done = moreToDo(); )
Το Παράδειγμα 3 χρησιμοποιεί επιπλέον padding, το οποίο εμποδίζει την οθόνη να είναι καθαρή λογική δομήκώδικας.

73. Δηλώσεις Τάξης

Κατηγορία SomeClass: δημόσια BaseClass ( δημόσια: ... προστατευμένη: ... ιδιωτική: ... )
Ιδιαίτερη συνέπεια του κανόνα που αναφέρεται παραπάνω.

74. Οι ορισμοί των μεθόδων πρέπει να μορφοποιούνται ως εξής:

Void someMethod() (...)

75. Κατασκευήαν-αλλιώς θα πρέπει να μορφοποιηθεί ως εξής:

Αν (προϋπόθεση) ( δηλώσεις; ) αν (προϋπόθεση) ( δηλώσεις; ) else (προτάσεις; ) εάν (προϋπόθεση) (δηλώσεις;) αλλιώς εάν (προϋπόθεση) (δηλώσεις; ) else (δηλώσεις;)
Απόρροια του κανόνα που αναφέρεται παραπάνω. Επιπλέον, το γράψιμο αλλούστην ίδια γραμμή με το σγουρό στήριγμα κλεισίματος του πρώτου μπλοκ δεν είναι παράνομο:

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

76. ΚύκλοςΓια θα πρέπει να μορφοποιηθεί ως εξής:

Για (αρχικοποίηση, συνθήκη, ενημέρωση) ( δηλώσεις; )
Απόρροια του κανόνα που αναφέρεται παραπάνω.

77. ΚύκλοςΓια με κενό σώμα θα πρέπει να μορφοποιηθεί ως εξής:

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

78. Κύκλοςενώ θα πρέπει να μορφοποιηθεί ως εξής:

Ενώ (προϋπόθεση) ( δηλώσεις; )
Απόρροια του κανόνα που αναφέρεται παραπάνω.

79. Κύκλοςκάνω-ενώ θα πρέπει να μορφοποιηθεί ως εξής:

Do ( δηλώσεις; ) while (condition);
Απόρροια του κανόνα που αναφέρεται παραπάνω.

80. Κατασκευήδιακόπτης θα πρέπει να μορφοποιηθεί ως εξής:

Διακόπτης (συνθήκη) (περίπτωση ABC: δηλώσεις, // Λείπει περίπτωση "διαλείμματος" DEF: δηλώσεις, διάλειμμα, περίπτωση XYZ: δηλώσεις, διακοπή, προεπιλογή: δηλώσεις, διάλειμμα; )
Σημειώστε ότι κάθε λέξη υπόθεσηέχει μια εσοχή σε σχέση με ολόκληρη τη δομή, η οποία βοηθά στην ανάδειξή της. Προσοχή επίσης στα κενά πριν από την άνω και κάτω τελεία. Εάν λείπει κάπου μια λέξη-κλειδί Διακοπή, τότε ένα σχόλιο θα πρέπει να χρησιμεύσει ως προειδοποίηση σχετικά με αυτό. Οι προγραμματιστές συχνά ξεχνούν να συμπεριλάβουν αυτή τη λέξη, επομένως η περίπτωση της σκόπιμης παράλειψής της θα πρέπει να περιγράφεται ειδικά.

81. Κατασκευήπροσπάθησε να πιάσεις θα πρέπει να μορφοποιηθεί ως εξής:

Δοκιμάστε ( δηλώσεις; ) catch (Εξαίρεση& εξαίρεση) ( δηλώσεις; )
Απόρροια του κανόνα που αναφέρεται παραπάνω. Ερωτήσεις σχετικά με το κλείσιμο σγουρά τιράντες σε μια κατασκευή αν-αλλιώς, κάντε αίτηση και εδώ.

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

Αν (συνθήκη) δήλωση? ενώ (συνθήκη) δήλωση? για (αρχικοποίηση, συνθήκη, ενημέρωση) δήλωση.
Συνιστάται ακόμα να μην παραλείπετε τα σγουρά σιδεράκια.

83. Ο τύπος επιστροφής μιας συνάρτησης μπορεί να βρίσκεται πάνω από το όνομα της ίδιας της συνάρτησης.

Άκυρο MyClass::myMethod(void) ( : )
Με αυτόν τον τρόπο οι συναρτήσεις ευθυγραμμίζονται σε μία στήλη.

6.2 Χώροι
84.

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

A = (b + c) * d; // ΔΕΝ ΣΥΝΙΣΤΑΤΑΙ: a=(b+c)*d ενώ (αληθές) // ΔΕΝ ΣΥΝΙΣΤΑΤΑΙ: while(true) (... doSomething(a, b, c, d); // ΔΕΝ ΣΥΝΙΣΤΑΤΑΙ: doSomething (α, β, γ, δ) περίπτωση 100: // ΔΕΝ ΣΥΝΙΣΤΑΤΑΙ: περίπτωση 100: για (i = 0; i);< 10; i++) { // НЕ РЕКОМЕНДУЕТСЯ: for(i=0;i<10;i++){ ...
Επισημαίνει μεμονωμένα μέρη εκφράσεων. Βελτιώνει την αναγνωσιμότητα. Είναι δύσκολο να δώσουμε ένα ολοκληρωμένο σύνολο προτάσεων σχετικά με το κενό διάστημα στην C++. Οι παραπάνω συστάσεις πρέπει να δείχνουν γενικές αρχές.

85. Τα ονόματα των μεθόδων μπορεί να ακολουθούνται από ένα κενό εάν ακολουθεί άλλο όνομα.

DoSomething(currentFile);
Επισημαίνει μεμονωμένα ονόματα. Βελτιώνει την αναγνωσιμότητα. Εάν δεν υπάρχει άλλο όνομα, το διάστημα μπορεί να παραλειφθεί (doSomething()).

Μια άλλη προσέγγιση είναι να ορίσετε ένα διάστημα αμέσως μετά την αρχική παρένθεση. Όσοι το χρησιμοποιούν συνήθως βάζουν ένα κενό πριν από την παρένθεση κλεισίματος: doSomething(currentFile);. Αυτό επιτρέπει την επισήμανση μεμονωμένων ονομάτων. Το διάστημα πριν από την παρένθεση κλεισίματος φαίνεται αφύσικο, αλλά χωρίς αυτό η έκφραση φαίνεται ασύμμετρη (doSomething(currentFile);).

86. Τα λογικά μπλοκ στον κώδικα πρέπει να χωρίζονται με μια κενή γραμμή.

Matrix4x4 matrix = new Matrix4x4(); διπλό cosAngle = Math.cos(γωνία); double sinAngle = Math.sin(γωνία); matrix.setElement(1, 1, cosAngle); matrix.setElement(1, 2, sinAngle); matrix.setElement(2, 1, -sinAngle); matrix.setElement(2, 2, cosAngle); πολλαπλασιάζω (μήτρα);
Βελτιώνει την αναγνωσιμότητα.

Αυτό τους επιτρέπει να ξεχωρίζουν καλύτερα.

88. Οι μεταβλητές στις δηλώσεις μπορούν να ευθυγραμμιστούν.

Αρχείο AsciiFile*; int nPoints; float x, y;
Βελτιώνει την αναγνωσιμότητα. Τα ζευγάρια φαίνονται πιο καθαρά τύπος - μεταβλητή.

89. Χρησιμοποιήστε τη στοίχιση όπου βελτιώνεται η αναγνωσιμότητα.

Αν (a == lowValue) compueSomething(); αλλιώς εάν (a == mediumValue) computeSomethingElse(); αλλιώς εάν (a == highValue) computeSomethingElseYet(); τιμή = (δυναμικό * Πυκνότητα λαδιού) / σταθερά1 + (βάθος * Πυκνότητα νερού) / σταθερά2 + (zΣυντονιστικήΤιμή * Πυκνότητα αερίου) / σταθερά3; minPosition = computeDistance(min, x, y, z); μέσηΘέση = υπολογισμός Απόσταση(μέσος όρος, x, y, z); διακόπτης (τιμή) (περίπτωση PHASE_OIL: strcpy(φάση, "Λάδι"); θραύση; θήκη PHASE_WATER: strcpy(φάση, "Νερό"); θραύση; θήκη PHASE_GAS: strcpy(φάση, "Αέριο"); θραύση; )
Υπάρχουν πολλές περιπτώσεις όπου ο κώδικας μπορεί να ευθυγραμμιστεί περαιτέρω, ακόμη και αν παραβαίνει προηγουμένως καθορισμένους κανόνες.

6.3 Σχόλια
90. Ο σύνθετος κώδικας που γράφτηκε με έξυπνα κόλπα δεν πρέπει να σχολιάζεται, αλλά να ξαναγράφεται!

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

91. Όλα τα σχόλια πρέπει να είναι γραμμένα στα αγγλικά.

Σε ένα διεθνές περιβάλλον, τα αγγλικά είναι η προτιμώμενη γλώσσα.

92. Χρήση//για όλα τα σχόλια, συμπεριλαμβανομένων των πολλών γραμμών.
// Ένα σχόλιο που εκτείνεται // πολλαπλές γραμμές.
Εάν ακολουθήσετε αυτήν τη σύσταση, κάντε σχόλια σε πολλές γραμμές /* */ μπορεί να χρησιμοποιηθεί για εντοπισμό σφαλμάτων και άλλους σκοπούς.

Μετά // θα πρέπει να βάλετε ένα κενό και το ίδιο το σχόλιο θα πρέπει να ξεκινά με κεφαλαίο γράμμα και να τελειώνει με τελεία.

93. Τα σχόλια πρέπει να διατάσσονται έτσι ώστε να σχετίζονται με αυτό που περιγράφουν.

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

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

Παρόμοια εργαλεία υπάρχουν στη C++. Ακολουθούν τις ίδιες συμβάσεις σύνταξης ετικετών με το JavaDoc (δείτε για παράδειγμα Doc++ ή Doxygen).

7 Σύνδεσμοι

  • Ολοκληρώθηκε ο κώδικας, Steve McConnell - Microsoft Press
  • Programming in C++, Rules and Recommendations, M Henricson, e. Nyquist, Ellemtel (Σουηδική τηλεπικοινωνία):

Ας δώσουμε μερικές εξηγήσεις. Στη γλώσσα C, κάθε πρόγραμμα αποτελείται από πολλές ενότητες προγράμματος και καθεμία από αυτές είναι μια συνάρτηση. Οι συναρτήσεις στο C είναι παρόμοιες με τις συναρτήσεις ή τις υπορουτίνες στο Fortran ή οι διαδικασίες στο Pascal επιλέγονται αυθαίρετα (μόνο με λατινικά γράμματα), αλλά ένα από αυτά κύριος, εδώ ξεκινά η εκτέλεση του προγράμματος. Μια τέτοια κύρια συνάρτηση συνήθως καλεί άλλες συναρτήσεις που βρίσκονται στο ίδιο αρχείο με το κύριο πρόγραμμα ή ανακτώνται από μια βιβλιοθήκη προεκπαιδευμένων συναρτήσεων κύριοςδεν έχει επιχειρήματα, οπότε η λίστα του μοιάζει με αυτό: () . Στηρίγματα { } πλαισιώνουν τους τελεστές που υλοποιούν τον ίδιο τον αλγόριθμο. Αυτές οι παρενθέσεις είναι παρόμοιες με το BEGIN - END στο Pascal.
Γραμμή int a,b,c;ανακοινώνει αλφάβητομεταβλητές ακέραιου τύπου. Όλες οι μεταβλητές που χρησιμοποιούνται στο πρόγραμμα πρέπει να δηλωθούν. Στη συνέχεια έρχονται οι τελεστές ανάθεσης έναέννοια 5 , και στο σι - 7 , Με- την αξία του αθροίσματος τους. Πληκτρολογήστε τιμές μεταβλητών ενθβρίσκονται στην περιοχή [-32768; 32767]. Λειτουργία printfοθόνες: SUM = 12.

Ας εξετάσουμε τώρα τη συνάρτηση scanfσχεδιασμένο για μορφοποιημένη εισαγωγή δεδομένων. Λειτουργία scanfχρησιμοποιεί μεταβλητές διευθύνσεις αντί για τις τιμές τους ως πραγματικές παραμέτρους. Για να το κάνετε αυτό, τοποθετήστε το σύμβολο μπροστά από την αντίστοιχη παράμετρο & - σύμβολο για τη λήψη μιας διεύθυνσης. Για παράδειγμα, &XLσημαίνει "μεταβλητή διεύθυνση XL", όχι την τιμή που έχει αυτή τη στιγμή η μεταβλητή.

Συμβολοσειρά μορφής συνάρτησης scanfκαθορίζει ποια δεδομένα αναμένονται ως είσοδο. Εάν μια συνάρτηση συναντήσει το σύμβολο στη συμβολοσειρά μορφοποίησης % ακολουθούμενο από έναν χαρακτήρα μετατροπής, θα παραλείψει χαρακτήρες μέχρι να συναντήσει έναν μη κενό χαρακτήρα.

Το προηγούμενο πρόγραμμα έχει ένα μειονέκτημα: το πρόγραμμα για τον υπολογισμό του αθροίσματος είναι κατάλληλο μόνο για μια συγκεκριμένη περίπτωση, όταν a=5, b=7. Ας το βελτιώσουμε αντικαθιστώντας τους αντίστοιχους τελεστές εκχώρησης με μια κλήση συνάρτησης scanf(παράδειγμα 1.2) :

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

Ετικέτες: Το πρώτο πρόγραμμα στο Γ. Βασικά Σι Μπόρλαντ. Γρανάζια κωδικού C. Si Embarcadero. C MS Visual Studio. C MS Express.

Γράφοντας το πρώτο μας πρόγραμμα C

Πρώτα, πρέπει να εγκαταστήσετε το λογισμικό. Καταρχήν, δεν έχει σημασία τι λογισμικό χρησιμοποιείτε, όπως και το λειτουργικό σύστημα δεν είναι σημαντικό. Αλλά σε όλη τη διάρκεια του μαθήματος θα δώσω παραδείγματα χρησιμοποιώντας το MS Visula Studio 2012 Express Edition. Το Visual Studio 2012 Express Edition είναι δωρεάν και αρκεί για τη μελέτη ολόκληρου του μαθήματος. Επιπλέον, όπως έχει δείξει η πρακτική, είναι πολύ πιο αυστηρός σχετικά με τον κώδικα και παρέχει μια πληρέστερη περιγραφή των σφαλμάτων και των προειδοποιήσεων. Όταν μαθαίνετε μια γλώσσα, μπορείτε να χρησιμοποιήσετε το Borland (γνωστό και ως CodeGEAR, γνωστό και ως Embarcadero, κ.λπ.), Dev Cpp, MinGW ή gcc, ή οτιδήποτε άλλο θέλετε.

Παράδειγμα για το MS Visual Studio

1. Ανοίξτε το IDE, μεταβείτε στο Αρχείο | Δημιουργία έργου...

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

4. Επιλέξτε το πλαίσιο ελέγχου "Κενό έργο".

5. Μετά από αυτό παίρνουμε μια κενή δομή έργου. Προσθέστε ένα νέο στοιχείο: κάντε δεξί κλικ στον φάκελο
"Αρχεία πηγαίου κώδικα" | Προσθήκη | Δημιουργία στοιχείου...

Προσθέστε ένα νέο αρχείο cpp, αλλά αποθηκεύστε το με την επέκταση .c

Ονόμασα το αρχείο main.c Όλα είναι έτοιμα, μπορείτε να γράψετε το πρόγραμμα. βήματα για άλλες πλατφόρμες.

Borland

Έχω εγκαταστήσει μόνο το Code Gear C++Builder 2007, αλλά σε άλλες (και προηγούμενες) εκδόσεις όλα γίνονται το ίδιο.

1. Ας δημιουργήσουμε ένα νέο έργο Αρχείο | Νέο | Αλλα...

2. Προσθέστε μια εφαρμογή κονσόλας

3. Επιλέξτε τη γλώσσα C

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

Παράδειγμα για cc/gcc για τερματικό

Ανοίξτε το αγαπημένο σας πρόγραμμα επεξεργασίας κειμένου και αντιγράψτε τον κώδικα του προγράμματος εκεί.

#περιλαμβάνω int main(int argc, char* argv) ( printf("Hello, World!"); scanf("1"); return 0; )

Εάν αποθηκεύσατε το πρόγραμμα σε ένα αρχείο που ονομάζεται hello.c, τότε πληκτρολογήστε την εντολή στο τερματικό

Κοιν γεια.γ -ο γεια

Gcc γεια -ο γεια

Σε αυτήν την περίπτωση, προφανώς, πρέπει να βρίσκεστε στο φάκελο με το πρόγραμμα. Το gcc θα δημιουργήσει ένα εκτελέσιμο αρχείο που ονομάζεται hello. Εκτελέστε το και θα βγει Hello, World!

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

Chmod 760 γεια σας

Εάν έχετε πολλά αρχεία, θα πρέπει να αναφέρετε τα ονόματα όλων των αρχείων με τη σειρά. Για παράδειγμα, εάν έχετε δύο ακόμη αρχεία simple.h και simple.c, τότε πρέπει να γράψετε

CC γεια.γ απλό.γ -ο γεια

Κωδικός προγράμματος

Συνηθίζεται στο πρώτο πρόγραμμα να εμφανίζεται το Hello, World! στην οθόνη.

#περιλαμβάνω #περιλαμβάνω int main(int argc, char* argv) ( printf("Hello, World!"); _getch(); return 0; )

Εκτελέστε το πρόγραμμα (Εκτέλεση | Εκτέλεση ή F9 για Borland, Build | Build Solution ή F5 για MS) Το πρόγραμμα θα εμφανίσει Hello, World! και θα περιμένει να πατήσετε οποιοδήποτε πλήκτρο.

Ας δούμε τον κώδικα με περισσότερες λεπτομέρειες. Οι δύο πρώτες γραμμές

#περιλαμβάνω #περιλαμβάνω

οδηγίες προς τον μεταγλωττιστή για τη σύνδεση των τυπικών βιβλιοθηκών stdio (Τυπική έξοδος εισόδου) και conio (Έξοδος εισόδου κονσόλας). Η επέκταση .h υποδεικνύει ότι πρόκειται για αρχεία κεφαλίδας. Ο μεταγλωττιστής αντιγράφει τον κώδικα των βιβλιοθηκών conio και stdio και καθιστά δυνατή τη χρήση των συναρτήσεων που περιγράφονται σε αυτές τις βιβλιοθήκες.

Int main (int argc, char* argv)

Αυτή είναι η κύρια λειτουργία. Διαφέρει από άλλες λειτουργίες που μπορείτε να ορίσετε στο ότι είναι ένα σημείο εισόδου - η εκτέλεση του προγράμματος ξεκινά από αυτό.

Η κύρια συνάρτηση έχει δύο παραμέτρους - τον αριθμό των παραμέτρων argc και τον πίνακα των παραμέτρων που έχουν περάσει argv. Αυτά τα ορίσματα είναι προαιρετικά, επομένως δεν χρειάζεται να τα γράψετε. Θα μιλήσουμε για τη χρήση τους αργότερα.

#περιλαμβάνω #περιλαμβάνω int main() ( printf("Hello, World!"); _getch(); return 0; ) Η κύρια συνάρτηση πρέπει να επιστρέψει έναν ακέραιο αριθμό. Εάν είναι 0, τότε η συνάρτηση λειτούργησε χωρίς σφάλματα. Στο σύγχρονο πρότυπο C, δεν μπορείτε να επιστρέψετε το 0 και να περιγράψετε τη συνάρτηση ως void main. #περιλαμβάνω #περιλαμβάνω void main() ( printf("Hello, World!"); _getch(); ) Το πρόγραμμά μας τώρα φαίνεται πολύ απλό. Γραμμή printf("Γεια, Κόσμος!"); εκτυπώνει τη γραμμή Hello, World! στην οθόνη της οθόνης. Η _getch() περιμένει για ένα πάτημα πλήκτρου.

Ας κάνουμε κάτι πιο περίπλοκο για να μάθουμε πώς να προσθέτουμε νέα αρχεία στο πρόγραμμα. Τώρα είναι σημαντικό να μάθετε πώς να προσθέτετε νέα αρχεία εάν μέρος του κώδικα παραμένει ασαφές, δεν έχει σημασία.
1. Δημιουργήστε ένα νέο αρχείο κεφαλίδας στο φάκελο "Αρχεία κεφαλίδας", ονομάστε το simple.h
2. Δημιουργήστε ένα νέο αρχείο simple.c στο φάκελο Source Files.
3. Προσθήκη στο απλό.η

#ifndef _SIMPLE_H_ #define _SIMPLE_H_ #include #περιλαμβάνω void doSomething(); #τέλος εαν

Εδώ έχουμε δηλώσει μια νέα συνάρτηση doSomething. Δεν έχει σώμα, θα περιγραφεί στο αρχείο simple.c. Εδώ συμπεριλαμβάνουμε επίσης τις βιβλιοθήκες stdio και conio
Προσθήκη στο απλό .γ

#include "simple.h" void doSomething() ( printf("Λειτουργεί!"); _getch(); )

Περιλαμβάνουμε ένα αρχείο κεφαλίδας στο simple.c. Είναι γραμμένο σε διπλά εισαγωγικά γιατί δεν είναι τυπικό αρχείο βιβλιοθήκης. Τα τυπικά αρχεία βιβλιοθήκης βρίσκονται συνήθως στον φάκελο περιλαμβάνει του ίδιου του IDE. Αν τοποθετήσουμε εκεί τα αρχεία μας, μπορούν να δηλωθούν και σε αγκύλες. Μπορείτε επίσης να χρησιμοποιήσετε απόλυτες διαδρομές αρχείων σε διπλά εισαγωγικά. Εφόσον έχουμε ήδη συμπεριλάβει τις βιβλιοθήκες conio και stdio στο αρχείο .h, είναι «ορατές» στο αρχείο .c.
Στη συνέχεια, στο main.c