Actividade

  1. Resolução do enunciado da aula.

Objectivos

Utilização do diagrama de classes da linguagem UML para modelar um problema. Exemplificar a utilização de iteradores e de ordenação de contentores.

Enunciado da Aula

Leia cuidadosamente o seguinte enunciado, correspondente a uma aplicação bancária para gestão de contas.

A classe Holder representa cada um dos titulares de uma conta bancária. Um titular tem um nome é identificado univocamente por um número de cliente. Tem métodos que permitem aceder ao seu estado interno, e.g., obter o nome, assim como para alterar esse estado (apenas o nome). Dois titulares são iguais se os seus números de cliente forem iguais. A classe Holder deve oferecer a possibilidade de ordenar titulares por ordem crescente do seu número cliente ou por nome. Para tal, é necessário definir dois tipos de comparadores distintos (que em Java são representados por classes que implementam a interface java.util.Comparator). A relação do cliente com o banco traduz-se na existência de uma conta bancária (a não confundir com as contas que gerem directamente o dinheiro, e.g., conta à ordem).

Uma conta bancária ( BankAccount ) está associada a uma conta à ordem ( DemandAccount ) e a zero ou mais contas de poupança (a prazo) ( SavingsAccount ). A conta à ordem mantém o saldo à ordem da conta bancária. A conta bancária é identificada por um número único e pode ter um número qualquer de titulares, podendo ser adicionados novos titulares em qualquer altura. A conta permite operações de levantamento, depósito e consulta do saldo (respectivamente, métodos withdraw, deposit e getDemandAccountBalance), as quais são realizadas sobre o depósito à ordem associado à conta. O método getBalance, além do saldo da conta à ordem, considera ainda o saldo de todos as contas poupança. As contas bancárias podem ser ordenadas de acordo com o seu o número (sugere-se que BankAccount implemente a interface java.util.Comparable) e são consideradas iguais se tiverem o mesmo número de conta. Uma conta só pode ser removida do banco se tiver um saldo total igual a zero. Resumindo, uma conta bancárias permite as seguintes operações:
  • Depositar/levantar um determinado valor;
  • Visualizar o saldo corrente ou total;
  • Listar os seus titulares;
  • Listar os seus depósitos a prazo;
  • Adicionar um depósito a prazo;
  • Verificar se pode ser removida.
As contas à ordem ( DemandAccount ) e de poupança (a prazo) ( SavingsAccount ) são especializações da classe DepositAccount (conta de depósito), que define uma interface comum para os vários tipos de conta e permite alguma reutilização de código, sendo identificadas as suas instâncias por um número único, atribuído no momento de criação. Estas instâncias mantêm ainda informação sobre o saldo, a taxa de juro e uma data de início (definida no momento da criação). Duas contas de depósito são iguais se tiverem o mesmo número. Cada conta de depósito apresenta a seguinte funcionalidade:
  • Depósito/levantamento de quantias (são lançadas excepções do tipo InvalidDeposit ou InvalidWithdrawal , caso não seja possível realizar depósitos ou levantamentos, respectivamente);
  • Consulta do saldo actual;
  • Consulta do número;
  • Actualização do saldo, considerando taxas de juros (caso estes já tenham vencido).

As contas à ordem têm taxas de juro de 0% e não permitem, nem levantamentos de valores superiores ao saldo, nem depósitos de quantias negativas (são lançadas excepções em ambos os casos). As contas poupança não permitem nem depósitos nem levantamentos de dinheiro (é lançada uma excepção) e caracterizam-se por uma dada taxa de juro e uma duração em dias (à qual o juro diz respeito) que são indicadas no momento de criação da conta poupança.

Quando os juros de uma conta poupança vencem, o saldo e o valor dos juros são automaticamente depositados na conta bancária associada à conta poupança, que deve ser encerrada e removida. Esta funcionalidade (depositar o saldo e juros na conta e fechar a conta poupança) é da resposabilidade da conta poupança. Não é necessário detectar vencimentos de contas poupança.

Enunciado da Aula

Leia cuidadosamente o seguinte enunciado, correspondente a uma aplicação bancária para gestão de contas.

