Pesquisar este blog

Páginas

segunda-feira, 27 de setembro de 2010

Começando com orientação à componentes

Vivemos em um tempo onde a velocidade, custo e qualidade norteiam os setores comerciais, ou seja, indústria, comércio dentre outros setores produtivos estão diretamente ligados à estes fatores e na forma como atuam no mercado.

Por exemplo, em uma software house, os produtos necessariamente devem ser desenvolvidos com agilidade, baixo custo, quantidade de bugs aceitável e colocados em ambiente de produção no menor tempo possível, pois além deles, outras software houses estão desenvolvendo sistemas semelhantes. Assim cria-se uma disputa onde vence a empresa que disponibilizar primeiro o produto e com as características citadas anteriormente.

"Não basta ser o primeiro a disponibilizar um produto, ele tem que ser eficiente e ter custo reduzido", esta afirmação demonstra que além do rápido desenvolvimento, onde os produtos são desenvolvidos e fabricados, o produto deve ter um número aceitável de bugs. Quanto ao custo, o mercado está cada vez mais competitivo e algumas vezes o custo faz a diferença no momento da escolha de um produto para ser adquirido.

Diversos paradigmas de programação buscam facilitar o desenvolvimento de sistemas com as características anteriormente citadas, dentre outras. Um dos paradigmas que se sobressai é a orientação a objetos, sendo que um outro paradigma vem ganhando espaço, a orientação a componentes, sendo este último o objeto de estudo deste blog.

Para apresentar a programação orientada a componentes, vamos partir de uma analogia com a indústria de hardware e eletrônicos.

Em indústrias de computadores, eletrônicos, dentre diversos outros setores produtivos, é usual o conceito de agregação de componentes, onde uma fábrica de notebooks não produz nenhum chip, no entanto no final de sua linha de produção tem-se um equipamento carregado destes componentes.

Como isto é possível?

Primeiramente gostaria de fazer algumas considerações e suposições para que a analogia entre a construção física de computadores e o desenvolvimento de programas baseado em componentes possa ser feito.

Uma placa qualquer de um equipamento eletrônico, onde se enquadram os componentes de hardware de um computador, é composta de diversos componentes eletrônicos elementares, como por exemplo transistores, resistores, capacitores, etc.. Estes componentes sozinhos não são capazes de fazer uma computação, porém a interligação de diversos componentes elementares, forma componentes mais complexos. Destes componentes mais complexos, constroem-se componentes mais complexos ainda e resultando como produto final, um computador.

Vamos supor que exista uma placa mãe que possibilite que se instale qualquer tipo de processador, modelos de memória e placas. Esta suposição se faz necessária para que possamos ter a idéia de atualização de hardware (upgrade), inclusive de processadores, sem a preocupação de compatibilidade.

Voltando a pergunta, devemos atentar ao fato de que componentes eletrônicos são um tipo de produtos extremamente especializados, e a construção de um processador, por exemplo, não é uma tarefa trivial. Desta forma, por que não deixar esta tarefa para uma indústria especializada? É uma alternativa interessante e geralmente utilizada. Esta empresa especializada, tendo o conhecimento profundo destes componentes, é capaz de produzir rapidamente, com menor custo e de forma otimizada, além de muitas vezes disponibilizar uma gama grande de possibilidades.

Podemos então nos preocupamos em instalá-los nos computadores na linha de montagem, utilizando um componente feito por terceiros e focar os esforços na montagem dos produtos finais.

Esta abordagem permite que as indústrias se especializem em determinados segmentos, sejam referências nas suas linhas de produtos. Isto se dá pelo fato de não precisar se preocupar com todo o processo construtivo dos componentes utilizados.

Alguns conceitos presentes de forma implícita na introdução do exemplo servem de motivação para a programação orientada à componentes. Tais conceitos serão abordados individualmente a seguir na indústria de hardware e relacionados à programação orientada a componentes.

