[Dcmlib] [Update] const correctness

Mathieu Malaterre mathieu.malaterre at kitware.com
Mon Oct 25 07:00:03 CEST 2004


Salut,

  Je pense avoir finis avec la partie const correctness. Maintenant plus de surprise un accesseur 'Get' ne peux plus servir d'accesseur Set. On renvoi une reference sur l'object mais vu que 'const' est specifié l'utilisateur ne peut pas contourner la protection (en fait en theorie(*)). Donc dans le code on peut maintenant utiliser des const reference, c'est aussi efficace que des 'register' sur pointeurs. J'ai essayer de corriger a plusieurs endroit, qd on passe un vector, par defaut c++ passe par valeurs ! Mieux vaut passer une 'const &' si possible, merci. 
  Un autre avantage a 'const', on regarde le fichier .h on sait immediatement si le parametre de la fonction est une entrée seulement, ca evite de lire l'implementation.

  Sinon qlq remarques:

1. Plus jamais ca:
gdcmElementSet.h:   TagDocEntryHT &GetEntry() { return TagHT; };
gdcmElementSet.h:   TagDocEntryHT* GetTagHT() { return &TagHT; };

2. Est-ce bien necessaire:

ValEntry* NewValEntryByNumber(uint16_t group,                               uint16_t element);                           
BinEntry* NewBinEntryByNumber(uint16_t group,                               uint16_t element);                           
DocEntry* NewDocEntryByNumber(uint16_t group,                               uint16_t element);
DocEntry* NewDocEntryByNumber(uint16_t group,                             
uint16_t element, std::string const & VR);                     
DocEntry* NewDocEntryByName  (std::string const & name);                   
SeqEntry* NewSeqEntryByNumber(uint16_t group,                               uint16_t element);

La plupart du temps ces methodes n'utilise meme pas 'this'. Pourquoi ne pas faire des constructeurs supplementaires dans les classes plus appropriées.

[It is an extension of the "one point of responsibility" principle: whoever does "new", must be responsible for cleanup. ]

3. 'Unknown' / 'unkn' / '???'
Ca serait pas mal de choisir une def, plutot que l'humeur du programmeur. cf:
DictEntry* NewVirtualDictEntry(uint16_t group, uint16_t element, TagName vr     = "Unknown", TagName fourth = "Unknown", TagName name   = "Unknown");

@+,
Mathieu
In C++, it would be best practise to return an auto_ptr to an object.  In fact, if "new" is potentially harmful, I would say that "delete" is definitely harmful.  There's rarely a good reason to use naked pointers in C++ any more. 


(*) Je ne vais qd meme pas vous dire comment faire pour contourner la protection, non mais :p





More information about the Dcmlib mailing list