1. Introdução
Nos últimos anos verificou-se o grande aumento da utilização da tecnologia de orientação a objetos. Desde o início da década de 90 tem-se acompanhado, a princípio na comunidade acadêmica e após nas empresas, a crescente adoção da Orientação a Objetos para o desenvolvimento de aplicativos. Este aumento deve-se, principalmente, às soluções propostas por esta tecnologia, as quais vêm a amenizar os efeitos dos problemas gerados pela Crise de Software. No começo, algumas empresas viam com ressalvas os benefícios trazidos pela orientação a objetos, devido à pouca produtividade inicial conseguida por seus desenvolvedores; entretanto, passados agora alguns anos, não existem mais dúvidas quanto à sua adoção, sendo apenas uma questão de tempo para sua completa utilização de seus princípios.
Como conseqüência da adoção
da metodologia Orientada a Objetos para desenvolvimento de aplicativos, tivemos
uma explosão de métodos, linguagens e ferramentas que implementam, de uma forma
ou outra, todos os conceitos apresentados por esta tecnologia. Hoje existe uma
tentativa de se padronizar uma linguagem para especificação de sistemas
orientados a objetos, a UML. Esta linguagem é baseada em um conjunto de métodos
já utilizados e adotados em diversos lugares do mundo, os quais são OMT e
Booch. No campo das linguagens de programação, também temos uma série delas,
cada qual mais apropriada para um objetivo; só para citar alguns casos, temos
C++, SmallTalk, e mais recentemente Java.
Uma vez que a Orientação a
Objetos é uma realidade, e métodos e linguagens são abundantes no mercado, a
discussão volta-se agora para outra direção. A simples adoção dos conceitos não
é o suficiente, para a construção de aplicativos com qualidade, mesmo que
acompanhados das melhores ferramentas. Incluam-se aí as linguagens de
programação. A discussão agora é como projetar, mas como projetar da melhor
maneira possível.
1.1 Desenvolvimento Orientado a Objetos.
Desenvolver software orientado a objetos é difícil, por mais que todos digam que é fácil, não é. É difícil, ainda mais quando o desenvolvedor vem com uma bagagem de desenvolvimento semi-estruturado e estruturado. Agora, desenvolver software orientado a objetos e que seja reusável é infinitamente mais difícil.
Talvez, num futuro não muito
distante, venham nos perguntar: "Como era possível desenvolver aplicativos
sem utilizar objetos ?"; da mesma maneira que hoje perguntamos: "Como
era possível desenvolver software de maneira não estruturada ?".
É claro que o primeiro
projeto é sempre o mais crítico, já que existe a necessidade de se desenvolver
tudo, a partir do nada. No segundo, alguns objetos que foram pensados para o
primeiro podem ser utilizados, com algumas adequações. No terceiro, podem ser
utilizados objetos do primeiro e do segundo; assim, conforme vamos
desenvolvendo mais projetos Orientados a Objeto mais fácil para os
desenvolvedores vai se tornando, uma vez que muito do que foi elaborado
anteriormente pode ser utilizado para desenvolvimentos futuros. Em conseqüência
da reutilização de código, os projetos, em si, vão ficando melhores e mais bem
acabados, uma vez que os objetos neles utilizados já são completamente
funcionais.
Isto deve-se porque,
normalmente, todos os projetos envolvem a resolução de problemas recorrentes; e
quantas vezes não nos pegamos com a sensação de já termos resolvido um problema
semelhante em algum momento do passado. Este conhecimento, de como se resolver
um determinado problema, acumulado durante os anos, é o que chamamos de
experiência, e esta experiência está ligada diretamente aos responsáveis pela
resolução carregada apenas pelos desenvolvedores que um dia resolveram aquele
problema. Mas como podemos armazenar esta experiência para outros usos, ou
então para o auxílio de outros desenvolvedores.
Este ponto é importante, um
desenvolvedor experiente nunca começa a desenvolver um sistema realmente do
zero. Ele aproveita desenvolvimentos anteriores que deram certo e que foram
sendo refinados com o tempo, como ponto de partida para um novo sistema.
Se pudéssemos catalogar esta
experiência anterior em uma forma que qualquer pessoa, seja experiente ou não,
conseguisse realmente utilizar para resolver seus problemas de desenvolvimento,
conseguiríamos um grande aumento na qualidade dos projetos e uma redução sistemática
nos tempos de desenvolvimento dos sistemas.
Um dos principais motivos
levantados para a catalogação da experiência é fazer com que desenvolvedores
novatos possam agir como se fossem desenvolvedores especialistas, sem a
necessidade de passar anos ganhando experiência.
O principal problema da
orientação objeto, é que por ser uma tecnologia nova não existem meios seguros
de estimar o término e o cronograma do projeto. Não existem ferramentas para
estimar este término.
Integrar a tecnologia
Orientada a Objetos em uma corporação implica em mudar vários comportamentos
culturais e muito cuidado deve ser usado para treinar as pessoas nesse novo
paradigma. Muitos problemas podem advir do treinamento quando as pessoas
começam a lidar com objetos e devemos ajudar as pessoas a lidar com esse medo.
O problema do treinamento é
bem significativo, a curva de aprendizado da OO e bem acentuada, exige-se muito
estudo para entendermos o básico.
Deve-se também manipular as
expectativas, pois muitas vezes os usuários acham que todos os seus problemas
serão resolvidos com a OO e isso não acontece se não houver uma interação e
treinamento intensivo em todos os níveis da organização.
Em relação a aspectos da
programação a OO é uma programação de mais alto nível que as tradicionais, isso
quer dizer que ela esconde bastante código do programador, logo, se o problema
inicial que foi adotado ganhar mais complexidade teremos mais problemas.
Para lidarmos com o código,
resolvermos bugs, é mais difícil que as linguagens estruturadas, pois existem
muitos objetos, pequenos as vezes, que fazem interações imprevisíveis.
Finalmente podemos citar que
o modelo de orientação a objetos e incompatível com o ponto de vista procedural
de administração e estratégia trazendo
muitos problemas de comunicação e conversão.