Conseils de programmation orientée objet

Un article de Haypo.

Retour à la page programmation

J'ai programmé en C++, puis Python et un peu de Java, pendant un bout de temps. On m'a souvent demandé des conseils de programmation. Je me propose donc de les exposer ici.

Sommaire

[modifier] Usage du mot-clé const

[modifier] Utilité du mot-clé const

Le mot-clé const est utile pour deux choses. On indique que la fonction ne va modifier un paramètre/une classe, et qu'on peut donc utiliser cette fonction sans effet de bord. Ensuite, le mot-clé const aide le compilateur à optimiser le code.

Le mot-clé const peut servir à différents endroits. Exemples :

 (1) void affiche(const Objet x);
 (2) int Annuaire::litTaille() const;
 (3) string Annuaire::litPrenom(const string nom) const;

Dans le premier cas (1), on indique que l'argument d'une fonction est constant, qu'on ne va pas modifier cet argument dans la fonction.

Dans le second cas (2), on indique que la méthode ne va pas toucher au contenu de la classe. C'est utile pour une méthode d'accès en lecture à une classe, ou une méthode qui ne fait qu'afficher un résultat.

Enfin, dans le troisième cas (3), on cumule les deux propriétés.

[modifier] Les désavantages du mot-clé const

Le soucis est que le mot-clé const est "contagieux". Lorsqu'on passe un objet en argument en indiquant qu'il est constant, seules ses méthodes constantes sont autorisées !

 class Personne { 
   ... 
   string litNom(); 
   string litPrenom(); 
   void affiche() const;
 };
 void Personne::affiche() const
 {
    std::cout << litNom() << " " << litPrenom() << std::endl;
 }

Il donc modifier la classe de cette manière :

 class Personne {
   ... 
   string litNom() const;
   string litPrenom() const;
   void affiche() const;
 };

[modifier] Utiliser les références (C++)

[modifier] Passer un variable en paramètre par référence

Le langage C++ permet de gêrer plus simplement les pointeurs que le langage C, grâce à l'utilisation des références. Exemple :

 void calculeSomme_C (int a, int b, int *c) { *c = a + b; }
 void calculeSomme_CPP (int a, int b, int &c) { c = a + b; }

Il est également vivement conseillé de passer les (gros) objets par référence, pour éviter qu'ils soient copier. Imaginer un tableau de 1000 éléments de 10 Ko chaqun. Si on passe l'objet en argument par copier, il faudra copier 10 Mo à chaque fois ! C'est très embêtant. Il suffit d'ajouter un "&" et c'est joué !

 double calculeMoyenne (ListeNote liste);

devient

 double calculeMoyenne (const ListeNote &liste);

[modifier] Référence utilisée comme abréviation

La version C++ est beaucoup plus lisible car on se passe de l'étoile précédent le paramètre c. Mais, les références peuvent également servir à abréger un bout de code :

 void affichePersonne (const string nom)
 {
    std::cout << annuaire.cherchePersonne(nom).nom_complet
              << " : "
              << annuaire.cherchePersonne(nom).telephone
              << " : "
              << annuaire.cherchePersonne(nom).email
              << std::endl;
 }

devient

 void affichePersonne (const string nom)
 {
    Personne &p = annuaire.cherchePersonne(nom);
    std::cout << p.nom_complet
              << " : "
              << p.telephone
              << " : "
              << p.email
              << std::endl;
 }

La différence par rapport à "Personne p = annuaire.cherchePersonne(nom);" est qu'on évite une copie. Imaginez qu'on connaisse le nom, prénom, email, téléphone, … d'une personne : et bien, il faudrait copier chaque information, ce qui est tout à fait inutile.