30.05.2013 Views

Slides - DAI - Ifma

Slides - DAI - Ifma

Slides - DAI - Ifma

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!