Flexibilidade na visão da fabrica de computadores, refere-se à adicionar novos recursos rapidamente, por exemplo uma placa de áudio conectada a um slot. O computador funciona perfeitamente sem ela, mas se o cliente necessita que a partir de um momento o seu computador tenha som, esta placa pode ser adicionada e assim possibilitando esta nova demanda do cliente.
No desenvolvimento de software o mesmo ocorre, sendo que os requisitos geralmente são alterados ou novas funcionalidades requeridas. Um sistema flexível deve possibilitar a adição destes novos recursos rapidamente, sem a necessidade de longas paradas do sistema, testes de integração, etc..

Adaptabilidade no sentido de que cada computador pode ser adaptado a seus usuários, diferentes componentes podem ser customizados conforme a necessidade.
No desenvolvimento de software a adaptabilidade deve ser possibilitada com impacto mínimo ao núcleo da aplicação.

Manutenabilidade, quando já possuímos um computador e gostaríamos de instalar uma aplicação que necessita de um novo tipo de processador (vetorial, por exemplo), para se obter o desempenho desejado. Levando em consideração a suposição feita no inicio deste post, o sistema já estaria funcional após a substituição do processador, sem a necessidade de alterar demais componentes e testar cada componente isoladamente.
Do ponto de vista de software, podemos exemplificar com a necessidade de ordenar uma lista. A princípio esta pode ser implementada usando um algoritmo de força bruta que apresenta um baixo desempenho, mas posteriormente podemos substituir esta rotina de ordenação por outros algoritmos mais eficientes, por exemplo um mergesort. Esta substituição se vista como um componente, torna-se simplificada, pois o sistema já esta em funcionamento e através de testes no novo algoritmo de ordenação garantem que ele funciona igual ao anterior, porém com desempenho melhor.

No requisito reusabilidade, a analogia com componentes de hardware é um ótimo exemplo, pois imaginem que uma fábrica de processadores começasse todos os projetos do zero. O tempo de desenvolvimento dispararia, e juntamente com o tempo, o custo e demais fatores essenciais para se manter competitivos. Por que não fazer isto com software? Voltando para o exemplo da ordenação de uma lista, se já fizemos uma vez um componente para ordenar uma lista, podemos reutiliza-lo sem problemas e assim ganhando tempo (desenvolvimento, testes, correção de bugs) e dinheiro (horas de um ou mais desenvolvedores).

A interoperabilidade, pode ser exemplificada por diferentes tipos de componentes de hardware podendo trabalhar colaborativamente, por exemplo um disco rígido de uma geração anterior que através de um adaptador, permite trabalhar em conjunto com componentes mais novos que apresentam geralmente o funcionamento interno diferente. Em software, cita-se a possibilidade de integrar 2 aplicações executando em plataformas diferentes, ou até mesmo em linguagens diferentes. É de conhecimento que algumas linguagens são melhores para certas categorias de aplicações, então utilizar a linguagem que melhor se enquadre para cada componente é uma tarefa que busca o melhor desempenho possível.

Escalabilidade em um computador, está associada a capacidade de associa-lo com outros computadores ou componentes internos, assim permitindo que o equipamento seja capaz de operar com diferentes demandas.

O tempo de desenvolvimento, pelo fato de se reutilizar componentes que foram desenvolvidos previamente ou ainda pela aquisição de componentes de terceiros, possibilita-se o desenvolvimento ágil, com baixo custo e com qualidade.

Com a reutilização, alguns benefícios surgem, como por exemplo a robustez, pois se um componente já foi utilizado mais de uma vez, ele provavelmente já foi corrigido e aprimorado, se tornando um componente estável, otimizado e robusto. Com a reutilização também reduz-se o risco, pois os componentes já são estáveis e uma pequena parte do código será criada do zero, então o risco é bem menor que se fôssemos partir do rascunho.  

No aspecto de manutenção, geralmente o processador é conectado em um slot na placa mãe e pode ser substituído. Com o lançamento de um processador mais novo e compatível com a placa mãe, podemos atualizar o computador com um processador mais moderno sem ter que desmontar toda a placa mãe.

Contudo, tivemos uma breve introdução à idéia de programação orientada a componentes e aos benefícios que ela traz ao desenvolvimento de software. Nos próximos posts, buscaremos apresentar os conceitos deste paradigma e apresentar o estado da arte neste paradigma, pois o desenvolvimento de software difere-se de desenvolvimento de equipamentos por diversos fatores e não podem ser visto como iguais.