A classe Holder representa cada um dos titulares de uma conta bancária. Um titular tem um nome é identificado univocamente por um número de cliente. Tem métodos que permitem aceder ao seu estado interno, e.g., obter o nome, assim como para alterar esse estado (apenas o nome). Dois titulares são iguais se os seus números de cliente forem iguais. A classe Holder deve oferecer a possibilidade de ordenar titulares por ordem crescente do seu número cliente ou por nome. Para tal, é necessário definir dois tipos de comparadores distintos (que em Java são representados por classes que implementam a interface java.util.Comparator). A relação do cliente com o banco traduz-se na existência de uma conta bancária (a não confundir com as contas que gerem directamente o dinheiro, e.g., conta à ordem).

Uma conta bancária ( BankAccount ) está associada a uma conta à ordem ( DemandAccount ) e a zero ou mais contas de poupança (a prazo) ( SavingsAccount ). A conta à ordem mantém o saldo à ordem da conta bancária. A conta bancária é identificada por um número único e pode ter um número qualquer de titulares, podendo ser adicionados novos titulares em qualquer altura. A conta permite operações de levantamento, depósito e consulta do saldo (respectivamente, métodos withdraw, deposit e getDemandAccountBalance), as quais são realizadas sobre o depósito à ordem associado à conta. O método getBalance, além do saldo da conta à ordem, considera ainda o saldo de todos as contas poupança. As contas bancárias podem ser ordenadas de acordo com o seu o número (sugere-se que BankAccount implemente a interface java.util.Comparable) e são consideradas iguais se tiverem o mesmo número de conta. Uma conta só pode ser removida do banco se tiver um saldo total igual a zero. Resumindo, uma conta bancárias permite as seguintes operações:
  • Depositar/levantar um determinado valor;
  • Visualizar o saldo corrente ou total;
  • Listar os seus titulares;
  • Listar os seus depósitos a prazo;
  • Adicionar um depósito a prazo;
  • Verificar se pode ser removida.
As contas à ordem ( DemandAccount ) e de poupança (a prazo) ( SavingsAccount ) são especializações da classe DepositAccount (conta de depósito), que define uma interface comum para os vários tipos de conta e permite alguma reutilização de código, sendo identificadas as suas instâncias por um número único, atribuído no momento de criação. Estas instâncias mantêm ainda informação sobre o saldo, a taxa de juro e uma data de início (definida no momento da criação). Duas contas de depósito são iguais se tiverem o mesmo número. Cada conta de depósito apresenta a seguinte funcionalidade:
  • Depósito/levantamento de quantias (são lançadas excepções do tipo InvalidDeposit ou InvalidWithdrawal , caso não seja possível realizar depósitos ou levantamentos, respectivamente);
  • Consulta do saldo actual;
  • Consulta do número;
  • Actualização do saldo, considerando taxas de juros (caso estes já tenham vencido).

As contas à ordem têm taxas de juro de 0% e não permitem, nem levantamentos de valores superiores ao saldo, nem depósitos de quantias negativas (são lançadas excepções em ambos os casos). As contas poupança não permitem nem depósitos nem levantamentos de dinheiro (é lançada uma excepção) e caracterizam-se por uma dada taxa de juro e uma duração em dias (à qual o juro diz respeito) que são indicadas no momento de criação da conta poupança.

Quando os juros de uma conta poupança vencem, o saldo e o valor dos juros são automaticamente depositados na conta bancária associada à conta poupança, que deve ser encerrada e removida. Esta funcionalidade (depositar o saldo e juros na conta e fechar a conta poupança) é da resposabilidade da conta poupança. Não é necessário detectar vencimentos de contas poupança.

Trabalho Proposto

Represente num diagrama de classes UML as relações existentes entre as classes necessárias para realizar as funcionalidades descritas acima, incluindo os métodos e campos das classes. Sugere-se que comece por analisar as dependências entre as entidades BankAccount e Holder. Depois, relacione as entidades DepositAccount, Demand Account, SavingsAccount e BankAccount. Após ter realizado o diagrama UML, pode ver o arquivo bank.jar (contém as classes que realizam a quase totalidade da aplicação bancária). Implemente os métodos incompletos:

  • getBalance (da classe BankAccount);
  • withdraw (da classe Demand Account);
  • close (da classe SavingsAccount).

A classe App (disponibilizada com a aplicação bancária) ilustra a utilização de contentores, iteradores e comparadores.