Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7...

32
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

Transcript of Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7...

Page 1: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

1

Capitulo 7 – Métodos avançados

Capitulo 7

Métodos avançados

Page 2: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

2

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)

Page 3: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

3

Capitulo 7 – Métodos avançados

Passagem de parâmetros

Page 4: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

4

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);

Page 5: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

5

Capitulo 7 – Métodos avançados

Referencia a objecto e parametro numerico

Page 6: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

6

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)

Page 7: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

7

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"); . . .

}

Page 8: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

8

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)

Page 9: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

9

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));}

Page 10: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

10

Capitulo 7 – Métodos avançados

Métodos estáticos• Em Java, todos os métodos devem

pertencer a uma classeclass Numeric{

• public static boolean approxEqual(double x, double y) { . . . }}

• A chamada á feita através do nome da classe:if (Numeric.approxEqual(a, b)) . . .

Page 11: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

11

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);

Page 12: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

12

Capitulo 7 – Métodos avançados

Um método não pode modificar

parâmetros numericos

Page 13: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

13

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);

Page 14: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

14

Capitulo 7 – Métodos avançados

Um método pode modificar o estado do

parametro de um objecto

Page 15: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

15

Capitulo 7 – Métodos avançadosNã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);

Page 16: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

16

Capitulo 7 – Métodos avançados

Um método não pode substituir um parametro objecto

Page 17: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

17

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;}

Page 18: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

18

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

Page 19: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

19

Capitulo 7 – Métodos avançados

Atributos e variaveis estáticas

Page 20: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

20

Capitulo 7 – Métodos avançados

Tipos de variáveis

• Atributos• Variáveis estáticas• Variáveis locais• Parâmetros

Page 21: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

21

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

superiorclass BankAccount{

• public BankAccount(double initialBal) {

double balance = initialBal; } private double balance; }

Page 22: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

22

Capitulo 7 – Métodos avançados

Como comentar os métodos

• /** Tests whether two floating-point numbers are equal except for roundoff @param x a floating-point number @param y a floating-point number @return true if x and y are approximately equal*/public static boolean approxEqual(double x, double y){ . . .}

Page 23: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

23

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

Page 24: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

24

Capitulo 7 – Métodos avançados

Página HTML produzida pela javadoc

Page 25: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

25

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?

Page 26: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

26

Capitulo 7 – Métodos avançados

Pré-condições• Condição pré estabelecida:

@param amount the amount ofmoney 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

Page 27: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

27

Capitulo 7 – Métodos avançados

Recursividade

• n! = 1 2 3 . . . n• 0! = 1

1! = 12! = 23! = 64! = 245! = 120

Page 28: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

28

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 usadon! = (n - 1)! n

• public static int factorial(int n){

return factorial(n - 1) * n;}

• Quase certo—mas a recursividade tem que terminar...

Page 29: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

29

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 = 6factorial(4) returns 6 * 4 = 24

Page 30: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

30

Capitulo 7 – Métodos avançados

Program Fac.java

public class Fac{ public String getFactorial(int n) {

return(n + "! = ” + factorial(n)); }

Page 31: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

31

Capitulo 7 – Métodos avançados

/** Computes the factorial of an integer. @param n an integer >= 0 @return n! */ public static int factorial(int n) { if (n == 0) { return 1; } else { int result = n * factorial(n - 1); return result; } }}

Page 32: 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.

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

32

Capitulo 7 – Métodos avançados

Towers of Hanoi