• Nenhum resultado encontrado

AS PRINCIPAIS CARACTERÍSTICAS DA PROGRAMAÇÃO ORIENTADA A OBJETOS

A programação orientada a objetos (OOP, object-oriented programming) é a essên- cia de Java. A metodologia orientada a objetos é inseparável da linguagem, e todos os programas Java são, pelo menos até certo ponto, orientados a objetos. Devido à importância da OOP para Java, é útil entendermos seus princípios básicos antes de escrever até mesmo um programa Java simples.

A OOP é uma maneira poderosa de abordar a tarefa de programar. As meto- dologias de programação mudaram drasticamente desde a invenção do computa- dor, principalmente para acomodar a crescente complexidade dos programas. Por exemplo, quando os computadores foram inventados, a programação era feita pela ativação das instruções binárias da máquina com o uso do painel frontal do compu- tador. Contanto que os programas tivessem apenas algumas centenas de instruções, essa abordagem funcionava. À medida que os programas cresceram, a linguagem simbólica foi inventada para que o programador pudesse lidar com programas maio- res e cada vez mais complexos, usando representações simbólicas das instruções de máquina. Como os programas continuaram a crescer, foram introduzidas linguagens de alto nível que davam ao programador mais ferramentas para lidar com a com- plexidade. A primeira linguagem amplamente disseminada foi FORTRAN. Embora fosse uma primeira etapa bem impressionante, programas grandes em FORTRAN eram muito difíceis de entender.

Respostas:

1. Um applet é um programa pequeno que é baixado dinamicamente da Web. 2. Um conjunto altamente otimizado de instruções que pode ser executado pela

Máquina Virtual Java (JVM). 3. Portabilidade e segurança.

Os anos de 1960 deram origem à programação estruturada. Esse é o método encorajado por linguagens como C e Pascal. O uso de linguagens estruturadas tornou possível criar programas de complexidade moderada mais facilmente. As linguagens estruturadas são caracterizadas por seu suporte a sub-rotinas autônomas, variáveis locais, estruturas de controle sofisticadas e por não dependerem de GOTO. Embora sejam uma ferramenta poderosa, elas também têm um limite.

Considere isto: a cada marco no desenvolvimento da programação, técnicas e ferramentas eram criadas para permitir que o programador lidasse com a crescente complexidade. A cada etapa do percurso, a nova abordagem pegava os melhores ele- mentos dos métodos anteriores e fazia avanços. Antes da invenção da OOP, muitos projetos estavam perto do ponto de ruptura (ou excedendo-o). Os métodos orientados a objetos foram criados para ajudar os programadores a ultrapassar essas barreiras.

A programação orientada a objetos pegou as melhores ideias da programação estruturada e combinou-as com vários conceitos novos. O resultado foi uma maneira diferente de organizar um programa. De um modo mais geral, um programa pode ser organizado de uma entre duas maneiras: a partir de seu código (o que está ocorrendo) ou a partir de seus dados (o que está sendo afetado). Com o uso somente de técnicas de programação estruturada, normalmente os programas são organizados a partir do código. Essa abordagem pode ser considerada como “o código atuando sobre os dados”.

Os programas orientados a objetos funcionam ao contrário. São organizados a partir dos dados, com o seguinte princípio-chave: “dados controlando o acesso ao código”. Em uma linguagem orientada a objetos, você define os dados e as rotinas que podem atuar sobre eles. Logo, um tipo de dado define precisamente que tipo de operações pode ser aplicado a esses dados.

Para dar suporte aos princípios da programação orientada a objetos, todas as linguagens OOP, inclusive Java, têm três características em comum: encapsulamento, polimorfismo e herança. Examinemos cada uma.

Encapsulamento

O encapsulamento é um mecanismo de programação que vincula o código e os dados que ele trata, e isso mantém os dois seguros contra a interferência e a má utilização externa. Em uma linguagem orientada a objetos, o código e os dados podem ser vin- culados de tal forma que uma caixa preta autônoma seja criada. Dentro da caixa, es- tão todo o código e os dados necessários. Quando o código e os dados são vinculados dessa maneira, um objeto é criado. Em outras palavras, um objeto é o dispositivo que dá suporte ao encapsulamento.

