Exemplo - Cheli Mendes Costa
Download
Report
Transcript Exemplo - Cheli Mendes Costa
Curso de Aprendizado Industrial
Desenvolvedor WEB
Disciplina: Programação Orientada a Objetos I
Professora: Cheli Mendes Costa
Programação Orientada a Objetos
PROGRAMACÃO ORIENTADA A
OBJETOS(cont.)
Encapsulamento ou Encapsulação
Significa esconder informações. Objetiva-se com o
encapsulamento, proteger o estado e o comportamento
interno do objeto, disponibilizando somente uma
camada de interface com o ambiente externo para que
seja efetuado a comunicação com o objeto.
Encapsulamento ou Encapsulação
Interface
publica
Estado +
Comportamento
Representação gráfica de um objeto
O reflexo do encapsulamento na Orientação a Objeto,
é que todo o objeto na sua estrutura elementar possui
uma membrana de proteção ao longo de seu núcleo. O
acesso ao estado e comportamento só é permitido
através da passagem pela camada de comunicação
representada pela membrana.
Em programação, somente a assinatura do
método, ou seja, a chamada da função está
publicada na interface. O conjunto da assinatura
de todos os métodos também é conhecida como
Application Programming Interface (API).
Para um desenvolvedor utilizar objetos é
necessário que ele conheça somente API dos
mesmos. A complexidade de como um objeto foi
implementado, esta encapsulada, não sendo
relevante neste processo.
Exemplo 1
Visão do mundo real:
• Sempre escondemos do mundo externo alguns atributos
pessoais;
• Definimos, através de ações se iremos ou não externar
estes atributos.
A namoradinha
O Cunhado
Salário/2
salário/10
getSalário
Salário
Salário*0.3
O Leão do Imposto de Renda
Exemplo 2
Pode-se ilustrar esta situação através da seguinte
análise. Quando se dirige um carro é necessário
compreender como o motor funciona com todas as suas
“milhares” de peças.
O motorista abstrai a complexidade interna do motor e
fixa-se na interface disponibilizada por quem construiu
o Carro, portanto as interfaces seriam os pedais de
aceleração, freio e embreagem, painel com medidor
de velocidade,etc.
Escopo do Mundo Real
Pessoas
Objeto complexo
Escopo do Mundo Real
Pessoas
Objeto menos complexo
Abstração de um objeto do mundo real
Uso da Abstração
A definição básica sobre a abstração é supressão de
detalhe, visando controlar a complexidade das
características essenciais. Na orientação a Objeto
pode-se aplicar este conceito no processo de
especificação, construção e uso de classe.
No processo de especificação é necessário, pois os
objetos identificados no mundo real normalmente são
muitos complexos .
Por exemplo:
Imagine o que seria modelar uma “ classe pessoa” com
todos os atributos e comportamentos?
Para a redução da complexidade da classe pessoa é
necessário delimitar o escopo com base no domínio do
sistema que esta pessoa será modelada,considerando
somente os aspectos relevantes.
Por exemplo
Para um sistema acadêmico uma pessoa pode representar
um aluno, sendo neste escopo somente necessário os
atributos nome, matricula e idade. As demais
características que não são essenciais nesse contexto
serão abstratas .
Como os detalhes ficam internos e escondidos no objeto.
Pessoa pode-se subentender que este objeto possui
quaisquer características de uma Pessoa do mundo real.
A abstração também se aplica na construção de uma
classe.
Uma primeira etapa é definir toda a interface da classe,
ou seja como os componentes externos irão interagir com
a classe e qual o comportamento esperado pela mesma.
O objetivo nesta etapa é somente a de definir a interface,
ficando no que a classe deve fazer e não como a interface
será implementada.
Muitas vezes definimos uma classe que não representa
verdadeiramente algo do mundo real que precise ser
instanciado (usado em programas).
É o caso da classe Funcionário criada neste exemplo. Na
prática, objetos do tipo Funcionario nunca serão usados,
pois instanciaremos apenas objetos a partir de Gerente e
Secretaria. Funcionário é apenas uma classe que surgiu da
necessidade de uma generalização. Classes assim são
chamadas de abstratas.
Exemplo de
abstração
Portanto, abstrai-se a implementação interna
e
concentra-se na especificação da interface que representa
o protocolo de comunicação com o externo.
Um
critério de programação para a redução de
acoplamento é programar para uma interface e não para
uma implementação. Com a interface bem definida, podese abstrair o mundo externo e focar-se em como realizar o
que foi especificado na interface.
Herança de Classe
Uma classe pode representar genericamente uma ou mais
classe. Assim, classes podem ser definidas a partir de uma classe
pai. O recurso de herança estabelece que uma classe que
herda de outra classe possui todas as suas características,
atributos e comportamentos.
Semelhante a herança genética do mundo real, a onde filhos
mantém as características dos pais, a classe pai também
denominado com superclasse, pois passa todas
as
características para a classe filha.
A classe filha ou subclasse além de conter os atributos e
comportamentos da superclasse, pode acrescentar algo
especifico a sua funcionalidade ou reescrever ou redefinir
métodos da superclasse.
O termo overridden(reescrever) é utilizado quando a subclasse
reescreve ou redefine um método herdado da subclasse
Exemplo 2
Podem ser um pouco confuso, porque a subclasse tem
mais características que a superclasse
Subclasse é mais específica que a superclasse
Toda subclasse é um objeto da sua superclasse, mas
não vice-versa.
Usa-se formas de estruturas hierárquicas (árvores)
Uma superclasse pode ser ainda definida como uma
classe concreta (como quaisquer classe convencional)
ou uma Abstrata por definição não permitindo a
criação de objetos, portanto não é possível a criação
de instâncias a partir desta classe.
A criação de um objeto a partir de uma classe é
chamada de processo de instanciação.
A instanciação na realidade corresponde à
alocação da memória para armazenar informações
de um objeto, semelhante ao que ocorre na
declaração de uma variável qualquer.
Para realizar a instanciação de um objeto qualquer,
é usado o operador new(em java).
Enquanto a classe representa um modelo abstrato
que serve apenas como base, os objetos
representam modelos concretos.
A definição de uma classe como abstrata pode
parecer algo estranho, visto que uma estrutura das
funções principais de uma classe e a geração de
objetos .
A declaração de classe abstrata é algo comum e
deve ser utilizada quando não faz sentido a
geração de instancias da superclasse .
Métodos Abstratos
Métodos abstratos não possuem implementação e são
assinadas na classe abstrata.
As classes que herdam da classe abstrata, são obrigadas a
implementar os métodos abstratos herdados da
superclasse.
Exemplo
Tenho a classe abstrata Funcionario, com o método abstrato getBonificacao;
as classes Gerente e Presidente estendendo Funcionario e implementando o
método getBonificacao; e, por fim, a classe Diretor, que estende Gerente, mas
não implementa o método getBonificacao.
Analise !
De forma objetiva, uma classe abstrata serve apenas como
modelo para uma classe concreta (classe que comumente
usamos).
Os métodos abstratos definidos em uma classe abstrata o
que devem obrigatoriamente ser implementados em uma
classe concreta. Mas se uma classe abstrata herdar outra
classe abstrata, a classe que herda não precisa
implementar os métodos abstratos.
Para criarmos uma classe ou método abstrato usamos a
palavra-chave abstract.
Especialização e Generalização
Associados ao conceito de herança apresentam-se os
conceitos de Especialização e Generalização.
A especialização ocorre quando uma subclasse, além de
herdar
da superclasse, acrescenta características
especificas diferente da superclasse.
Já o conceito de generalização procede quando existem
classe que possuem características em comum e cria-se
uma classe genérica, ou seja uma superclasse que
englobe essas características.
Exemplo
Duas subclasse PessoaFisica e PessoaJuridica que
possuem atributos e um método em comum.Neste
caso aplica-se a generalização sobre os elementos em
comum encapsulando - os em uma superclasse Pessoa
que é uma abstração das subclasses.
Os atributos e métodos particulares das subclasses
PessoaFisica e PessoaJuridica é a especialização da
classe Pessoa.
Exemplo 1
Generalização
Especialização
Representação gráfica da Especialização e Generalização.
Exemplo 2
O uso de heranças é um recurso poderoso, mas mal
aplicado gera graves problemas nos projetos
Orientados a Objetos.
Muitos Professores já apresentaram ou ainda
apresentam a herança como o principal recurso da
Orientação a Objetos e a forma ideal para alcançar a
reutilização .
Orientação a objetos vai muito além de heranças e
que a reutilização pode ser alcançada através de
outros formas.
Nível de Acesso
Para determinar o nível de acesso dos elementos de
uma classe, são usados os qualificadores de acesso
public, private e protected. Por meio das restrições
de acesso é possível assegurar que certas variáveis de
instância tenham valores restritos que só podem ser
acessados da própria classe e não por intermédio de
classes externas, mantendo uma certa segurança com
relação à integridade do valor armazenado.
Dica: sempre defina os atributos de uma classe
como privados, a não ser que tenha uma boa
justificativa para não serem.
Tipos de Qualificadores de acessos
public
Estes atributos e métodos são sempre acessíveis
em todos os métodos de todas as classes. Este é
o nível menos rígido de encapsulamento, que
equivale a não encapsular.
private
Estes atributos e métodos são acessíveis
somente nos métodos (todos) da própria classe.
Este é o nível mais rígido de encapsulamento.
protected Estes atributos e métodos são acessíveis no
pacote, nos métodos da própria classe e suas
subclasses, o que será visto em Herança.
<default> Visível no pacote e na classe.
Exemplo em Java
public class Produto {
int codigo;
String nome;
double preco;
//métodos
}
Métodos, Métodos Construtor,
Sobrecarga e Polimorfismo
A forma como os objetos colaboram em um sistema
Orientado a objetos é feito basicamente através de troca
de mensagens.
As mensagens são utilizadas para comunicação entre
objetos para a troca de dados e realização de ações.
Ações são implementadas através de métodos que são
publicadas nas camadas de interface do objeto.
Em programação os métodos são as funções que possuem
um parâmetro de retorno ou não, sendo neste caso do tipo
void. Um método possui também um nome e seus
parâmetros
Exemplos:
Métodos
Por exemplo:
O método public double getDistancia(int x, int y)
enumerando os seus elementos estruturais.
public double getDistancia(int x, int y)
Modificador
Parâmetro de
retorno
Nome do
Método
Conjunto de
Parâmetros de
entrada
public class Pessoa{
// Atributos
private String nome;
private String sexo;
// Métodos
public void andar( ){
System.out.println[nome + “ está andando...”];
}
}
O conjunto nome mais parâmetros também é
conhecido como a assinatura do método Ou seja uma
assinatura é um método
Em uma classe não é possível a ocorrência de
métodos com a mesma assinatura, porém podem
existir métodos com o mesmo nome, mas parâmetros
diferentes.
class Conta {
// ... outros métodos e atributos ...
boolean saca(double valor) {
if
(this.saldo < valor) {
return false;
}
else {
this.saldo = this.saldo - valor;
return true;
}
}
}
Outro Exemplo
Comando em Java
This é usado para fazer auto-referência ao próprio
contexto em que se encontra. Resumidamente, this
sempre será a própria classe ou o objeto já
instanciado.
Esse conceito de auto-referência é importante para
que
possamos
criar
métodos
construtores
sobrecarregados e métodos acessores mais facilmente.
Método Construtor
O método construtor é um método especial que está
presente em todas as classes.
Este método deve possuir o mesmo nome da classe.
Por exemplo:
A classe Ponto poderia ter um método construtor public
Ponto() .
Além disso, diferente de outros métodos , o método
construtor não possui parâmetros de retorno, nem
mesmo a declaração void.
public class Pessoa{
// Atributos
private String nome;
private String sexo;
// construtores
Pessoa [String nome, String sexo]{
this.nome = nome;
this.sexo =sexo;
// Métodos
public void andar( ){
System.out.println(nome + “ está andando...”);
}
}
Exemplo
Em uma classe podem existir vários métodos
construtores desde que possuam parâmetros
diferentes.
Outras característica importante é em relação a
sua utilização.
Quando o objeto nasce , ou seja é instanciada a partir de
uma classe o primeiro método a ser executado é o
método construtor.
Como foi mencionado, uma classe obrigatoriamente tem
pelo menos um método construtor.
Sobrecarga ou overloanding
O conceito Sobrecarga ou overloanding é definido
com métodos em uma classe que possuem o mesmo
nome, mas parâmetros diferentes.
Ressaltando que pode-se ter vários métodos com o
mesmo nome, pois o que identifica um método é o
seu nome associado com os seus parâmetros.
Portanto, para uma classe Ponto existe a ocorrência de
sobrecarga de construtores
quando está têm os
métodos public Ponto() e public Ponto(int x , int y).
Observa-se a ocorrência de sobrecarga em métodos
construtores ou não.
A sobrecarga está sendo aplicada, por exemplo,
quando são declarados dois construtores para uma
mesma classe, sendo um sem parâmetros e outro com
parâmetros.
private double saldo;
public Conta(){
}
public Conta(double saldo){
this.saldo=saldo
}
}
Podemos, então , criar objetos dessa classe de dois modos :
Conta c= new Conta(); ou
Conta c= new Conta(100);
inicializando o saldo com algum valor
Polimofismo
Objetos no mundo real que estão sobre uma mesma
hierarquia podem possuir comportamentos definidos
pelos seus pais, mas realizá-las de forma particular.
Definimos Polimorfismo como um princípio a partir do
qual as classes derivadas de uma única classe base são
capazes de invocar os métodos que, embora
apresentem a mesma assinatura, comportam-se de
maneira diferente para cada uma das classes
derivadas.
Polimofismo
Com o Polimorfismo, os mesmos atributos e objetos
podem ser utilizados em objetos distintos, porém,
com
implementações
lógicas
diferentes.
Exemplos:
Podemos assumir que uma bola de futebol e uma
camisa da seleção brasileira são artigos esportivos,
mais que o cálculo deles em uma venda é calculado de
formas
diferentes.
Outro Exemplo
Uma superclasse FiguraGeometrica com o método public
double calculeArea(), notoriamente esta superclasse não
tem como responder a este método, pois a função desta
classe é ser um conceito genérico.
O objetivo desta classe é definir que todo figura
geométrica tem o comportamento de calculo de área .
Já a subclasse Quadrado e Triangulo vão possuir o método
de calculo de área , sendo que a implementação para
cada classe se dará de forma particular.
A importância de definir um conceito padronizado é
facilidade de absorver futuras mudanças.
a
Outro Exemplo
Podemos dizer que uma classe chamada Vendedor e
outra chamada Diretor podem ter como base uma classe
chamada Pessoa, com um método chamado CalcularVendas.
Se este método (definido na classe base) se comportar de
maneira diferente para as chamadas feitas a partir de uma
instância de Vendedor e para as chamadas feitas a partir de uma
instância
de
Diretor,
ele
será
considerado
um
método polimórfico, ou seja, um método de várias formas.
Assim
podemos
ter
método CalcularVendas:
na
classe
public decimal CalcularVendas()
{
decimal valorUnitario = decimal.MinValue;
decimal produtosVendidos = decimal.MinValue;
return valorUnitario * produtosVendidos;
}
base
o
Na classe Vendedor temos o mesmo método, mais com a
codificação diferente:
public decimal CalcularVendas()
{
decimal valorUnitario = 50;
decimal produtosVendidos = 1500;
}
return valorUnitario * produtosVendidos;
O mesmo ocorre na classe Diretor:
public decimal CalcularVendas()
{
decimal valorUnitario = 150;
decimal produtosVendidos = 3800;
decimal taxaAdicional = 100;
return taxaAdicional + (valorUnitario produtosVendidos);
}
Assim temos um mesmo método, com diferentes formas.
Outro Exemplo
Uma nova classe Retângulo que herda de FiguraGeometrica tem
também o método public double calculoArea() apesar do
método possuir a mesma assinatura a sua realização seguira as
características da classe Retângulo.
Conclui-se, que um comportamento pode ter varias formas de
ser respondido a depender do tipo de objeto, denominandose como polimórfico.
Analise !!
A vantagem do polimorfismo
acoplamento no projeto .
reflete-se
no
baixo
Um objeto pode estar acoplado a um objeto sem
necessariamente saber o seu tipo .
E o impacto com as mudanças no programa serão mínimas.