Algo que me vejo fazendo frequentemente ultimamente é declarar typedefs relevantes para uma classe específica dentro dessa classe, ou seja,
class Lorem
{
typedef boost::shared_ptr<Lorem> ptr;
typedef std::vector<Lorem::ptr> vector;
//
// ...
//
};
Esses tipos são usados em outras partes do código:
Lorem::vector lorems;
Lorem::ptr lorem( new Lorem() );
lorems.push_back( lorem );
Razões pelas quais eu gosto:
- Reduz o ruído introduzido pelos modelos de classe,
std::vector<Lorem>
torna-seLorem::vector
, etc. - Serve como uma declaração de intenções - no exemplo acima, a classe Lorem deve ser contada como referência
boost::shared_ptr
e armazenada em um vetor. - Ele permite que a implementação mude - isto é, se o Lorem precisou ser alterado para ser contado intrusivamente como referência (via
boost::intrusive_ptr
) posteriormente, isso teria um impacto mínimo no código. - Eu acho que parece "mais bonito" e é sem dúvida mais fácil de ler.
Razões pelas quais eu não gosto:
- Às vezes, há problemas com dependências - se você deseja incorporar, digamos, um
Lorem::vector
dentro de outra classe, mas só precisa (ou deseja) encaminhar declarar Lorem (em vez de introduzir uma dependência em seu arquivo de cabeçalho), então você acaba usando o tipos explícitos (por exemplo, emboost::shared_ptr<Lorem>
vez deLorem::ptr
), o que é um pouco inconsistente. - Pode não ser muito comum e, portanto, mais difícil de entender?
Eu tento ser objetivo com o meu estilo de codificação, então seria bom ter outras opiniões sobre ele para poder dissecar um pouco o meu pensamento.