PROJETANDO CLASSES Dilvan Moreira (baseado no livro Big Java.

Slides:



Advertisements
Apresentações semelhantes
Soluções Iterativas com Laços
Advertisements

Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados.
Java - Interfaces Prof. Msc. Flávio Viotti.
Polimorfismo e Acoplamento Dinâmico
Polimorfismo e Classes Abstratas Profa
Programação Concorrente
Wagner Santos C. de Jesus
Modularização: funções e procedimentos
Classes e objetos P. O. O. Prof. Grace.
Classes, Objetos e Encapsulamento
Programação I Aula 2 (Métodos)
Entendendo as definições de classe
Chamada Remota de Procedimentos
Estudo de Caso: um editor de documentos
Professora Lucélia Oliveira
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos I Professora: Cheli Mendes Costa This.
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
Wagner Santos C. de Jesus
Programação Orientada à Objetos
UTFPR – Campus Curitiba - DAELN Cursos de Eng. Eletrônica/Eng
Orientação a Objetos usando Java
Java Kickstart, day 2 Semelhanças com linguagem C.
Aula Prática 4 Monitoria IP/CC (~if669).
1 Marcio de Carvalho Victorino JAVA. 2 Declaração de Atributos [ ] [transient] [volatile] [static] [final] ; controle de acesso –public, package (default),
Interfaces POO Avançado.
Classes Abstratas e Interface
Aula prática 3 Aprofundando em Funções Parâmetros de uma função Uso do return Execução Variáveis Global, local e estática Monitoria de Introdução à.
Herança e Arquitetura em camadas
Certificação Marco Antonio. Introdução A compreensão desse capítulo é muito importante pois trata de um assunto essencial em qualquer linguagem de programação,
Aula Prática 3 Funções Monitoria Introdução à Programação.
Copyright 2000, Departamento de Informática, UFPE. Todos os direitos reservados sob a legislação em vigor. Orientação a Objetos e Java.
Orientação a Objetos Paradigma. Davi Pires Revisão Dúvidas da aula passada? –Características de Java –Compilador vs. Interpretador.
2 – Revisão de Programação Orientada a Objetos
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota
Módulo II Capítulo 1: Orientação a Objetos
Paradigmas da Programação – Semestre 1 – Aula 7 Professor: Eduardo Mantovani )
José Antônio da cunha IFRN Administração de Banco de Dados.
Introdução POO Thiago Medeiros Sistemas de Informação Definição: Sistemas de Informação é uma combinação de pessoas, dados, processos, redes de.
COMPORTAMENTO SOFISTICADO Dilvan Moreira (baseado no livro Prog. Orientada a Objetos em Java)
1. 2 Programação Orientada a Objetos Prof. Maurício Rodrigues de Morais
1 Introdução aos Padrões de Projetos (na prática) Créditos: Lúbia Vinhas Hazel Carvalho Crato Adaptações: Prof. Nécio de Lima Veras.
Java Básico Lab Ruddá Beltrão | Cristian Costa.
INTERAÇÃO ENTRE OBJETOS Dilvan Moreira (baseado no livro Prog. Orientada a Objetos em Java)
GRASP: Projeto de Objetos com Responsabilidade. 2 Pauta Responsabilidades e métodos Responsabilidades e métodos Padrões Padrões GRASP: Padrões e princípios.
IFRN Técnico em Informática para Internet Desenvolvimento de Algoritmos Prof. Gilbert Azevedo.
Métodos e Técnicas de Desenvolvimento
Noções de projeto orientado a objetos - camadas Prof. Gustavo Wagner (alterações) Prof. Tiago Massoni (Slides originais) Desenvolvimento de Sistemas FATEC-PB.
Programação para Internet Aula 06 Linguagem Java (Orientação a Objetos – Atributos e Métodos)
Classes Abstratas e Interface. 2 Classe Abstrata  Uma classe abstrata serve apenas como modelo para uma classe concreta (classe que comumente usamos);
1 Interface (o termo) » Interface (a palavra reservada): Java estendeu o conceito de interfaces à um nível ainda mais flexível que permite construir entidades.
Polimorfismo com Interfaces Pacotes em Java Prof. Gustavo Wagner (Alterações) Prof. Tiago Massoni (Slides Originais) Desenvolvimento de Sistemas FATEC-PB.
Prof. Tertuliano Estrutura Condicional em C++
Laboratório de Computação Aula 05 – Array Prof. Fábio Dias
Laboratório de Computação Aula 06 e 07 – Implementação de classes Prof. Fábio Dias
MÉTODOS Dilvan Moreira (baseado no livro Big Java)
CONSTRUINDO CLASSES Dilvan Moreira (baseado no livro Big Java)
AULA Mais Herança Curso: Informática (Subseqüente) Disciplina: Programação Orientada a Objetos Prof. Abrahão Lopes
Padrões de Projeto Aula 14 – Padrão Abstract Factory.
Herança e Polimorfismo Prof. Gustavo Wagner (Alterações) Prof. Tiago Massoni (Slides Originais) Desenvolvimento de Sistemas FATEC-PB  Centro de Informática,
Lógica de programação Estruturas de seleção Estruturas de repetição Sub-Rotinas 1.
HERANÇA E POLIMORFISMO Dilvan Moreira (baseado no livro Big Java e T. Munzner)
Padrões de Projeto Aula 15 – Padrão Command. PADRÃO COMMAND Encapsulando a chamada de métodos com o padrão Command. 2.
PROGRAMAÇÃO ORIENTADA A OBJETOS EM C++ PAE: Pedro Shiguihara Professor: Dilvan Moreira.
IF E ITERAÇÃO WHILE Dilvan Moreira (baseado no livro Big Java e T. Munzner)
PROGRAMANDO SEM POO EM JAVA Dilvan Moreira (baseado no livro Big Java)
VARIÁVEIS EM JAVA Dilvan Moreira (baseado no livro Big Java)
PROGRAMAÇÃO FUNCIONAL COM SCALA Leonardo Lucena IFRN
CLASSES EM JAVA Dilvan Moreira (baseado no livro Big Java)
MUTAÇÃO DE INTERFACE (MI) JACKSON ANTONIO DO PRADO LIMA SILVIA REGINA VERGILIO.
Aula 5 - Métodos. Desenvolvimento de Programas A melhor forma de construir programas grandes é dividi-los em programas menores que executam tarefas específicas.
Transcrição da apresentação:

PROJETANDO CLASSES Dilvan Moreira (baseado no livro Big Java

Leitura  Capítulo 7 (1st Edition)

Objetivos  Entender:  Coesão  Acoplamento  Efeito Colateral

Lembrando: Herança  Herança: processo pelo qual estendemos uma classe existente para criar uma nova  princípio fundamental de POO  Subclasses herdam todas as variáveis da classe pai  Mas variáveis privadas não podem ser diretamente usadas pela classe filha

Lembrando: Herança public class CokeMachine2010 extends Cokematic { public void buyManyCokes(int num) {... }  Variáveis e métodos da classe Cokematic são incluidos na definição de CokeMachine2010  eles não aparecem na definição de CokeMachine2010, mas estão lá !  isso acontece por causa do comando extends

Lembrando: Polimorfismo  Capacidade de executar um método sem saber a que classe um objeto pertence  O que eu preciso saber sobre mymachines[i] ? for (int i = 0; i < mymachines.length; i++) { if (mymachines[i] != null) { mymachines[i].vandalize(); }  Herança + Method Overloading (substituição de método)  Uma das formas de implementar polimorfismo  Outra: Interfaces (veremos em breve)

Lembrando: Substituição de Métodos  Se uma classe filha define um método com a mesma assinatura que o pai: mesmo nome e parâmetros de entrada.  esse método da filha substitui o método do pai lembre: assinatura envolve número, tipo e ordem dos parâmetros

Lembrando: Substituição de Métodos  Se uma classe filha define um método com a mesma assinatura que o pai: mesmo nome e parâmetros de entrada.  esse método da filha substitui o método do pai lembre: assinatura envolve número, tipo e ordem dos parâmetros  Escrever seu próprio método toString() para uma classe substitui o método toString() herdado  Opps, herdado de quem?

Lembrando: Classe Object  Herdado de quem?  Em Java, todas as classes que não são explicitamente extendidas de outras classes são, por default, extendidas da classe Object A classe Object inclui o método toString()  assim... cabeçario de classe public class myClass  na verdade quer dizer public class myClass extends Object

Escolhendo Classes  Uma classe representa um único conceito de um domínio  O nome de uma classe deve ser um substantivo que descreve esse conceito:  Conceitos matemáticos: Point Rectangle Ellipse  Conceitos da vida real: BankAccount CashRegister

Escolhendo Classes  Atores (terminando em in -er, -or) – objetos que fazem algum tipo de trabalho para você Scanner Random // better name: RandomNumberGenerator  Classes utilitárias – sem objetos, apenas métodos estáticos e constantes Math  Iniciadoras de Programas – apenas tem o método main  Importante! Não transforme ações em classes: Paycheck é melhor que ComputePaycheck

Coesão  Uma classe deve representar um único conceito  A interface de uma classe é coesa se todas as suas funcionalidades estão relacionadas com o conceito que a classe representa

Coesão  Essa classe não tem coesão: public class CashRegister { public void enterPayment(int dollars, int{ quarters, int dimes, int nickels, int pennies)... public static final double NICKEL_VALUE = 0.05; public static final double DIME_VALUE = 0.1; public static final double QUARTER_VALUE = 0.25;... }  Por quê?

Coesão  CashRegister representa dois conceitos: caixa registradora e moeda  Solução: Faça duas classes: public class Coin { public Coin(double aValue, String aName){…} public double getValue(){…}... } public class CashRegister { public void enterPayment(int coinCount, Coin coinType) {... }... }

Acoplamento  Uma classe depende de outra se ela usa objetos dessa classe  CashRegister depende de Coin para determinar o valor de um pagamento  Coin não depende de CashRegister  Alto acoplamento = muita dependência entre classes  Minimize acoplamento para minimizar o impacto de mudanças nas interfaces das classes

Acoplamento: Diagrama de Classes  Para visualizar relações entre classes:  UML: Unified Modeling Language. Notation for object-oriented analysis and design

Acoplamento

Métodos de Acesso e Modificadores  Acesso: Não mudam o estado do objeto double balance = account.getBalance();  Modificador: modifica o objeto quando invocado account.deposit(1000);  Classe Imutável: não tem métodos modificadores String name= "John Q. Public”; String uppercased= name.toUpperCase(); //não muda  É seguro passar referências para objetos de classes imutáveis, já que nenhum codigo pode modifica-los.

Efeito Colateral  Efeito colateral de um método: qualquer modificação de dados observável externamente public void transfer(double amount, BankAccount other) { balance = balance - amount; other.balance = other.balance + amount; //  //Modifies explicit parameter }  Modificar um parâmetro explicito deve ser evitado, pois isso é geralmente inesperado podendo confundir outros programadores

Efeito Colateral  Outro tipo de efeito colateral é a saída de dados public void printBalance() // Not recommended { System.out.println("The balance is now $" + balance); }  Má ideia: mensagem é em inglês e usa System.out (e se quisermos imprimir em outro lugar?) É melhor desacoplar entrada/saída do código da sua classe  Minimize os efeitos colaterais

Linguagens Funcionais  Dados imutáveis + nenhum efeito colateral + código como dado = Programação Funcional  Linguagens Funcionais  Tem se apresentado como uma solução para Programação Concorrente em máquinas mult-core.  Exemplo: Erlang. Para a JVM: Scheme, Clojure  Java não é Funcional mas  Você pode adotar, sempre que possível, os princípios de classes imutáveis, ausência de efeitos colaterais e código como dados para melhorar seus programas.

Precondições  Precondição: Requisito que o chamador de um método deve obedecer  Precondições devem ser publicadas  usuários não chamarão os métodos com parâmetros incorretos /** Deposits money into this amount the amount of money to deposit (Precondition: amount >= 0) */

Precondições  Uso típico:  Restringir os parâmetros de um método  Exigir que um método seja chamado apenas quando o objeto está num estado apropriado  Se uma precondição é violada  o método não é responsável por fornecer o resultado correto, ele pode fazer qualquer coisa.

Precondições: Ações  O método joga uma exceção se uma precondição é violada – (mais sobre exceções no futuro) if (amount < 0) throw new IllegalArgumentException(); balance = balance + amount;  O método não testa a precondições (ele não é obrigado a testa-las. (Testar pode ser dispendioso) // if this makes the balance negative, it's the // caller's fault balance = balance + amount;

Precondições: Ações  O método pode fazer uma checagem de afirmação (assertion) assert amount >= 0; balance = balance + amount;  Para ativar: java -enableassertions MyProg Pode ser desligada depois da fase de testes  O método pode retornar silenciosamente (programadores novatos fazem isso) if (amount < 0) return; // Not recommended; // hard to debug balance = balance + amount;

Assertion assert condition;  Exemplo: assert amount >= 0;  Propósito: Testar que uma condição é satisfeita. Se testes de afirmação (assertion checking) estão abilitados e a condição é falsa, um asserion error acontece.  Por que esse teste pode ser desabilitado?

Poscondições  Condições que são verdadeiras depois que um método termina  Se a chamada de um método atende as suas precondições, ele tem que garantir que as poscondições sejam válidas

Poscondições  Existem dois tipos de poscondições:  O valor de retorno é computado corretamente  o objeto está num certo estado depois que o métodp termina  /** Deposits money into this account. (Postcondition: getBalance() >= amount the amount of money to deposit (Precondition: amount >= 0) */  Don't document trivial postconditions that repeat clause

Pre/Poscondições  Formule as pre- e poscondições em termos da interface da classe amount <= getBalance()// this is the way // to state a postcondition amount <= balance // wrong postcondition // formulation  Contrato: Se quem está chamando o método cumpre a precondição  o método tem que cumprir a poscondição

Métodos Estáticos  Todo o método deve estar numa classe  Um método estático não é chamado num objeto  Ele é chamado com o nome da classe em vez do objeto: double tax = Financial.percentOf(taxRate, total);  Uso principal: operações com tipos primitivos  O método main tem que ser estático pois ainda não existe nenhum objeto

Variáveis Estáticas  Pertence a classe. Também chamada variável de classe. public class BankAccount {... private int accountNumber; private static int lastAssignedNumber = 1000; } /* If lastAssignedNumber was not static, each instance of BankAccount would have its own value of lastAssignedNumber */  Minimize o uso de variáveis estáticas. (variáveis static final  ok.)

Variáveis Estáticas  Variáveis estáticas devem ser sempre private/protected  Exceção: Constantes estáticas: public class BankAccount {... public static final double OVERDRAFT_FEE = 5; // Refer to it as // BankAccount.OVERDRAFT_FEE }

Variáveis Estáticas

Perguntas ?