Algum humor e C++ Design Patterns (parte 1)
Uma apresentação e descrição bem humorada a respeito dos "design patterns" clássicos de programação implementados em C++. Visa ajudar os desenvolvedores C++ (e em alguns casos os de C, apenas) a deixar o seu código mais bonito, seguro e elegante. Bem, e as piadas não visam ser de mal gosto - se forem, por favor, me avisem, que eu as retiro!
Introdução
É 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:
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.
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.
Já vi que vou gostar desta série de artigos avançados em C++, é uma ótima oportunidade de trocar experiências. Programo em C++ há um tempo e concordo com você que quando o assunto é linguagem de programação com potencial complexo, ela está entre as mais votadas.
Muitas vezes me deparei com o termo Singleton nos livros, mas passei desapercebido. Não sabia que se tratava de algo tão interessante, vou pesquisar mais sobre o tema. Seu artigo também corrigiu a idéia que tinha de que uma classe para ser instanciada precisava ter seu construtor público.
Uma pergunta, quando você declarou membros virtuais, teve alguma relação com o Singleton? Não vejo porque declarar métodos de acesso como virtuais nesse exemplo.
Outra pergunta, é boa prática utilizar NULL ao invés de 0 em C++?
Parabéns, aguardo os próximos artigos ansioso.
P.S.: Há um erro de digitação na definição do método getValue() no segundo exemplo, um ";" extra.