Ονοματολογία

Η επιλογή των ονομάτων (των αρχείων, των μεταβλητών, των συναρτήσεων, κ.λ.π.) είναι από τα πιο σημαντικά στοιχεία που κάνουν τον πηγαίο κώδικα κατανοητό. Ο τρόπος με τον οποίο γράφουμε ένα όνομα μπορεί να μας πληροφορήσει άμεσα τί αντιπροσωπεύει η οντότητα αυτή όπως αν είναι μεταβλητή, συνάρτηση, σταθερά, κ.λ.π., χωρίς να χρειάζεται να αναζητήσουμε την δήλωση της οντότητας αυτής. Ακόμα τα ονόματα θα πρέπει να έχουν νόημα και να δίνουν στο προγραμματιστή την δυνατότητα να κατανοήσει και να διαβάσει τον πηγαίο κώδικα με ευκολία. Ένα όνομα το οποίο φαίνεται χαριτωμένο ή δακτυλογραφείται εύκολα μπορεί αργότερα να προκαλέσει προβλήματα σε κάποιον που προσπαθεί να κατανοήσει τον κώδικα. Ο πηγαίος κώδικας διαβάζεται πολλές φορές ενώ γράφεται μόνο μία. Γι` αυτό το λόγο η επιλογή της ονοματολογίας παίζει καθοριστικό ρόλο και το όνομα μιας μεταβλητής θα πρέπει να περιγράφει πλήρως και με ακρίβεια την μεταβλητή που αντιπροσωπεύει ([1],[2], [3]).

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

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

Γενικοί κανόνες ([3],[1],[4],[5],[6])

  • Μια αποτελεσματική τεχνική για την εύρεση αντιπροσωπευτικών ονομάτων είναι η δήλωση με λόγια τι αντιπροσωπεύει η μεταβλητή.

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

int price_count_reader; // No abbreviation. int num_errors; // "num" is a widespread convention. int num_dns_connections; // Most people know what "DNS" stands for. int n; // Meaningless. int nerr; // Ambiguous abbreviation. int n_comp_conns; // Ambiguous abbreviation. int wgc_connections; // Only your group knows what this stands for. int pc_reader; // Lots of things can be abbreviated "pc". int cstmr_id; // Deletes internal letters. int temp; // Is it temperature? Is it temporary?
  • Το μήκος μια μεταβλητής θα πρέπει να αντικατοπτρίζει και την εμβέλεια της. Μια τοπική μεταβλητή έχει περιορισμένη εμβέλεια, επομένως και το όνομα δεν χρειάζεται να είναι και πολύ περιγραφικό. Αντιθέτως μία παγκόσμια μεταβλητή, η εμβέλεια της οποίας είναι ευρεία, θα πρέπει να έχει ένα αντιπροσωπευτικό και περιγραφικό όνομα για να ξεχωρίζει.

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

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

for (window_index = 0; window_index <= window_count; ++window_index) { ... }

Κανόνες ονοματολογίας

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

Αρχεία

  • Για τα αρχεία διαλέγουμε ένα όνομα το οποίο αντικατοπτρίζει το περιεχόμενο του αρχείου.
  • Τα ονόματα των αρχείων θα πρέπει να είναι όλα πεζά και μπορεί να περιλαμβάνουν την κάτω παύλα (_) ή την άνω παύλα (-).
  • Τα αρχεία προγραμμάτων της c++ θα πρέπει να τελειώνουν σε .cpp και της σε C θα πρέπει να τελειώνουν σε .c ενώ τα αρχεία κεφαλίδων θα πρέπει να τελειώνουν σε .h
my_useful_class.cpp my-useful-class.cpp myusefulclass.h myusefulclass_test.h

Defines & Macros

  • Οι δηλώσεις επεξεργαστή και οι μακροεντολές θα πρέπει να είναι με κεφαλαία γράμματα. Ακόμα οι δηλώσεις επεξεργαστή για τα αρχεία θα πρέπει να τελειώνουν με κάτω παύλα (_).
#ifndef MODULE_NAME_FILE_NAME_HPP_ #define MODULE_NAME_FILE_NAME_HPP_ // the code #endif // MODULE_NAME_FILE_NAME_HPP_

Μεταβλητές

  • Τα ονόματα των μεταβλητών (αγγλ. variables} είναι όλα πεζά, με παύλες μεταξύ των λέξεων.
  • Για τις παγκόσμιες μεταβλητές δεν υπάρχουν κάποιες ειδικές απαιτήσεις, μιας και η χρήση τους είναι σπάνια, αλλά σε κάθε περίπτωση αν χρησιμοποιείται κάποια, καλό θα ήταν να ξεχωρίζεται προτάσσοντας ένα g_ ή κάποιο άλλο χαρακτηριστικό το οποίο θα τις ξεχωρίζει από τις τοπικές μεταβλητές.
string table_name; // OK - uses underscore. string tableName; // Bad - mixed case. int g_a_global_variable;

Συναρτήσεις

  • Οι συναρτήσεις (αγγλ. functions) θα πρέπει να είναι camelCased1 και οι μεταβλητές να είναι όλες πεζές, με κάτω παύλες (_) μεταξύ των λέξεων.
  • Ο τύπος επιστροφής της κάθε συνάρτησης θα πρέπει να τοποθετείται σε διαφορετική γραμμή.
  • Πρέπει να διαλέγετε ως όνομα ένα ρήμα το οποίο αντανακλά την δράση της συνάρτησης. Καλό είναι να επιλέγονται ονόματα τα οποία αντανακλούν στοιχεία του προβλήματος και όχι την επίλυση του προβλήματος.
int applyExample (int example_arg); void checkForErrors();

Ονόματα τύπων

  • Τα ονόματα των τύπων (αγλλ. type names) είναι CamelCased. Δηλαδή ξεκινούν με κεφαλαίο γράμμα και κάθε νέα λέξη να ξεκινά επίσης με κεφαλαίο, χωρίς να προηγείται κάτω παύλα (_).
// classes and structs class UrlTable { ... class UrlTableTester { ... struct UrlTableProperties { string name; int num_entries; } // typedefs typedef hash_map<UrlTableProperties *, string> PropertiesMap; // enums enum UrlTableErrors { ...

Δομές

  • Τα μέλη μίας δομής πρέπει να ονομάζονται σαν κανονικές μεταβλητές.
struct UrlTableProperties { string name; int num_entries; }

Enum

  • Τα μέλη των απαριθμητών (αγγλ. enumerations) θα πρέπει να είναι κεφαλαία, με παύλες μεταξύ των λέξεων. Με τα κεφαλαία γράμματα οι σταθερές αυτές ξεχωρίζουν σε ένα πρόγραμμα και δεν μπερδεύονται με τις απλές μεταβλητές.
enum Color { COLOR_RED, COLOR_GREEN, COLOR_BLUE };

Κλάσεις (1)

  • Τα τμήματα μιας κλάσης πρέπει να ταξινομούνται ως: δημόσια, προστατευμένα (αγγλ.public, protected) και ιδιωτικά (αγλλ. private). Έτσι οι προγραμματιστές που θέλουν απλώς να χρησιμοποιήσουν την κλάση να μην χρειάζεται να διαβάζουν και τα ιδιωτικά μέλη της κλάσης.

  • Τα ιδιωτικά μέλη των κλάσεων είναι όπως και οι απλές μεταβλητές, μόνο που τελειώνουν με κάτω παύλα (_). Επισημαίνοντας το εύρος χρησιμοποιώντας κάτω παύλα καθιστά εύκολο τον διαχωρισμό τον μεταβλητών των κλάσεων από τοπικές μεταβλητές που χρησιμοποιούνται.

class ExampleClass { public: ... protected: ... private: int example_name_; }

Κλάσεις (2)

  • Μία κλάση πρέπει δηλώνετε σε ένα αρχείο επικεφαλίδας (αγγλ. header file) και να ορίζεται σε ένα πηγαίο αρχείο (αγγλ. source file) όπου τα ονόματα των αρχείων ταιριάζουν με το όνομα της κλάσης καθιστώντας εύκολη την εύρεση των αντίστοιχων αρχείων. Το αρχείο επικεφαλίδας πρέπει να ορίζει μία διεπαφή, και το πηγαίο αρχείο να την υλοποιεί.
  • Τα αρχεία που υλοποιούν τις κλάσεις έχουν κατάληξη .hpp .
  • Οι συναρτήσεις ερωτημάτων (αγγλ. accessors,mutators ή συναρτήσεις get και set) πρέπει να ταιριάζουν με το όνομα της μεταβλητής που προελαύνουν.
class ExampleClass { public: ... int getNumEntries() const { return num_entries_; } void setNumEntries (int num_entries) { num_entries_ = num_entries; } protected: ... private: int num_entries_; int example_name_; }

Υπο-φάκελοι

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

Υπο-φάκελος Περιεχόμενα
include Τα αρχεία κεφαλίδων.
include/impl/ Τα αρχεία που υλοποιούν τις κλάσεις.
src Τα πηγαία αρχεία που χρειάζονται για την μεταγλώττιση του προγράμματος.
build Τα εκτελέσιμα αρχεία του προγράμματος.
doc Τα αρχεία τεκμηρίωσης του προγράμματος.
1. CamelCase είναι η πρακτική της γραφής σύνθετων λέξεων ή φράσεων, έτσι ώστε κάθε λέξη ή σύντμηση να αρχίζει με ένα κεφαλαίο γράμμα. Αυτό επιτρέπει την μείωση του μεγέθους των φράσεων μιας και δεν χρησιμοποιούνται κενά ή κάποιοι άλλοι ειδικοί χαρακτήρες μεταξύ των λέξεων (π.χ. "_" ανάμεσα στις λέξεις ([7],[8])

1David H. Leserman, FX-ALPHA C and C++ Coding Conventions,
2Taligent Inc, Taligent Documentation,
3Google, Google C++ Style Guide,
4Geotechnical Software Services, C++ Programming Style Guidelines,
5Sutter, Herb and Alexandrescu, Andrei, C++ coding standards: 101 rules, guidelines, and best practices, Pearson Education, 2004.
6Kernighan, B.W. and Ritchie, D.M., The C Programming Language, Prentice Hall, 1988.
7Wikipedia, CamelCase --- {W}ikipedia{,} The Free Encyclopedia,
8YoLinux.com, C++ Coding Practices, Style, Standards and document generation (dOxygen),





results matching ""

    No results matching ""