Você está na página 1de 13

Lógica de Programação

Orientadas a objetos

Orientação a Objetos
1- Introdução:

A análise e o projeto orientados a objetos têm como meta identificar o melhor


conjunto de objetos para descrever um sistema de software. O funcionamento
deste sistema se d´a por meio do relacionamento e troca de mensagens entres
os objetos.
Na programação orientada a objetos, implementa-se um conjunto de classes
que definem os objetos presentes no sistema de software. Cada classe
determina o comportamento (definido nos métodos) e os estados possíveis
(atributos) de seus objetos, assim como o relacionamento com outros objetos.
As linguagens de programação que dão suporte a orientação a objetos são:
Smaltalk, Perl, Python, Ruby, PHP, ColdFusion, C++, Object Pascal, Java,
JavaScript, ActionScript, Delphi e C#.

2 Conceitos fundamentais

1. Objetos

Os objetos do mundo real compartilham duas características: possuem um


estado e tem um comportamento. Por exemplo, cachorro tem um estado
(nome, cor, raça) e um comportamento (latindo, comendo, lambendo).
Analogamente, objetos de software são modelados de acordo com os objetos
do mundo real, ou seja, possuem estado e comportamento (objeto é
uma abstração do mundo real). Um objeto de software armazena seu estado
em variáveis e implementa seu comportamento com métodos. Estas
variáveis e métodos são formalmente chamados de variáveis de instância
e métodos de instância a fim de distinguí-los de variáveis e métodos de
classe.
As variáveis de um objeto fazem parte do seu núcleo (centro). Os métodos
envolvem e escondem o núcleo do objeto de outros componentes da
aplicação,
1. Empacotar as variáveis de um objeto sobre proteção de seus métodos é
chamado de encapsulamento. O encapsulamento é utilizado para esconder
detalhes de implementação pouco importante. Este é um dos princípios
fundamentais da programação orientada a objetos.

fig.1 - Representação de um objeto

As vezes, por razões de eficiência ou implementação, um objeto deseja


expor algumas de suas variáveis ou esconder alguns de seus métodos. Esta
capacidade de controlar quais componentes podem acessar seus métodos
e suas variáveis é chamada de Controle de Acesso.
Cada objeto tem sua identidade que significa que dois objetos são distintos
mesmo que eles apresentem exatamente as mesmas características
(atributos iguais). Esta identificação de objeto deve ser única, uniforme e
independente do conteúdo do objeto.
A estrutura de dados de um objeto é representada em termos de atributos
(também chamados de campos (fields)), ou seja, os dados ou informações
do objeto.
A fig.1 mostra um exemplo da representação de objeto do mundo real para o
objeto de software. Os atributos Raio, x e y são as variáveis de instância.
Em Java, para declarar uma variável de classe basta acrescentar a palavra
static. O mesmo vale para o método.
Figura.2: Representação do objeto do mundo real para o objeto de software

2. Métodos
É uma rotina que é executada por um objeto ao receber uma mensagem.
Os métodos determinam o comportamento dos objetos de uma classe e
são análogos às funções ou procedimentos da programação estruturada. O
envio de mensagens (chamado de métodos) pode alterar o estado de um
objeto.

3. Atributos
Os atributos são os elementos que definem a estrutura de uma classe. Os
atributos também são conhecidos como variáveis de classe, e podem ser
divididos em dois tipos básicos: atributos de instância e de classe. Os
valores dos atributos de instância determinam o estado de cada objeto.
Um atributo de classe possui um estado que é compartilhado por todos os
objetos de uma classe. Atributos de classe podem ser chamados também
de atributos estáticos ou constantes.
As mensagens enviadas a um objeto (chamada de método) podem mudar
o valor de um ou mais atributos, alterando o estado de um objeto.

