Programação Orientada
pelos Objetos B
◻ Uma conta bancária é:
⬜ Um “depósito” de dinheiro
⬜ A quantidade de dinheiro na conta chama-se saldo
⬜ O saldo pode ser positivo (credor ou nulo) ou negativo (devedor)
◻ Quando a conta é criada
⬜ Se não indicarmos nada, o seu saldo é zero
⬜ Em alternativa, podemos indicar um valor inicial para o saldo
◻ Operações reconhecidas (interface de BankAccount):
public void deposit(int amount)
public void withdraw(int amount)
public int getBalance()
public boolean redZone()
3
Conta Bancária (versão
anterior)
Cenário mais realista
4
◻
Sempre que um cliente pretende levantar
dinheiro de uma conta bancária, o banco pode
tomar uma de duas decisões alternativas
⬜
Aceitar o levantamento
■
Porque a conta tem saldo suficiente
⬜
Recusar ou modificar o levantamento
■
Porque a conta não tem provisão suficiente
Efectuar levantamento Recusar levantamento Tem saldo ?
Procedimento Bancário
◻
Vamos considerar que o banco segue as
seguintes regras de negócio:
⬜
O levantamento só efectuado caso o valor a levantar
seja inferior ou igual ao valor do saldo
⬜
Qualquer tentativa de levantamento de um valor sem
provisão na conta leva à aplicação de uma multa
◻
O aspecto mais importante a reter aqui é que
processar um levantamento requer uma
decisão entre duas acções alternativas e
exclusivas.
◻
O levantamento pedido (amount) só é efectuado caso o valor
a levantar seja inferior ou igual ao valor do saldo
◻
Qualquer tentativa de levantamento de um valor sem
provisão na conta leva à aplicação de uma multa (FINE)
Procedimento Bancário
Efectuar Levantamento: balance = balance - amount balance < amount false true Recusar levantamento: balance = balance - FINEDecisões em Programação
(sub)programa a executar se a condição Cond for falsa Cond false true (sub)programa a executar se a condição Cond for verdadeira 7◻ Uma decisão envolve a avaliação de uma expressão booleana Cond, uma condição que produz true ou false
◻ Qualquer decisão envolve determinar o que deve o programa fazer em qualquer uma das situações.
◻ Para o programa poder decidir em qualquer circunstância, o programador tem que prever as duas possibilidades
◻
Na linguagem Java, as decisões exprimem-se usando a
instrução if-else
◻
A expressão
condition
tem que ser uma expressão
booleana: uma condição que produz true ou false
◻
Como é executada a instrução if-else ?
⬜ Primeiro, a condição condition é avaliada e produz um valor.
⬜ Se o valor é true, então o programa executa apenas a parteTHEN
⬜ Se o valor é false, então o programa executa apenas a parteELSE
A instrução if-else
if ( condition ) parteTHEN; else parteELSE; 8A instrução if-else
if (balance < amount )
balance = balance – FINE;
else
balance = balance - amount;
if (condicao) parteTHEN;
else
parteELSE;
Efectuar Levantamento: balance = balance - amount
balance < amount
false true
Recusar levantamento: balance = balance - FINE
A instrução if-else
if (balance < amount )
balance = balance – FINE;
else
balance = balance - amount;
if (condicao)
parteTHEN;
else
parteELSE;
Efectuar Levantamento: balance = balance - amount
balance < amount
false true
Recusar levantamento: balance = balance - FINE
◻
Uma conta bancária segura é como as contas bancárias
que já conhecemos (da classe BankAccount).
Mas a operação de levantamento é segura:
⬜
O levantamento só é efectuado caso o valor a levantar
seja inferior ou igual ao valor do saldo
⬜
Qualquer tentativa de levantamento de um valor sem
provisão na conta leva à aplicação de uma multa
◻Uma conta segura fornece ainda outras operações:
⬜
Para calcular o valor de juros a aplicar
⬜Para creditar juros no saldo
◻
Vamos convencionar também que os valores são
registados e armazenados em cêntimos
12
◻
Operações (interface de SafeBankAccount):
public void
deposit(
int
amount)
Depositar a importância amount na conta
public void
withdraw(
int
amount)
Levantar a importância amount na conta ou aplicar a multa
public int
getBalance()
Consultar o saldo da conta
public boolean
redZone()
Indica se a conta está devedora
public int
computeInterest()
Calcular qual o valor do juro anual a aplicar
public void
applyInterest()
Creditar o juro anual ao saldo da conta
13
Método withdraw
◻
A operação pode ser programada usando a
instrução if-else, do seguinte modo:
public void withdraw(int amount) {
if (balance >= amount)
balance = balance - amount;
else
balance = balance – FINE;
} Efectuar Levantamento: balance = balance - amount balance >= amount true false Recusar levantamento:
Constantes em Java
public class SafeBankAccount {
public static final int FINE = 200; ....
}
◻
O valor FINE da multa é constante, não podendo
alguma vez ser alterado durante a execução do
programa
◻
O valor FINE é comum a todas as contas geradas
pela classe SafeBankAccount
◻
Para facilitar eventuais re-programações do valor da
multa, é conveniente declarar o mesmo como uma
constante global
Constantes em Java
public class SafeBankAccount {
public static final int FINE = 200; ....
}
◻
O classificador
final
significa que o valor daquele
membro da classe não pode ser alterado
◻
O classificador
static
significa que o membro da
classe é global à classe
⬜
Podemos referir-nos a ele sem criar um objecto para isso
⬜Como não faz sentido repetir um valor constante por todas
as instâncias duma classe, a attitude lógica é declarer as
constantes como
static
Constantes em Java
public class SafeBankAccount {
public static final int FINE = 200; ....
}
◻
Para referirmo-nos à constante fora da classe (i.e.,
em qualquer outra classe), usamos a expressão:
SafeBankAccount.FINE◻
Na prática, todos os membros públicos duma classe
são globais
◻
É convenção do Java usar apenas maiúsculas para
os nomes das constantes (herda essa prática do C)
◻
Para declarar numa classe uma constante, utiliza-se a forma
acesso tipo static final tipo CONSTANT_IDENTIFIER = expr ;◻
Constantes Globais:
⬜ Globais, pois são usadas por todos os objectos de uma certa classe ⬜ Constantes, pois o seu valor nunca deverá ser alterado (é fixo)
◻
Exemplo: o identificador PI é uma constante, de tipo
double,
definida na classe Math.
A expressão expr só pode mencionar outras constantes. Por exemplo,
public static final double PI2 = 2 * Math.PI;
public static final int FINE = 200; 18
Conta Bancária Segura
19
◻
Outras operações de SafeBankAccount:
public int computeInterest()
Usualmente, o banco credita um certo juro nas contas dos
seus clientes, numa base periódica (por exemplo, uma vez por
ano)
O valor do juro é calculado por aplicação de uma taxa ao valor
do saldo
A taxa de juro é determinada com base no valor do saldo,
através de um sistema de escalões (quanto maior o saldo,
maior a taxa)
A operação computeInterest() determina qual o valor do
juro a aplicar tendo em conta o saldo corrente da conta
public void applyInterest()
Determinação da taxa de juro
20
◻
A taxa de juro a aplicar depende do valor
saldo existente na conta.
◻
Existem três taxas possíveis:
Valor do Saldo
Taxa
≤ 2000 €
1%
]2000 €,10.000 €]
2%
Método computeInterest()
◻
A operação computeInterest() pode ser
decomposta em duas tarefas mais elementares
⬜
Determinar a taxa de juro a partir do saldo corrente
⬜Aplicar a taxa ao saldo corrente
public int computeInterest
() {
}
Determinar qual a taxa de juro
Calcular o valor do juro com
base no valor do saldo
Determinação da taxa de juro
22
◻
A determinação da taxa de juro pode ser
efectuada através das decisões seguintes:
interestRate = 0.03 balance > 10000 true false balance > 2000 true false interestRate = 0.02 interestRate = 0.01
Determinação da taxa de juro
23 ◻Exemplo
⬜balance = 67
interestRate = 0.03 balance > 10000 true false balance > 2000 true false interestRate = 0.02 interestRate = 0.01Método computeInterest()
24
◻
Determinar a taxa de juro a partir do saldo
corrente
public int computeInterest() { float interestRate; if (balance > 1000000) interestRate = 0.03f; else if (balance > 200000) interestRate = 0.02f; else interestRate = 0.01f;
return balance * interestRate; } interestRate = 0.03 balance > 10000 true false balance > 2000 true false interestRate = 0.02 interestRate = 0.01
Método computeInterest()
25
◻
Determinar a taxa de juro a partir do saldo
corrente
public int computeInterest() { float interestRate; if (balance > 1000000) interestRate = 0.03f; else if (balance > 200000) interestRate = 0.02f; else interestRate = 0.01f;
return balance * interestRate; }
Esta expressão vai produzir
um valor de tipo
floatMétodo computeInterest()
26
◻
Determinar a taxa de juro a partir do saldo
corrente
public int computeInterest() { float interestRate; if (balance > 1000000) interestRate = 0.03f; else if (balance > 200000) interestRate = 0.02f; else interestRate = 0.01f;
return Math.round( balance * interestRate ); }
Como estamos a representar os valores em cêntimos (tipo
int)
Método computeInterest()
27
◻
Esta solução funciona mas podemos organizar
este código com melhor estilo (i.e., mais fácil de
entender)
public int computeInterest() {
float
interestRate;
if (balance > 1000000)
interestRate = 0.03f;
else if
(balance > 200000)
interestRate = 0.02f;
else
interestRate = 0.01f;
return Math.round
(
balance
* interestRate);
Método computeInterest()
28
◻
Estilo mais correcto de codificação: dar nomes às
contantes da classe, para melhor documentar o
código
public int computeInterest() { float interestRate; if (balance > 1000000) interestRate = 0.03f; else if (balance > 200000) interestRate = 0.02f; else interestRate = 0.01f;
return Math.round( balance * interestRate); }
Método computeInterest()
29
◻
Estilo mais correcto de codificação: dar nomes às
contantes da classe, para melhor documentar o
código
public int computeInterest() { float interestRate; if (balance > 1000000) interestRate = 0.03f; else if (balance > 200000) interestRate = 0.02f; else interestRate = 0.01f;
return Math.round( balance * interestRate); }
Deve-se evitar utilizar constantes “mágicas” nos programas, pois isso torna os programas difíceis
Método computeInterest()
30
◻
Estilo mais correcto de codificação: dar nomes às
contantes da classe, para melhor documentar o
código
public int computeInterest() { float interestRate;
if (balance > CATEGORY1)
interestRate = RATE_CATEGORY1; else if (balance > CATEGORY2) interestRate = RATE_CATEGORY2;
else interestRate = RATE_CATEGORY3;
return Math.round( balance * interestRate); }
Deve-se evitar utilizar constantes “mágicas” nos programas, pois isso torna os programas difíceis
Constantes em Java
◻
Técnica correcta: dar nomes às constantes na
classe
public class SafeBankAccount {
public static final int CATEGORY1 = 1000000; public static final int CATEGORY2 = 200000;
public static final float RATE_CATEGORY1 = 0.03f;
public static final float RATE_CATEGORY2 = 0.02f; public static final float RATE_CATEGORY3 = 0.01f; ...
}
Conta Bancária Segura
32
◻
Outras operações de SafeBankAccount:
public int computeInterest()
Usualmente, o banco credita um certo juro nas contas dos
seus clientes, numa base periódica (por exemplo, uma vez por
ano)
O valor do juro é calculado por aplicação de uma taxa ao valor
do saldo
A taxa de juro é determinada com base no valor do saldo,
através de um sistema de escalões (quanto maior o saldo,
maior a taxa)
A operação computeInterest() determina qual o valor do
juro a aplicar tendo em conta o saldo corrente da conta
public void applyInterest()
Método applyInterest()
◻
O método applyInterest()pode chamar o método
computeInterest
()
e acumular o resultado no saldo
public void
applyInterest() {
balance
= balance + this.computeInterest();
}
O Ecoador
35
◻
Um ecoador é um objecto da classe Echo, que possui
apenas duas operações ( echo e countEchoes).
⬜
Quando é criado, o ecoador produziu
0
(zero) ecos.
public String
echo(
String
data,
int
rep)
Recebe a String data e um número inteiro rep, e devolve a
concatenação de rep cópias da String data.
public int
countEchoes()
Devolve o total de ecos realizados.
O Ecoador: Exemplo
36
public class
EchoTester {
public static void
main(String arg[]) {
Echo e =
new
Echo();
System.out.println(e.echo(
“p-p-poker face!”
,2));
// “p-p-poker face!p-p-poker face!”
System.out.println(e.echo(
“hi”
,4))
// “hi hi hi hi ”
System.out.println(e.countEchoes())
// 6
}
}
Como repetir rep vezes a
String?
data rep copies count
“ha!” 3 “” 0 “ha!” 3 “ha!” 1 “ha!” 3 “ha!ha!” 2 “ha!” 3 “ha!ha!ha!” 3 count = 0 copies = “” count < rep count++ copies += s return copies true false 37
O ciclo while
38 Inicialização Condição Corpo ... true falseInicialização ;
while (
Condição
) {
Corpo;
}
public String echo(String data, int rep){
int count = 0;
String copies = "";
while (count != rep) {
copies = copies+ data;
count = count + 1;
} ... }
Programando a Classe Echo
public class Echo {
public String echo(String data, int rep) {
int count = 0; // contador de copias já repetidas
String copies = ""; // String com cópias já repetidas
while (count != rep) {
copies = copies + data; count = count + 1; } return copies; } } 39
O Ciclo while
◻
Enquanto a condição do ciclo for verdadeira, os
comandos no corpo do ciclo serão executados
repetidamente
◻
Se inicialmente a condição for falsa, o corpo do
ciclo nunca chegará a ser executado ...
◻
Caso contrário, será executado uma vez, sendo
depois a condição avaliada de novo ...
◻
Se continuar a ser verdadeira, o corpo será
executado de novo, e a condição reavaliada ...
◻
O ciclo só pára de repetir quando a condição for
falsa (o que pode nunca acontecer, oops!)
O Ciclo while
41
◻ Os três elementos fundamentais de um ciclo são
⬜ Inicialização
■ Estabelece os valores iniciais das variáveis que podem ser alteradas em cada passo do ciclo.
⬜ Condição
■ Indica se o ciclo deve repetir mais um passo.
⬜ Corpo
■ Indica o que deve ser feito em cada passo do ciclo
■ Um “passo” também se chama “iteração”
■ Deve alterar as variáveis envolvidas na condição, para garantir que esta
chega a ser falsa (e que então o ciclo
pára)
Inicialização
;
while (
Condição
) {
Corpo
;
A classe Echo
42
public class Echo {
private int echoCounter; // Total de ecos realizados public Echo() { echoCounter = 0; }
public String echo(String data, int rep) {
int count = 0; // contador de copias já repetidas
String copies = ""; // String com cópias já repetidas while (count != rep) {
copies = copies + data; count = count + 1; }
echoCounter = echoCounter+rep; return copies;
}
public int countEchoes() { return echoCounter; } }