Classes Singleton e Debug com CRTP

Estive um pouco ocupado e acabei passando essas duas semanas sem publicar no blog. Mas agora que estou com mais tempo livre novamente, resolvi escrever sobre uma técnica pouco usada, mas que vale a pena conhecer.

A técnica

O nome dessa técnica é curiously recurring template pattern e os recursos de programação utilizados por ela são o uso de herança e templates.

A ideia é criar uma classe filha que herde de uma instanciação de uma classe template usando ela própria como argumento do template. Podemos assim, especializar a classe-mãe usando a classe-filha.

Uma tentativa de diagrama UML do CRTP

Eu penso que o estrago que uma arma pode fazer depende do sujeito que está com a arma e o poder de uma técnica de programação sempre depende da criatividade do programador.

Aqui coloco dois exemplos de uso onde essa técnica pode ser útil. Expressem nos comentários a criatividade que vocês têm.

CRTP e Singleton

O primeiro exemplo é o Singleton, um dos padrões de projeto mais conhecidos, usado para restringir o número de objetos de uma classe a um, de forma onde temos um método estático que retorna sempre o mesmo objeto, e essa é a instância utilizada em todo o código.

Vamos usar no nosso exemplo a classe Logger. Queremos fazer a classe Logger implementar um Singleton.

No exemplo anterior, o objetivo foi alcançado, mas poderíamos abstrair a implementação de Singleton em um componente separado que poderia ser facilmente reaproveitado para uma outra classe qualquer.

Herança é a forma mais comum de conseguirmos alcançar o reaproveitamento de código. Porém, não podemos aplicar esse conceito para abstrair a implementação do Singleton em linguagens de programação fortemente tipadas, pois para cada classe, o método instance deveria retornar um objeto de um tipo diferente.

Em C++, no entanto, podemos usar templates para criar variações de tipos! E usando o CRTP pode ficar assim:

Usando:

A classe Debug

Nesse exemplo, farei o contrário, fazendo da classe template a classe-mãe, pois talvez você não possa mudar a classe-alvo ou talvez não queira depurar todos os objetos. Usarei o operador typeid e o stream std::cout nesse exemplo.

É isso por enquanto, próxima semana eu escrevo sobre um tema diferente.

Tags:

Trackbacks / Pingbacks

  1. Monads | Vinipsmaker labs - 2015/08/31

Comentários (with MarkDown support)

Preencha os seus dados abaixo ou clique em um ícone para log in:

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

%d blogueiros gostam disto: