Resource Acquisition Is Initialization

Confesso que venho me rendendo (de novo!) ao C++, em detrimento ao “puro” C. O que causou a motivação, dessa vez, são bibliotecas de templates muito bem construídas, entre elas a STL e boost. Essa última usa uma técnica interessante como princípio: RAII (Resource Acquisition Is Initialization).

A idéia do RAII é evitar alocações dinâmicas no heap. Construções como essa ai em baixo são desaconselháveis:

{
  MyClass *p = new MyClass;

  if (p != NULL)
  {
    p->setPropertyA(value);
    // ... faz algo com 'p' ...
    delete p;
  }
}

São desaconselháveis porque adicionam uma complexidade desnecessária ao código e, ainda por cima, possíveis bugs pela falta de tratamento na validade do ponteiro ‘p’ (que foi feito acima). A técnica RAII nos diz que devemos instanciar nossos objetos diretamente, com auxílio de um construtor:

{
  MyClass c(value);
  // ... faz algo com 'c' ...
}

Isso é muito útil para emular o conceito de garbage collection em códigos C++. Quando o objeto sai do escopo seu destrutor é chamado automaticamente. Ainda temos a vantagem de não precisarmos usar a notação de ponteiros.

Embora tenhamos o problema potencial de exaustão da pilha, usando RAII extensivamente, as classes podem fazer uso de alocação dinâmica internamente. É o caso dos templates containers, da STL e de boost, já que todos eles usam alguma forma de composição, internamente.

O único drawback – e nem é mesmo um – deve-se à curva de aprendizagem “suave” (que não é uma coisa boa!) em relação aos templates, namespaces, funções e os conceitos (containers, adaptadores, etc) da biblioteca boost. Se seu background é de C, vocẽ vai ter que reaprender a pensar em seus códigos em termos de design patterns. Vale a pena…

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s