4. Classes
Uma classe é um modelo (protótipo) que defini as variáveis (estado) e os
métodos (comportamento) comuns a todos os objetos do mesmo tipo. Na
classe são definidas as variáveis e implementados os métodos. Os objetos
são criados a partir de suas classes.
As classes não são diretamente suportadas em todas as linguagens de objetos,
e não são necessárias para que a linguagem seja orientada a objetos.
Além dos métodos e atributos de uma classe, outros possíveis membros
são:
Construtor: define o comportamento no momento da criação de um objeto de
uma classe;
Destrutor: define o comportamento no momento da
destruição do objeto de uma classe. Normalmente utilizado para liberar
recurso (memória) do sistema; Propriedade: define o acesso a um estado
do objeto;
Evento: define um ponto em que o objeto pode chamar outros
procedimentos de acordo com seu comportamento e estado interno;
Obs.: Lembrar sempre que a classe define as características comuns e os
objetos são instâncias dessa classe, com estado própria.

5. Mensagens
Objetos se comunicam entre si por meio do envio de mensagens. Quando
um objeto A deseja que o objeto B realize um dos seus métodos (de B), o
objeto A envia uma mensagem para o objeto B. Algumas vezes, o objeto
que recebe a mensagem precisa de mais informações para saber exatamente
o que fazer. Por exemplo, quando você quer trocar as marchas de
uma bicicleta, deve-se indicar qual a marcha desejada. Esta informação
acompanha a mensagem como um parâmetro.
Assim, três componentes fazem parte de uma mensagem:
o objeto para onde a mensagem é endereçada (bicicleta); o nome do
método a realizar (mudar marcha); parâmetro(s) necessários para realizar
o método (segunda marcha);
A mensagem, também, pode ser direcionada diretamente a uma classe por
meio da invocação de um método dinâmico.

6. Herança
A herança é um mecanismo que permite criar novas classes a partir de
classes já existentes, aproveitando-se das características existentes na classe
a ser estendida. Com a herança é possível criar classes derivadas (subclasses)
a partir de classes bases (superclasses).

As subclasses herdam todas as características de suas superclasses, como


suas variáveis (estado) e seus métodos (comportamento). Entretanto, as
subclasses não estão limitadas ao comportamento herdado de sua superclasse.
As subclasses podem adicionar variáveis e métodos a aqueles herdados.
As subclasses, também, podem redefinir (override) métodos herdados e
oferecer implementações especializadas para estes métodos.
O conceito de herança pode ser aplicado para mais de um nível. A
árvore de herança, ou hierarquia de classe, pode ser tão profunda quanto
necessário. Os métodos e variáveis são herdados por meio dos níveis. Em
geral, quanto mais baixa na hierarquia for a posição da classe, mais espec
ífico é o seu comportamento.
Como benefícios do conceito de herança, podemos citar:
Subclasses oferecem comportamentos especializados a partir de elementos
básicos comuns, oferecidos pela superclasse. A utilização do conceito de
herança é muito interessante, pois promove um grande reuso e
reaproveitamento de código existente; Programadores podem definir classes
abstratas que determinam comportamentos genéricos . A superclasse abstrata
define e pode implementar parcialmente o comportamento de uma classe,
mas a maioria das informações da classe fica indefinida ou não é
implementada.
A herança múltipla ocorre quando uma classe pode estender características
de várias outras classes ao mesmo tempo, ou seja, quando a subclasse
possui mais de uma superclasse. Algumas linguagens evitam utilizar este
mecanismo, pois pode levar uma codificação confusa o que dificulta a
manutenção do código. A linguagem Java não suporta herança múltipla,
apenas herança simples. Já a linguagem C++ oferece suporte á herança
múltipla.
Uma linguagem ao utilizar herança múltipla está sujeita a dois problemas:
colisão de nomes (nomes idênticos nas classes superiores) e herança
repetida (classe herda de uma classe superior que herda de uma classe
comum);
7. Polimorfismo
Segundo a terminologia de orientação a objetos, polimorfismo significa que
uma mesma mensagem enviada a diferentes objetos resulta em um
comportamento que é dependente da natureza do objeto que está recebendo a
mensagem. Ou seja, duas ou mais classes derivadas de uma mesma
superclasse podem invocar métodos que têm a mesma assinatura (nome, lista
de parâmetros e retorno), mas comportamentos distintos, especializado
para cada classe derivada, usando para tanto uma referência a um objeto
do tipo superclasse.
A decisão sobre qual método deve ser selecionado, de acordo com o tipo da
classe derivada, ´e tomada em tempo de execução por meio do mecanismo
de ligação tardia. No caso do polimorfismo, é necessário que os métodos
tenham exatamente a mesma identificação, sendo utilizado o mecanismo
de redefinições de métodos. A seguir um exemplo de polimorfismo.

