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