Quelque chose que je me suis souvent retrouvé à faire ces derniers temps est de déclarer des typedefs pertinents pour une classe particulière à l'intérieur de cette classe, c'est-à-dire
class Lorem
{
typedef boost::shared_ptr<Lorem> ptr;
typedef std::vector<Lorem::ptr> vector;
//
// ...
//
};
Ces types sont ensuite utilisés ailleurs dans le code:
Lorem::vector lorems;
Lorem::ptr lorem( new Lorem() );
lorems.push_back( lorem );
Raisons pour lesquelles je l'aime:
- Il réduit le bruit introduit par les modèles de classe,
std::vector<Lorem>
devientLorem::vector
, etc. - Il sert de déclaration d'intention - dans l'exemple ci-dessus, la classe Lorem est destinée à être comptée par référence
boost::shared_ptr
et stockée dans un vecteur. - Cela permet à l'implémentation de changer - c'est-à-dire si Lorem devait être changé pour être compté de manière intrusive (via
boost::intrusive_ptr
) à un stade ultérieur, cela aurait un impact minimal sur le code. - Je pense qu'il a l'air plus joli et est sans doute plus facile à lire.
Raisons pour lesquelles je n'aime pas ça:
- Il y a parfois des problèmes avec les dépendances - si vous voulez incorporer, par exemple, une
Lorem::vector
dans une autre classe mais que vous avez seulement besoin (ou voulez) de transmettre la déclaration de Lorem (par opposition à l'introduction d'une dépendance sur son fichier d'en-tête), vous finissez par devoir utiliser le types explicites (par exempleboost::shared_ptr<Lorem>
plutôt queLorem::ptr
), ce qui est un peu incohérent. - Ce n'est peut-être pas très courant et donc plus difficile à comprendre?
J'essaie d'être objectif avec mon style de codage, donc ce serait bien d'avoir d'autres opinions à ce sujet afin que je puisse disséquer un peu ma pensée.