A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados.

Apresentações semelhantes


Apresentação em tema: "Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados."— Transcrição da apresentação:

1 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados

2 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Parâmetros formais e actuais Parâmetros formais(implícitos + explícitos): class BankAccount { public void deposit(double amount) { balance += amount; }... } Parâmetros actuais(argumentos): harrysChecking.deposit(allowance - 200)

3 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Passagem de parâmetros

4 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Parâmetros de objecto public void transfer(BankAccount other, double amount) { withdraw(amount); other.deposit(amount); } Chamada com uma referencia a um objecto e um parâmetro numérico: double allowance = 800; momsSavings.transfer(harrysChecking, allowance);

5 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Referencia a objecto e parametro numerico

6 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Métodos para alteração e para acesso Acesso: não altera o estado de um parâmetro implícito (ex.. getBalance ) Alteração: altera o estado de um parâmetro implícito (ex.. deposit ) Classe Inalterável: Todos os métodos são unicamente para acesso (ex.. String )

7 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados O que se entende por efeitos colaterais Qualquer alteração fora do parâmetro implícito P.e: modificação de outro parâmetro fora do objecto (ex.. transfer ) P.e: imprimir dentro do método: public void deposit(double amount) { – if (amount < 0) JOptionPane.showInputDialog("Bad value");... }

8 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Minimizar os efeitos colaterais Excelente: Sem modificações ( getBalance ) Bom: métodos para alterações que apenas alteram parâmetros implicídos ( deposit ) Regular: Métodos que alteram parâmetros explícitos ( transfer ) Miserável: Métodos com outros efeitos colaterais (alterar variáveis estáticas, enviar para o écran)

9 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Métodos estáticos Métodos sem parâmetros implícitos Não actuam num objecto Exemplo típico: quando todos os parâmetros são números: x e y são aproximadamente iguais se |x - y| max(|x|, |y|) public static boolean approxEqual (double x, double y) { return Math.abs(x - y) <= EPSILON * Math.max(Math.abs(x), Math.abs(y)); }

10 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Métodos estáticos Em Java, todos os métodos devem pertencer a uma classe class Numeric { public static boolean approxEqual(double x, double y) {... } } A chamada á feita através do nome da classe: if (Numeric.approxEqual(a, b))...

11 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Não é possível modificar parâmetros numéricos public static void updateBalance (double balance, double interestRate) { double interest = balance * interestRate / 100; balance = balance + interest; } Não resulta: double savings = 10000; double rate = 5; updateBalance(savings, rate);

12 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Um método não pode modificar parâmetros numericos

13 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados É possível modificar o estado do parâmetro de um objecto public static void updateBalance (BankAccount account, double interestRate) { double interest = account.getBalance() * interestRate / 100; account.deposit(interest); } BankAccount collegeFund = new BankAccount(10000); double rate = 5; updateBalance(collegeFund, rate);

14 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Um método pode modificar o estado do parametro de um objecto

15 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Não é possível modificar o conteúdo do objecto passado como parâmetro public static chooseAccount(BankAccount betterAccount, BankAccount candidate1, BankAccount candidate2) { if (candidate1.getBalance() > candidate2.getBalance()) betterAccount = candidate1; else betterAccount = candidate2; } BankAccount collegeFund = new BankAccount(10000); BankAccount momsSavings = new BankAccount(8000); BankAccount myAccount = null; // não resulta!! chooseAccount(myAccount,momsSavings,collegeFund);

16 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Um método não pode substituir um parametro objecto

17 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Variáveis estáticas Uma variável por classe, e não por objecto Exemplo: última conta bancaria atribuída propriedade da classe e não do objecto public class BankAccount {... private double balance; private int accountNumber; private static int lastAssignedNumber; }

18 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Variáveis estáticas public BankAccount() { lastAssignedNumber++; accountNumber = lastAssignedNumber; } Inicialização de variáveis estáticas: class BankAccount {... private static int lastAssignedNumber = 0; } Constantes estáticas: Math.PI

19 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Atributos e variaveis estáticas

20 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Tipos de variáveis Atributos Variáveis estáticas Variáveis locais Parâmetros

21 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Escopo Escopo da classe definido na classe(atributos ou variáveis estáticas) Escopo do bloco definido no bloco(variável local) Shadowing//esconder uma variável com escopo superior class BankAccount { public BankAccount(double initialBal) { double balance = initialBal; } private double balance; }

22 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Como comentar os métodos /** Tests whether two floating-point numbers are equal except for x a floating-point y a floating-point true if x and y are approximately equal */ public static boolean approxEqual(double x, double y) {... }

23 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Comentários às classes /** A class that stores the position and speed of a simulated cannon ball */ public class CannonBall {... } Ferramenta de extração de comentários: javadoc MyProg.java

24 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Página HTML produzida pela javadoc

25 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Pré-condições O que deve um método fazer quando é chamado com parâmetros incorrectos? Math.sqrt(-1); account.deposit(-1000); Não fazer nada? Acabar o programa? Retornar uma mensagem de erro?

26 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Pré-condições Condição pré amount the amount of money to deposit; must be > 0 Lançar uma excepção se uma das pré condições for violada: if (amount <= 0) throw new IllegalArgumentException(); Quem executa é responsável: executa os métodos com parâmetros que preencham todos os pré requisitos Responsabilidade do programador: Apenas computa resultados acertados quando os parâmetros preencherem as pré-condições

27 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Recursividade n! = n 0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 5! = 120

28 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Recursividade Não existem operações... mágicas: public static int factorial(int n) { return 1 * 2 * 3 *... * n; } Não foi assim que chegamos ao resultado da tabela Foi usado n! = (n - 1)! n public static int factorial(int n) { return factorial(n - 1) * n; } Quase certomas a recursividade tem que terminar...

29 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Recursividade Toda a recursividade tem que simplificar a computação de alguma forma Devem existir casos especiais para efectuar computações simples factorial(4) calls factorial(3) factorial(3) calls factorial(2) factorial(2) calls factorial(1) factorial(1) calls factorial(0) factorial(0) returns 1 factorial(1) returns 1 * 1 = 1 factorial(2) returns 1 * 2 = 2 factorial(3) returns 2 * 3 = 6 factorial(4) returns 6 * 4 = 24

30 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Program Fac.java public class Fac { public String getFactorial(int n) { return(n + "! = + factorial(n)); }

31 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados /** Computes the factorial of an n an integer >= n! */ public static int factorial(int n) { if (n == 0) { return 1; } else { int result = n * factorial(n - 1); return result; }

32 Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 7 – Métodos avançados Towers of Hanoi


Carregar ppt "Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados."

Apresentações semelhantes


Anúncios Google