É estranho que exista documentação a respeito de
Java Design Patterns aos montes (dê uma procurada no Google), muita documentação disponível a respeito de técnicas de programação em
Perl e
Python e uma grande quantidade de documentação a respeito de estratégias de programação sobre as linguagens
PHP,
Lisp e mesmo sobre
Haskell.
Mas não temos tanta documentação simples e acessível a respeito de padrões de desenvolvimento em C ou C++ (faça com C++ a mesma pesquisa que fez com o Java).
Será isso algum tipo de preconceito a respeito dessas linguagens ou algum tipo de inveja sobre as mais disseminadas ferramentas de programação do mundo? Os desenvolvedores C++ são tão inteligentes que eles não precisam aprender nada a respeito de engenharia de software, incluindo os padrões de desenvolvimento (ou patterns, somente)?
Você precisa concordar comigo que C++, e C, também, não possuem o maior número de programadores, nem são as linguagens de programação mais populares na Internet, nem no mundo, mas stacks inteiras de software foram desenvolvidas utilizando tais linguagens. Se o C for completamente incluído nessa cota, podemos dizer que praticamente todos os kernels dos sistemas operacionais, bancos de dados, interfaces gráficas, drivers de dispositivos e periféricos, sistemas avançados de jogos e um monte de aplicativos foram feitos utilizando a dupla C/C++.
Então, por que tão pouca documentação, em comparação com as outras linguagens, a respeito de estratégias de programação nessas linguagens tão influentes?
Eu penso que os programadores C++ estão tão ocupados programando com uma linguagem tão difícil e ilegível que eles não podem lidar com coisas inúteis como tutoriais ou documentação.
Mas, eu, um Analista de Sistemas ocioso, que sabe programar em C++ muito bem (estou impressionado com isso: um analista de sistemas programando em C++?), decidi preencher essa falta de tutoriais e estou oferecendo a vocês essa pequena peça dourada de programação: Design Patterns em C++.
Na realidade esses patterns não são específicos de C++, mas eles são uma implementação muito específica deles nessa linguagem. E eu vou usar fortemente do estilo do C++! Eu adoro montes de ponteiros, atributos constantes, herança virtual e múltipla, class friends e tudo o que o C++ possui que é poderoso, difícil de ler e duro de entender.
Não é por causa disso que adoramos tanto C++, no final das contas? Alguns padrões apresentados aqui possuem nomes diferentes dos dados pela literatura, mas eu não me lembro de seus nomes originais, então eu os batizei com outros nomes que me parecem mais intuitivos. Se vocês souberem os nomes dos patterns que eu apresentar com um nome diferente, me mandem um comentário para que eu possa corrigir.
Para ler esse tutorial você precisa saber como programar em C++. Esse não é um tutorial de C++. Se você precisa de um tutorial C++, peça-me que eu poderei escrever um, no futuro, mas, neste momento, estou interessado apenas nos programadores avançados. E você irá precisar de um bom compilador C++. A opção óbvia, para usuários de
Linux é o gcc. Eu ainda não aconselho o uso do Clang [1]. Eu preciso testar todos os patterns no Clang antes de promover esse compilador.
Os design patterns que pretendo apresentar, nessa série de dez curtos artigos são:
- Singleton Pattern
- Inversion of Control (Dependency injection) Pattern
- Observer Pattern
- Facade Pattern
- Callback Handler Pattern
- Trap Pattern
- Proxy Pattern
- Monad Pattern
- Multiple-Read, Single-Write Pattern
- Mapping Functor Pattern
Depois desse discurso todo, vamos a eles!
Créditos:
[1] O Clang é o compilador otimizado do projeto LLVM (Low Level Virtual Machine), e pode ser encontrado
neste link.