Dentro de um objeto, o código, os dados ou ambos podem ser privados desse objeto ou públicos. O código ou os dados privados só são conhecidos e acessados por outra parte do objeto. Isto é, o código ou os dados privados não podem ser acessados por uma parte do programa que exista fora do objeto. Quando o código ou os dados são públicos, outras partes do programa podem acessá-los mesmo que estejam defi- nidos dentro de um objeto. Normalmente, as partes públicas de um objeto são usadas para fornecer uma interface controlada para os elementos privados do objeto.

A unidade básica de encapsulamento de Java é a classe. Embora a classe seja examinada com mais detalhes posteriormente neste livro, a breve discussão a seguir será útil agora. Uma classe define a forma de um objeto. Ela especifica tanto os dados quanto o código que operará sobre eles. Java usa uma especificação de classe

para construir objetos. Os objetos são instâncias de uma classe. Logo, uma classe é essencialmente um conjunto de planos que especificam como construir um objeto.

O código e os dados que constituem uma classe são chamados de membros da classe. Especificamente, os dados definidos pela classe são chamados de variáveis

membro ou variáveis de instância. Os códigos que operam sobre esses dados são

chamados de métodos membro ou apenas métodos.

Polimorfismo

Polimorfismo (do grego, “muitas formas”) é a qualidade que permite que uma interface

acesse uma classe geral de ações. A ação específica é determinada pela natureza exata da situação. Um exemplo simples de polimorfismo é encontrado no volante de um au- tomóvel. O volante (isto é, a interface) é o mesmo não importando o tipo de mecanismo de direção usado. Ou seja, o volante funciona da mesma forma se seu carro tem direção manual ou direção hidráulica. Portanto, se você souber como operar o volante, poderá dirigir qualquer tipo de carro, não importando como a direção foi implementada.

O mesmo princípio também pode ser aplicado à programação. Vejamos um exemplo simples. Você poderia criar uma interface para definir uma operação cha- mada get, que obtivesse o próximo item de dados de algum tipo de lista. Essa ação, a obtenção do próximo item, pode ser implementada de várias maneiras, dependendo de como os itens são armazenados. Por exemplo, os itens podem ser armazenados na ordem primeiro a entrar, primeiro a sair; na ordem primeiro a entrar, último a sair; com base em alguma prioridade; ou de alguma maneira entre muitas outras. Porém, se todos os mecanismos de armazenamento implementarem sua interface, você pode- rá usar get para recuperar o próximo item.

Geralmente, o conceito de polimorfismo é representado pela expressão “uma interface, vários métodos”. Ou seja, é possível projetar uma interface genérica para um grupo de atividades relacionadas. O polimorfismo ajuda a reduzir a complexidade permitindo que a mesma interface seja usada para especificar uma classe geral de

ação. É tarefa do compilador selecionar a ação (isto é, método) específica conforme

cada situação. Você, o programador, não precisa fazer essa seleção manualmente. Só tem que usar a interface geral.

Herança

Herança é o processo pelo qual um objeto pode adquirir as propriedades de outro ob-

jeto. Isso é importante porque dá suporte ao conceito de classificação hierárquica. Se você pensar bem, grande parte do conhecimento pode ser gerenciada por classificações hierárquicas (isto é, top-down). Por exemplo, uma maçã Red Delicious faz parte da classificação maçã, que por sua vez faz parte da classe fruta, que fica sob a classe maior

alimento. Isto é, a classe alimento possui certas qualidades (comestível, nutritivo, etc.)

que, logicamente, também se aplicam à sua subclasse, fruta. Além dessas qualidades, a classe fruta tem características específicas (suculenta, doce, etc.) que a distinguem de outros alimentos. A classe maçã define as qualidades específicas de uma maçã (cresce em árvores, não é tropical, etc.). Por sua vez, uma maçã Red Delicious herdaria as qua- lidades de todas as classes precedentes e só definiria as qualidades que a tornam única. Sem o uso de hierarquias, cada objeto teria que definir explicitamente todas as suas características. Com o uso da herança, um objeto só tem que definir as qualida-

des que o tornam único dentro de sua classe. Ele pode herdar seus atributos gerais de seu pai. Logo, é o mecanismo de herança que possibilita um objeto ser uma instância específica de um caso mais geral.

Verificação do progresso

1. Cite os princípios da OOP.

2. Qual é a unidade básica de encapsulamento em Java?