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!

[ Hits: 17.678 ]

Por: Paulo Silva Filho em 13/09/2010 | Blog: http://psfdeveloper.blogspot.com


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:
  1. Singleton Pattern
  2. Inversion of Control (Dependency injection) Pattern
  3. Observer Pattern
  4. Facade Pattern
  5. Callback Handler Pattern
  6. Trap Pattern
  7. Proxy Pattern
  8. Monad Pattern
  9. Multiple-Read, Single-Write Pattern
  10. 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.

    Próxima página

Páginas do artigo
   1. Introdução
   2. Pattern Singleton
Outros artigos deste autor

Algum humor e C++ Design Patterns (parte 2)

Leitura recomendada

Estudando recursividade direta e indireta

GNA: um Coprocessador para Aceleração Neural

Utilizando técnicas recursivas em C e C++

Ponteiros - Saindo de Pesadelos

SDL e C - Uma dupla sensacional

  
Comentários
[1] Comentário enviado por julio_hoffimann em 13/09/2010 - 22:04h

Oi Paulo,

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.

[2] Comentário enviado por psfdeveloper em 14/09/2010 - 05:22h

Caro Julio,

muito obrigado pelos elogios.

Quanto ao meu uso das classes virtuais, nesse caso não tem nada a ver com o Singleton. Eu apenas o fiz caso alguém ache válido derivar essa classe. Entretanto, você tem razão, e não acredito que essa implementação de singleton seja derivável, porque a função estática access teria de ser reimplemetada para cada derivação.

O uso de NULL em C++ é quase sempre uma boa prática, principalmente no uso de ponteiros. NULL é apenas uma macro que expande para 0, mas aumenta a legibilidade do código, ainda mais em C++, que, juntamente com Perl, compartilham as sintaxes mais horrorosas entre as linguagens de programação. O NULL também evita certos typecastings. Nunca descobri por que, mas, pela minha experiência, a simples mudança de 0 para null evitou que eu tivesse que fazer casts estranhos. Eu costumo usar o NULL sempre, exceto no caso de funções virtuais puras, que uso o zero, mesmo, da seguinte forma:

class A {
public:
// ... algum código
void funcVirtualPura(int arg1, char arg2) = 0;
protected:
// ... algum código
private:
// ... algum código
};

Não acho que o código acima seja ilegível.

Esse artigo que eu postei é bastante simples, apenas para mostrar o que é um Singleton, não para apresentar uma implementação definitiva. Eu estou fazendo a segunda parte do artigo e organizando a biblioteca como um projeto no Sourceforge para facilitar o acesso ao código fonte. Eu preciso do conceito de singleton para implementar a minha versão de Inversion of Control. Na apresentação de Inversion of Control eu apresento uma implementação definitiva de Singleton.

Se você tiver pressa em ver o que estou preparando, eu posto os meus artigos no meu blog sem ter o preciosismo de escrevê-los por completo. Os artigos dos patterns pode ser visto nesse link: http://psfdeveloper.blogspot.com/search/label/%27SOME%20HUMOUR%20AND%20C%2B%2B%20DESIGN%20PATTERNS%2... . Assim que eu terminar o texto de Inversion of Control inteiro, eu vou trazê-lo para o Viva o Linux, como a segunda parte desse tutorial, mas enquanto ele está sendo feito, só publico os seus pedaços no meu blog mesmo.

Um último ponto. C++ é uma linguagem muito estranha. Você pode colocar constructors e destructors com qualquer nível de acesso (o que é possível em Java, também), e certos operadores podem ser chamados até mesmo a partir de funções virtuais. É possível chamar o operador delete de dentro de um módulo do próprio objeto, com a horrorosa sintaxe "delete this;", o que destrói o objeto e invalida o ponteiro. Como o método pertence à classe e não ao objeto, ele termina normalmente, mas, qualquer referência a this, ou ao ponteiro do objeto em qualquer outra escopo, resulta em um segfault.

E, novamente, obrigado pelos elogios.

Abraços.

[3] Comentário enviado por daniel.franca em 14/09/2010 - 11:11h

Uma correção, C e C++ estão sim entre as linguagens mais utilizadas no mundo.
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

O mais correto acho que seria dizer que C/C++ é pouco usada em T.I. (que é o forte brasileiro)

[4] Comentário enviado por stremer em 14/09/2010 - 20:48h

cara... fazia tempo que não via um artigo TÃO BOM no VOL!!!

Só discordo de uma coisa... C/C++ não são linguagens estranhas... perl pode até ser... ta certo que não são iguais a Java onde ler um código em java é quase que ler um texto em português, mas acho C/C++ até bastante organizado....
Agora Visual Basic sim... aquilo é linguagem estranha.... e olha que trabalhei muitos anos com ela!!!

[5] Comentário enviado por psfdeveloper em 14/09/2010 - 21:26h

Caro Daniel,

eu não conhecia esse link a respeito das estatísticas de popularidade de linguagens, o que faz com o que eu falei a respeito da popularidade de C e de C++ se torne uma besteira enorme. Mas não errei por mal, apenas apresentei uma opinião como um fato, o que nem sempre fica claro para todo mundo.

Agora, eu estudei bem o link da Tiobe, a respeito da popularidade das linguagens de programação. Ela pesquisa o ranking de procura e acessos a páginas cujos conteúdos sejam a respeito de determinada linguagen. Essa pesquisa é feita em diversos sites de procura e de conteúdo, como o Google, a Wikipédia, o Yahoo! e até mesmo o YouTube. Esse registro de popularidade não indica o uso efetivo de determinada linguagem, apesar de, provavelmente, as duas variáveis terem grande correlação. O Tiobe faz um tipo de medida de popularidade, mas o que eu dizia era a respeito do uso efetivo das linguagens entre os programadores.

Dizer que C/C++ é pouco usada em T.I., para mim, soa meio estranho, porque eu não sei qual é o corte entre T.I. e desenvolvimento de software em geral. Eu sei que desenvolvimento de jogos não é TI, apesar de ser tecnologia e programação, mas desenvolvimento das engines dos bancos de dados é TI ou não? Se a TI for restrita ao nosso antigo Processamento de Dados, então você tem razão, caso contrário, você está errado. Segundo a Wikipedia, nesse link: http://pt.wikipedia.org/wiki/Tecnologia_da_informa%C3%A7%C3%A3o, TI engloba todo o uso de computação para lidar com qualquer tipo de dado. O artigo em inglês tem uma definição mais restrita, associando à TI a necessidade de processos e tomada de decisão. De toda forma, estritamente, as duas definições se equivalem.

Na TI como um todo, a base instalada de C e C++ é enorme, assim como a sua comunidade de programadores e desenvolvedores, que, na minha opinião, é a mais influente do mundo, justamente por conta dessa base instalada. Entretanto, assim como popularidade em pesquisas de internet, base instalada não significa exatamente popularidade. C e C++ são fortíssimos em distribuições de software, como sistemas operacionais, bancos de dados, editores de texto, bibliotecas de desenvolvimento porque elas foram feitas com esse intento. No mundo Apple, o Objective-C rivaliza com o C. Mas, fora disso, o uso de C e C++ é anêmico. Por outro lado, a visibilidade de tudo o que é feito em C/C++ é imenso, pois quase tudo que usamos diretamente é feito nessa linguagem. Outro ponto é que, em quase quatorze anos trabalhando com tecnologia, eu só vejo mais e mais pessoas abandonando C/C++ em favor de outras linguagens como Java, C# ou Python, principalmente para Java. Isso não é ruim para C ou C++, pois agora, essas linguagens são usadas de acordo com o seu fim: desenvolvimento de sistemas e de algoritmos em alta performance.

Do Tiobe, o que mais me assustou é o quão pouco as ferramentas da Microsoft são populares nas máquinas de pesquisa. C# está, apenas, em sexto lugar, pouco acima de Python, apesar de sua base instalada ser enorme (Por conta da própria força da Microsoft). Entretanto eu tenho muito mais contato com pessoas programando em .NET do que em C ou C++. Eu tenho uma opinião a esse respeito: quem ja programou usando ferramentas da Microsoft sabe que em Documentação, eles são impecáveis. Se a Apple é fera em interface com o usuário, a Microsoft é fera em dar suporte ao programador. Se eu tenho tal suporte, por que procurar informação a respeito dessas ferramentas?

E a popularidade de C e de C++ no Tiobe pode ser enviesada: se elas são muito procuradas em máquinas de pesquisa, pode ser por pura necessidade acadêmica (algumas faculdades forçam os alunos a estudar C), ou para retirada de dúvidas dessas linguagens que não possuem uma documentação centralizada. E, principalmente para C++, principalmente, porque são difíceis.

Abraços.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts