terça-feira, fevereiro 17, 2009

O Não Tão Básico do Básico - Paradigmas de Programação - Parte 5

Os paradigmas que examinamos até agora (Não Estruturado e Estruturado) se concentram no código, particularmente no fluxo de execução. Como vimos na parte anterior, faz muito sentido agrupar o código às estruturas de dados associadas.

O paradigma de Programação Orientada a Objeto (também conhecido pela sigla em inglês OOP) trata os programas como um conjunto de "objetos" que interagem entre si. Um objeto é um conjunto de dados+código.

Não é deste OOP que estou falando!

A Programação Orientada a Objeto costuma utilizar um linguajar próprio, que enfatiza o objeto como a representação de uma entidade (física ou não). Enquanto que na programação estruturada se fala em rotinas que manipulam dados, na OOP fala-se em solicitar a um objeto que ele execute uma ação.

Um objeto na OOP é um exemplar (instância) de um certo tipo, ou classe. A classe pode ser vista como um molde ou forma que é usado para criar vários objetos com as mesmas rotinas e as mesmas estruturas de dados (mas individualizados pelo conteúdo destas estruturas). As rotinas que fazem parte de um objeto são normalmente chamadas de métodos; as estruturas de dados são chamadas de atributos, campos ou propriedades.

São considerados conceitos fundamentais da programação orientada a objeto: encapsulamento, herança, abstração e polimorfismo.

Encapsulamento é ocultar os detalhes de implementação de um objeto dos demais. É uma evolução do que vimos na Programação Modular. As linguagens projetadas para uso da OOP costumam fornecer recursos bem completos para controle da visibilidade e acesso dos métodos e atributos dos objetos. Desta forma uma classe define uma interface pública, que funciona como uma espécie de contrato entre o programador da classe e os programadores que vão utilizá-la. Isto possibilita (quando feito corretamente) alterar a implementação de uma classe (por exemplo para melhorar a performance ou reduzir o uso de memória) sem impactar o resto do código.

Herança é poder criar novas classes especializando uma classe já existente. Costuma-se falar na classe pai (ou base) e a classe filha (ou derivada). A herança cria uma relação do tipo "é um". Por exemplo, podemos ter uma classe pai "polígono" e classes derivadas "triângulo", "quadrado", etc. O "triângulo" é um "polígono". Ao se derivar uma classe pai, a filha herda os seus métodos e atributos. A classe filha pode acrescentar métodos e atributos ou substituir a implementação de métodos. Por exemplo, um "polígono" pode ter um método "Área" que calcula a sua área; um "quadrado" pode ter uma implementação específica deste método. Uma alternativa á herança é a composição, na qual um objeto de uma classe contem um objeto de outra classe, criando uma relação do tipo "tem um".

Um ponto crítico na análise orientada a objetos é determinar o que deve ser representado por objeto e a relação entre as classes (o que cria a "hierarquia" das classes, que é a "árvore genealógica" das classes).

A Abstração consiste em escolher o nível mais adequado da hierarquia para cada etapa do processamento. Desta forma se procura generalizar os tratamento e não se preocupar com especifidades. A composição também colabora com a abstração, permitido quebrar um objeto complexo em vários objetos mais simples.

O Polimorfismo consiste utilizar um objeto como sendo uma instância de uma classe ancestral, mas mantendo as suas características específicas. Retomando o meu exemplo, um "quadrado" pode ser usado em qualquer situação que requeira um "polígono"; se o método "Área" for chamado será utilizada a versão do "quadrado" apesar dele estar sendo usado como "polígono".

Nenhum comentário: