Programação Orientada a Objetos
Uma das caracterÃsticas mais interessantes da ciência da computação (ou informática, depende do gosto do leitor) é a constante e rápida evolução. Isso é uma caracterÃstica da área até porque suas evoluções permitem suportar pesquisas em outras áreas. E quando paramos para pensar sobre isso uma das coisas que nos vem a mente é, mas o que é que move essas pesquisas, essas evoluções?
Bom, existem várias respostas para essa pergunta, mas com certeza a mais interessante é a que diz respeito a demanda do usuário. Não vou falar sobre como surge a demanda do usuário por sistemas propriamente, mas é entender que em algum momento o usuário percebe um interesse por um sistema. Até aà tudo bem, o “problema” começa na verdade quando o usuário começa a aumentar a lista de necessidades, porque do ponto de vista puramente abstrato (caracterÃstica do software) tudo é possÃvel fazer, porém quando tentamos “concretizar” a necessidade do usuário em software essa tarefa em alguns casos se torna mais difÃcil do que deveria ser. Isso acontece porque quando vamos ampliando os horizontes dos sistemas vamos chegando aos limites que as nossas técnicas comportam. Um dos limites mais importantes é o de gerenciar abstrações de mais alto nÃvel, ou seja, quando chegamos nas fronteiras do desenvolvimento de sistemas não conseguimos mais gerenciar adequadamente as abstrações necessárias para desenvolver os sistemas que atendem as novas demandas dos usuários.
Isso acontece e fica claro quando pensamos na programação estruturada de forma comparada com a programação orientada a objetos. Essas duas formas de visão (ou paradigmas) não são contrárias entre si, apenas fornecem métodos de modelagem diferentes. Costumo dizer que a mudança está no foco, enquanto a programação estruturada trabalha com o foco nas funções do sistema, a programação orientada a objetos tem o foco nos dados, ou mais precisamente nos tipos abstratos de dados e isso é uma diferença fundamental.
O impacto dessa mudança de foco está no fato de que fica mais fácil de se comunicar com o usuário uma vez que estaremos trabalhando com as entidades ou conceitos que são usados diariamente, sejam eles Produto, Compra, OrdemDeVenda, ItemDePedido, Fornecedor entre outras. Com isso gastamos (ou deverÃamos gastar) mais tempo com a análise, projetando um sistema mais coerente com as abstrações do próprio usuário e torna-se (ou deveria se tornar) possÃvel construir sistemas maiores, com uma complexidade menor. Na prática surge uma dificuldade diferente que é conseguir lidar com um nÃvel maior de abstração, mas isso se deve muito mais a falta de prática (e/ou vontade de realmente aprender a técnica) do que a mudança de foco em si.
Uma outra caracterÃstica importante e interessante é o fato de que a programação orientada a objetos contém a programação estruturada, ao contrário do que as pessoas pensam que teram que simplesmente jogar tudo fora e aprender novamente. O ponto é que agora não dá para ir só aglutinando funções, o que gera as dependências, é necessário pensar onde as coisas entram, de quem é a responsabilidade por executar um certo código. Os métodos (o equivalente as funções) precisam fazer parte de uma classe, então não acontece (ou não deveria acontecer) de termos uma classe Recibo com um método imprime porque o Recibo não deveria mesmo conhecer o sistema de impressão, ao invés disso, essa classe fica responsável por aglutinar os dados de um Recibo de forma que seja mais claro e simples carregar essa informação. Por outro lado a classe ServicoDeImpressao pode ter acesso a classe ModeloDeImpressao para preencher com os dados e executar a impressão propriamente dita. O que conseguimos com isso é ter uma separação clara entre classes de dados e classes de controle, além disso, como efeito colateral, temos uma organização do sistema que nos permite achar de forma mais simples e ágil onde estão os códigos que realizam cada tarefa.
É claro que junto com um novo paradigma vem um conjunto de novas formas de pensar o sistema, então torna-se necessário aprender a fazer a análise de forma adequada para poder fornecer para o programador todas as informações necessárias à construção do sistema. Enquanto na programação estruturada quase sempre partÃamos diretamente para a codificação, na programação orientada a objetos é muito difÃcil que essa abordagem funcione de forma satisfatória porque é necessário pensar onde as coisas vão se encaixar.
“Ah, mas se eu colocar em qualquer lugar e fizer a chamada não vai funcionar?” Bem, a resposta é sim, vai funcionar, só que não teremos nenhum benefÃcio de usar a orientação a objetos se não fizermos as coisas como devem ser feitas. Muitas vezes vemos nas empresas sistemas feitos em Java, C++ e C# que, embora usem linguagens orientadas a objetos, são programados de forma estruturada. “Mas isso é possÃvel?” Sim, o fato de usar uma linguagem orientada a objetos não quer dizer que o seu sistema esteja orientado a objetos, de fato é possÃvel até mesmo construir um sistema orientado a objetos com uma linguagem estruturada como C (só que isso é muito mais difÃcil.)
Isso nos leva a entender que os paradigmas estruturado e orietado a objetso são apenas formas de trabalhar, o uso de uma linguagem que dá suporte a um ou outro não nos obriga a usá-lo. No entanto se estamos escolhendo trabalhar com uma linguagem que suporta o paradigma orientado a objetos (salvo situaçõe puramente de modismo) é porque estamos interessados nos benefÃcios que esse paradigma pode nos oferecer, quando não gastamos o tempo necessário para aplicar as técnicas estamos jogando fora uma possibilidade de escrever sistemas mais claros e com maior durabilidade (considerando que o usuário tenha interesse no sistema durante um longo perÃodo.) Essencialmente, um sistema deveria durar o tempo suficiente para que o usuário perca o interesse ou a necessidade nos serviços prestados no sistema de forma que ele seja substitÃdo. Enquanto o usuário não precisar de um sistema novo, deveria ser possÃvel aplicar evoluções no sistema em uso, muitas vezes isso não é possÃvel porque devido ao uso incorreto das ferramentas o sistema tem tantas dependências entre módulos que quebra. Nesse tipo de situação o usuário ainda tem interesse no mesmo serviço, mas é obrigado a trocar o sistema por não ser possÃvel mais evoluir e adaptar as dinâmicas diárias.


[...] de herança ou composição – isso está relacionado ao uso de linguagens orientadas a objetos uma vez que essas linguagens têm a capacidade de organizar e agrupar as funcionalidades. O [...]