public abstract class OperacaoMatemática


{
public abstract double calcular(double x, double
y);
}
public class Soma extends OperacaoMatematica
{
public double calcular(double x, double y)
{
return x+y;
}
}
public class Subtracao extends OperacaoMatematica
{
public double calcular(double x, double y)
{
return x-y;
}
}
public class Contas
{
public static void
mostrarCalculo(OperacaoMatematica operacao, double
x, double y)
{
system.out.println("O resultado é: " +
operacao.calcular(x, y);
}
public static void main( String args[] )
{
//Primeiro calculamos uma soma
Contas.mostrarCalculo(new Soma(), 5, 5); //Imprime
o resultado é: 10
Contas.mostrarCalculo(new Subtracao(), 5, 5); //
Imprime o resultado é: 0
}
}

Note que, embora o método calcular tenha sido chamado duas vezes no
interior de mostrarCalculo, o comportamento apresentado variou de acordo
com a classe ao qual ele representava no momento.
Os benefícios do polimorfismo são: a clareza e manutenção do código, a
divisão da complexidade e aplicações flexíveis.
Algumas linguagens promovem o polimorfismo principalmente por meio
do uso de classes abstratas e interfaces, como é o caso da linguagem Java.

8. Sobrecarga
A sobrecarga é um tipo de polimorfismo que permite a existência de vários
métodos de mesmo nome, por´em com assinaturas levemente diferentes, ou
seja, variando no número e tipo de argumentos e o valor de retorno. Ficará
a cargo de o compilador escolher de acordo com as listas de argumento os
procedimentos ou métodos a serem executados. Por exemplo:
public class Soma
{
public int Soma (int x, int y)
{
return x+y;
}
public String Soma (String x, String y)
{
return x+y;
}
public double Soma (double x, double y)
{
return x+y;
}
}

9. Interfaces
Uma interface é uma coleção de definições de métodos abstratos (sem
implementação). É utilizada para os objetos interagirem entre si. A classe
que implementa a interface deve implementar todos os métodos definidos
na interface. Uma interface, também, pode incluir declarações de constantes.
Apesar de uma classe abstrata implementar métodos abstratos, não se
pode confundir interface com classe abstrata. As classes abstratas não
podem ser instanciadas, e estas só são utilizadas como superclasses. Por
exemplo, comida no mundo real. Não existe uma instância (objeto) do
tipo comida. O que existe são instâncias de cenouras, maçãs, bananas, etc.
Comida representa o conceito abstrato e não é capaz de criar uma instância
própria. As classes abstratas podem possuir métodos implementados.
Em Java, para definir uma interface utiliza-se a palavra interface. Embora,
uma classe não possa conter mais de uma superclasse, a classe pode
implementar mais de uma interface. Por este motivo, muitas das vezes as
interfaces são apresentadas como uma alternativa para herança múltipla
de classes.

10. Pacotes
Para tornar as classes mais fáceis de serem encontradas e utilizadas, para
evitar conflitos de nomes e para controlar o acesso, pode-se agrupar classes
relacionadas em pacotes (packages). Os pacotes organizam as classes e as
interfaces relacionadas. Cada pacote criado corresponde a um diretório,
ou seja, as classes e as interfaces de um mesmo pacote devem estar em um
mesmo diretório.
A utilização de pacotes proporciona as seguintes vantagens:
Fica mais fácil para outros programadores determinar quais classes e
interfaces estão relacionadas; Os nomes das classes de um pacote não irão
conflitar com nomes e classes de outros pacotes; Pode-se permitir que
classes dentro de um mesmo pacote tenham acesso irrestrito entre si, e
restringir o acesso por parte de classes definidas fora do pacote.
Em Java, para criar um pacote coloca-se a palavra chave package no início
do arquivo onde a classe ou interface é definida.
Obs.: Apenas os membros (classe, variáveis e métodos) públicos são
acessíveis fora do pacote onde foram definidos.
Obs.: Para uma linguagem ser considerada verdadeiramente orientada a
objetos, a linguagem de programação deve oferecer, no mínimo, as caracter
ísticas de: encapsulamento, herança e polimorfismo.

3. Princípios de programação orientada a objetos

Basicamente, os princípios de programação orientada a objetos são:


Classes, objetos e instâncias; Campos, métodos e propriedades; Sobrecarga;
Herança e classes hierárquicas; Polimorfismo; Interfaces.
4. Tratamento de exceções
O termo exceção é usado para designar um evento que ocorre durante a
execução de um programa que desvia o fluxo normal de instruções. Em
outras palavras, uma exceção é uma condição provocada por uma situação
excepcional que requer uma ação específica imediata. Muitos tipos de erros
podem causar exceções:
problemas que variam desde erros sérios de hardware, tal como uma falha no
disco rígido, a erros simples de programação, tal como tentar acessar um
índice inexistente de um vetor, divisão por zero, um objeto não inicializado,
etc. Erros causam exceções, mas podem existir exceções que não são erros.
Por exemplo, numa função que lê dados de um arquivo, a chegada ao final do
arquivo é uma condição excepcional que pode ser considerada como exceção.
Linguagens como ADA, C++, JAVA e EIFFEL possuem mecanismos
próprios de tratamento de exceções que facilitam a vida dos programadores
tornando ainda o código mais legível uma vez que separam o código
principal do código de tratamento do erro.
Quando uma exceção ocorre, ela necessita ser tratada. A unidade ou bloco
de código que manipula a exceção é denominada tratador de exceção e a ação
de indicar a ocorrência de exceção e transferir o controle para o tratador de
exceção é denominada sinalização da exceção.
Tratadores de exceção se comportam como procedimentos chamados
implicitamente pela ocorrência de uma exceção. Como tratadores de exceção
não são chamados diretamente, eles não possuem nome. Em sua definição
costumam conter variáveis locais e bloco de código de tratamento. Já as
exceções devem possuir nome bem definido para que possam ser
identificadas.
Caso o tratador que capturou a exceção não tenha conhecimento suficiente
para tratar a exceção ele pode lançar a exceção para um nível superior
(propagação da exceção). Assim pode-se gerar uma cadeia de propagação até
que um tratador capture a exceção ou até atingir-se o nível mais alto da
hierarquia dos tratadores onde normalmente um tratador padrão será
executado na saída do programa.
Outra questão importante é o ponto de retorno após a execução do bloco
de código do tratador. Isto dependerá do modelo de continuação adotado pelo
mecanismo de tratamento de exceção. Em geral, adota-se um dos seguintes
modelos de continuação:
Terminação: assume que o erro é crítico e que não existem condições de
retornar ao ponto onde a exceção foi gerada, retornando o controle para o
nível
superior. Nesta alternativa a unidade onde ocorreu a exceção e todas as
unidades na pilha de chamada de subprogramas até onde o tratador de
exceção foi executado são encerradas, continuando-se a execução do
programa na unidade onde o tratador foi encontrado, após a região de
tratamento;
Retomada: assume-se que o erro pode ser corrigido e a execução pode
retornar para o bloco onde ocorreu a exceção. Portanto, o retorno é feito para
o bloco gerador do erro.
Embora, em princípio, essa solução pareça ser a mais apropriada, a
experiência tem mostrado que essa alternativa raramente é efetiva.
Normalmente, as linguagens têm adotado o modelo de terminação. Em Java,
a exceção é um tipo especial de objeto que ´e criado quando algo sai de
errado em um programa. Após criar uma exceção, o ambiente de execução
envia este objeto ao seu programa, numa ação denominada levantar uma
exceção. É responsabilidade do programa capturar esta exceção. Para
capturar uma exceção utilizam-se as cláusulas try (blocos de códigos
protegidos) e catch (tratadores de exceções). Para passar para frente a
exceção, utiliza-se a palavra trhows. As exceções em Java são instâncias da
classe Exception (superclasse) ou de suas herdeiras.

Você também pode gostar