Slides - DAI - Ifma
Slides - DAI - Ifma
Slides - DAI - Ifma
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Paradigma e Programação Orientada<br />
a Objetos<br />
Prof. João Carlos Pinheiro<br />
jcpinheiro@ifma.edu.br<br />
Modelo Computacional do Paradigma<br />
Orientado a Objetos<br />
Entrada Programa Saída<br />
Estado<br />
.<br />
Entrada Programa Saída<br />
Estado<br />
Entrada Programa Saída<br />
Estado<br />
.<br />
...<br />
Entrada Programa Saída<br />
Entrada Programa Saída<br />
Estado<br />
.<br />
Estado<br />
1<br />
O Paradigma Orientado a Objetos<br />
Não é um paradigma no sentido estrito: é<br />
uma subclassificacão do imperativo<br />
A diferença é mais de metodologia quanto à<br />
concepção e modelagem do sistema<br />
A grosso modo, uma aplicação é estruturada<br />
em módulos (classes) que agrupam um estado<br />
(atributos) e operações (métodos) sobre este<br />
Classes podem ser estendidas e/ou usadas<br />
como tipos (cujos elementos são objetos)<br />
Aprendendo Orientação a Objetos<br />
Linguagens de Objetos permitem vantagens, não as<br />
fornecem<br />
O difícil não é aprender uma linguagem OO.<br />
O problema é que leva tempo para explorar as vantagens<br />
que as linguagem orientada a objetos fornecem (Martin<br />
Fowler e Kendall Scott – UML Essencial)<br />
Para alcançar estas vantagens é necessário fazer a troca de<br />
paradigma<br />
Influenciam nossa percepção; ajudam-nos a organizar e a coordenar a<br />
Classes estimulam projeto centrado em dados:<br />
modularidade, reusabilidade e extensibilidade.<br />
Fonte: Augusto Sampaio<br />
maneira como desenvolvemos software<br />
Aceitação comercial crescente http://www.cin.ufpe.br/~acas<br />
4<br />
1
Introdução à Orientação a Objeto (OO)<br />
É um conjunto de princípios que guiam a construção<br />
de um software<br />
A Orientação a objetos organiza o mundo real como<br />
uma coleção de objetos que incorporam estrutura de<br />
dados e comportamento<br />
Classe em Java<br />
class Conta {<br />
}<br />
String numero;<br />
double saldo;<br />
void creditar (double valor) {<br />
}<br />
saldo = saldo + valor;<br />
void debitar (double valor) {<br />
}<br />
saldo = saldo - valor;<br />
Atributos<br />
Métodos<br />
5<br />
7<br />
Definição de Classe<br />
Uma classe descreve um conjunto de objetos com<br />
propriedades semelhantes (atributos)<br />
comportamentos semelhantes (métodos)<br />
relacionamentos comuns com outros objetos<br />
Exemplo de classes em um Acervo<br />
Livro, Periódico, Artigo, Autor, Bibliotecário, Usuário<br />
Observe que podem existir vários livros (objetos) de<br />
uma mesma classe “Livro”<br />
Definição de Objetos<br />
Um objeto é uma entidade (física, conceitual ou do<br />
domínio de algum problema ) com escopo e identidade<br />
bem definidos que encapsulam Estado e<br />
Comportamento<br />
Exemplo: “o carro vermelho ali no estacionamento”<br />
6<br />
8<br />
2
Definição de Objetos -<br />
Exemplo: Dois Objetos Círculo<br />
Fonte: David J. Barnes & Michael Kölling. Programação orientada a objetos com Java.<br />
Pearson Education do Brasil, 2004. 9<br />
10<br />
Propriedades de um Objeto<br />
Objetos têm estado (representado pelos atributos)<br />
Um livro têm um número de classificação, um título,<br />
autores<br />
Um Usuário tem um nome, um endereço<br />
O estado do objeto normalmente muda ao longo do<br />
tempo<br />
11<br />
Definição de Objetos<br />
Objetos têm responsabilidades<br />
Responsabilidade de saber certas coisas<br />
Responsabilidades de fazer certas coisas<br />
Objetos colaboram para desempenhar suas<br />
responsabilidades<br />
Propriedades de um Objeto<br />
Objetos de uma mesma classe têm um mesmo<br />
comportamento<br />
Usuários altera seu endereço, fazem empréstimos<br />
Bibliotecário cadastra novos livros no acervo<br />
Objetos podem estar relacionados<br />
Um Livro pode ter vários Autores<br />
12<br />
3
Propriedades de um Objeto<br />
Objetos têm identidade<br />
Cada objeto tem uma identidade única, mesmo<br />
que o estado seja idêntico para ambos os objetos<br />
Cada objeto é diferente do outro (tem estado<br />
próprio) e cada um tem seu próprio tempo de vida<br />
Diferença entre classe e objeto<br />
Relacionamentos entre objetos são dinâmicos e podem<br />
mudar<br />
O funcionamento da aplicação reflete a lógica de<br />
relacionamento entre os objetos, e não entre as<br />
classes<br />
Classes não existem no contexto da execução<br />
A classe tem papel na criação dos objetos, mas não<br />
existe quando os objetos trocam mensagens entre si<br />
13<br />
15<br />
Diferença entre classe e objeto<br />
“Classe” é um gabarito (como a planta de uma casa)<br />
“Objeto” é a concretização do gabarito (Exemplo:<br />
casas feitas a partir da mesma planta)<br />
Relacionamentos entre classes são definidos na<br />
programação e não mudam durante a execução<br />
Criando Instâncias (Objetos)<br />
Forma geral da declaração e criação de objetos em<br />
Java<br />
Declaração<br />
Conta conta1, conta2;<br />
Criação<br />
conta1 = new Conta ();<br />
Combinando declaração e criação<br />
Conta conta1 = new Conta ();<br />
14<br />
16<br />
4
Ex.: programa que cria e manipula conta<br />
class CriaConta {<br />
}<br />
/* Criando um objeto do tipo Conta */<br />
public static void main (String [] args) {<br />
}<br />
Conta conta1 = new Conta ();<br />
conta1.numero = “21.342-7”;<br />
conta1.saldo = 0;<br />
conta1.creditar (500.87);<br />
conta1.debitar (45.00);<br />
System.out.println(conta1.saldo);<br />
Abstração<br />
Abstração significa supressão de detalhes, ponto de<br />
vista elevado<br />
O que consideramos é a interface ao invés da<br />
implementação, ou seja, uma abstração se<br />
concentra no serviço que o objeto presta, não como<br />
executá-lo<br />
A abstração OO permite modelar elementos no<br />
espaço do problema<br />
17<br />
19<br />
Construtores<br />
Servem como interfaces para iniciar objetos possuem o<br />
mesmo nome das respectivas classes similares a<br />
métodos, mas não têm tipo de retorno<br />
class Conta {<br />
String numero;<br />
double saldo;<br />
Conta(String n) {<br />
numero = n;<br />
saldo = 0;<br />
}<br />
void creditar(double valor) {saldo += valor; }<br />
void debitar(double valor) {saldo -= valor; }<br />
}<br />
Abstração<br />
Há simplificações quando pensamos no<br />
comportamento dos objetos em relação ao mundo<br />
real, pois:<br />
Não vamos modelar todo o comportamento dos objetos<br />
Exemplo: Clientes esperam em uma fila, brigam com os<br />
funcionários do banco, mas provavelmente não no<br />
software<br />
18<br />
20<br />
5
Abstração<br />
Na Programação Orientada a Objeto (POO)<br />
Comportamentos são associados aos objetos que<br />
possuem os atributos afetados pelo comportamento,<br />
ou seja, quem faz algo é o expert nos dados envolvidos<br />
Exemplo<br />
A responsabilidade de alterar o nome do livro será<br />
atribuída ao Livro e não ao Bibliotecário, embora, no<br />
mundo físico, seja o Bibliotecário quem faz a<br />
alteração<br />
Encapsulamento<br />
O Encapsulamento é a mola mestra da abstração<br />
Coloca tudo da abstração (atributos e comportamento) dentro<br />
de uma “capsula” e força o acesso às partes internas apenas<br />
através de uma interface pública (métodos)<br />
Em outras palavras, abstração é o que se quer, encapsulamento<br />
é uma forma de fazê-lo<br />
No paradigma procedural os dados ou são globais ou são passados<br />
por parâmetro aos procedimentos<br />
Enquanto que na orientação a objetos<br />
os dados e procedimentos (funções)<br />
fazem parte de uma única entidade<br />
(objeto)<br />
21<br />
23<br />
Princípios Básicos da Orientação a<br />
Objetos<br />
Benefícios do Encapsulamento<br />
Flexibilidade e Facilidade de manutenção<br />
Se você quiser obter estes benefícios é necessário:<br />
Manter as variáveis de instância protegidas (como o<br />
modificador de acesso private)<br />
Criar métodos de acesso público<br />
Utilize as conversões adotadas pelos “JavaBeans”<br />
(set e get)<br />
22<br />
24<br />
6
Benefícios do Encapsulamento<br />
Exemplo de como não se deve fazer<br />
public class BadOO {<br />
public int tamanho;<br />
public int peso;<br />
. . .<br />
}<br />
public class UtilizaBadOO {<br />
public static void main(String []a)<br />
b = new BadOO( );<br />
b.tamanho = -5;<br />
}<br />
}<br />
3. Retenção de Estado<br />
É a propriedade pela qual um objeto pode reter informações<br />
indefinidamente, inclusive durante os intervalos de ativação de<br />
suas operações<br />
A reutilização de pedaços é mais difícil usando a programação<br />
estruturada (modularização via funções) porque não posso usar<br />
coisas pré-existentes tão facilmente<br />
Com objetos, posso dizer: "me dê dois daqueles" porque objetos<br />
têm estado<br />
Não se pode fazer isso com funções porque elas não encapsulam<br />
estado<br />
25<br />
27<br />
Benefícios do Encapsulamento<br />
Solução<br />
public class BadOO {<br />
private int tamanho;<br />
private int peso;<br />
public void setTamanho(int t){<br />
if(t > 0)<br />
tamanho = t;<br />
else<br />
tamanho = 0;<br />
}<br />
...<br />
}<br />
Ocultação de Informações e Implementações<br />
Constitui o desfecho de um bom encapsulamento<br />
Vantagem<br />
Facilitar mudanças isolando pedaços uns dos outros<br />
(reduzindo o acoplamento)<br />
4. Identidade de Objetos<br />
É a propriedade pela qual cada objeto (independente de sua<br />
classe ou seu estado) pode ser identificado e tratado como uma<br />
entidade distinta de software (Meilir Page-Jones – Fundamentos<br />
do Desenho Orientado a Objetos com UML)<br />
conta1 = new Conta ();<br />
conta2 = new Conta ();<br />
Esta idéia simples provoca uma profunda mudança na forma<br />
como desenhamos e construímos software orientado a objetos<br />
26<br />
28<br />
7
5. Mensagens<br />
Consiste do nome de uma operação definida para o<br />
objeto destinatário, juntamente com quaisquer<br />
argumentos passados ao objeto<br />
Exemplo<br />
conta1.creditar(100);<br />
conta1.debitar(50);<br />
7. Herança<br />
Uma maneira de expressar a herança é pelo termo<br />
É-UM<br />
Fusca É-UM Carro<br />
Gerente É UM Funcionario<br />
Na linguagem java a palavra reservada extends<br />
representa este relacionamento É-UM<br />
public class Funcionario {<br />
. . .<br />
}<br />
public class Gerente extends Funcionario {<br />
. . .<br />
}<br />
29<br />
31<br />
6. Classes<br />
Só para relembrar<br />
Classe é o que você desenha e programa (tempo de<br />
compilação)<br />
Objeto é o que você cria (a partir de uma classe) em<br />
tempo de execução (rum-time)<br />
8. Polimorfismo<br />
A palavra polimorfismo origina-se de duas palavras gregas<br />
que significam, respectivamente, muitas e forma<br />
Definição<br />
É a habilidade pela qual uma única operação ser<br />
definida em mais de uma classe e assumir<br />
implementações diferentes em cada uma das classes<br />
(mas a interface é igual para todas as implementações)<br />
Faz com que o que estamos vendo pareça mais simples<br />
30<br />
32<br />
8
Exemplo<br />
public interface Funcionario {<br />
public double calcularSalario();<br />
}<br />
public class Gerente implements Funcionario {<br />
private static final int SALARIO = 40000;<br />
public double calcularSalario() {<br />
return SALARIO;<br />
}<br />
}<br />
public class Programador implements Funcionario {<br />
private static final double SALARIO = 50000;<br />
private static final int BONUS = 10000;<br />
public double calcularSalario() {<br />
return SALARIO;<br />
}<br />
public int getBonus() { return BONUS; }<br />
}<br />
33<br />
Alterando este exemplo para utilizar polimorfismo<br />
E se você quiser incluir outro tipo de Funcionário?<br />
Considere que você precisa incluir uma classe<br />
Executivo no seu sistema<br />
Com o projeto atual, você terá que mudar a<br />
implementação do método<br />
calcularFolhaPagamento() para verificar também<br />
a instanceof da classe Executivo<br />
35<br />
public class FolhaPagamento {<br />
}<br />
public double calcularFolhaPagamento(Funcionario emp) {<br />
}<br />
double sal = emp.calcularSalario();<br />
if(emp instanceof Programador)<br />
sal += ((Programador)emp).getBonus();<br />
return sal;<br />
public static void main(String arg[]) {<br />
}<br />
FolhaPagamento fp = new FolhaPagamento();<br />
Programador prg = new Programador();<br />
Gerente mgr = new Gerente();<br />
System.out.println("Salário do Programador " +<br />
fp.calcularFolhaPagamento(prg));<br />
System.out.println("Salário do Gerente " +<br />
fp.calcularFolhaPagamento(mgr));<br />
Alterando este exemplo para utilizar polimorfismo<br />
Esse projeto possui vários problemas<br />
Primeiro, ele não é elegante ou facilmente<br />
extensível<br />
Segundo, requer que o programador que escreveu o<br />
código faça o trabalho do sistema de runtime do<br />
Java<br />
Uma maneira melhor de permitir que o sistema de<br />
Runtime do Java descubra tudo isso para você<br />
Isso gera um projeto mais claro e elegante, além de<br />
um código mais fácil de ser entendido<br />
36<br />
9
Nova Solução<br />
public interface Funcionario {<br />
public double calcularSalario();<br />
public int bonus();<br />
} public class Gerente implements Funcionario {<br />
private static final int SALARIO = 40000;<br />
private static final int BONUS = 0;<br />
public double calcularSalario() {<br />
return SALARIO;<br />
}<br />
public int getBonus( ) { return BONUS; }<br />
} public class Programador implements Funcionario {<br />
private static final double SALARIO = 50000;<br />
private static final int BONUS = 10000;<br />
public double calcularSalario() {<br />
return SALARIO;<br />
}<br />
public int getBonus() { return BONUS; }<br />
}<br />
Bibliografia Consultada<br />
Meilir Page-Jones. Fundamentos do Desenho Orientado<br />
a Objetos com UML (capítulo 1)<br />
Martin Fowler e Kendall Scott. UML Essencial<br />
Cay S. Horstmann e Gary Cornell. Core Java –<br />
Fundamento. Volume I<br />
<strong>Slides</strong>: Curso Java – UFPE – Programação Orientada a<br />
Objetos. Autor: Paulo Borba<br />
39<br />
public class FolhaPagamento {<br />
public double calcularFolhaPagamento(Funcionario emp) {<br />
// Calcula o bônus. Não é preciso verificar com instanceof<br />
return emp.calcularSalario() + emp.bonus();<br />
}<br />
public static void main(String arg[]) {<br />
FolhaPagamento fp = new FolhaPagamento();<br />
Programador prg = new Programador();<br />
Gerente mgr = new Gerente();<br />
System.out.println("Salário do Programador " +<br />
fp.calcularFolhaPagamento(prg));<br />
System.out.println("Salário do Gerente " +<br />
fp.calcularFolhaPagamento(mgr));<br />
}<br />
}<br />
10