• Nenhum resultado encontrado

Programação Orientada pelos Objetos B. Operações de controlo

N/A
N/A
Protected

Academic year: 2021

Share "Programação Orientada pelos Objetos B. Operações de controlo"

Copied!
43
0
0

Texto

(1)

Programação Orientada

pelos Objetos B

(2)
(3)

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

(4)

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 ?

(5)

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.

(6)

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 - FINE

(7)

Decisõ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

(8)

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

(9)

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

(10)

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

(11)
(12)

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

(13)

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

(14)

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:

(15)

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

(16)

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

(17)

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)

(18)

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

(19)

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

(20)

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%

(21)

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

(22)

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

(23)

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.01

(24)

Mé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

(25)

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

float

(26)

Mé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

)

(27)

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

(28)

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

(29)

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

(30)

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

(31)

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

}

(32)

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

(33)

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

}

(34)

O Ecoador

(35)

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.

(36)

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

}

}

(37)

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

(38)

O ciclo while

38 Inicialização Condição Corpo ... true false

Inicializaçã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;

} ... }

(39)

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

(40)

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

(41)

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

;

(42)

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

(43)

Exercícios

A nossa biblioteca

Mathematics

Referências

Documentos relacionados

para o usuário digitar um nome; pega o valor digitado e altera na variável nome do objeto da Conta Bancária, através do método Alterar Nome.. Realiza saque/depósito, e depois

– Crie um construtor parametrizado inicializando todas as variáveis com os valores recebidos dos parâmetros. – Crie um construtor default (Inicializando as variáveis da

• Diferentes componentes de um sistema não devem revelar detalhes internos de suas..

• É possível comprar acessando o método comprar, passando como parâmetro dois objetos, um do tipo Pessoa e outro do tipo Produto.. M.; Programação Orientada

– É o processo de esconder todos os detalhes de um objeto que não contribuem para suas características

– Pode ser acessado por qualquer outra classe em qualquer outro pacote.

• Projeção de classes genéricas que podem ser especializadas em classes mais particulares3. • Classes especializadas reutilizam o código das

– Método executado depende da classe do objeto – Mesma chamada executa métodos diferentes.. • obj.metodo() vai executar método que foi definido para classe do objeto