Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7...
Transcript of Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7...
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/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)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
3
Capitulo 7 – Métodos avançados
Passagem de parâmetros
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);
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
5
Capitulo 7 – Métodos avançados
Referencia a objecto e parametro numerico
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)
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"); . . .
}
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)
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));}
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)) . . .
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);
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
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);
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
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);
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
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;}
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
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
19
Capitulo 7 – Métodos avançados
Atributos e variaveis estáticas
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
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; }
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){ . . .}
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
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
24
Capitulo 7 – Métodos avançados
Página HTML produzida pela javadoc
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?
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
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
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...
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
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)); }
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; } }}
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
32
Capitulo 7 – Métodos avançados
Towers of Hanoi