Menu
Coddy logo textTech

Sistema Bancário

Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy — lição 108 de 110.

challenge icon

Desafio

Fácil

Vamos construir um Sistema Bancário que modela operações financeiras do mundo real usando os princípios de POO que você dominou ao longo deste curso. Você criará contas com regras diferentes, rastreará transações e gerenciará clientes - tudo organizado em vários arquivos.

Seu sistema bancário será organizado em seis arquivos:

  • transaction.dart: Crie uma classe Transaction que representa um registro imutável de uma operação financeira. Cada transação possui campos final para type (String - "deposit", "withdrawal", ou "transfer"), amount (double) e timestamp (DateTime). Sobrescreva toString() para retornar [type] $amount.
  • account.dart: Crie uma classe abstrata Account com um _balance (double) privado, um número de conta final (accountNumber - String) e uma List<Transaction> para armazenar o histórico de transações. Inclua um getter para o saldo, um setter protegido set balance(double value) para que as subclasses em outros arquivos possam atualizar o saldo, um método abstrato bool canWithdraw(double amount) que as subclasses implementam e estes métodos concretos:
    • deposit(double amount) - adiciona ao saldo, registra uma transação, imprime Deposited $amount. Balance: $balance
    • withdraw(double amount) - se canWithdraw() retornar verdadeiro, subtrai do saldo, registra uma transação, imprime Withdrew $amount. Balance: $balance. Caso contrário, imprime Withdrawal denied.
    • getTransactionCount() - retorna o número de transações
  • savings_account.dart: Crie uma SavingsAccount que estende Account. As contas poupança têm um limite de saque - elas não podem sacar mais de $500 em uma única transação. Implemente canWithdraw() para aplicar esta regra (também garanta saldo suficiente). Adicione um método applyInterest(double rate) que aumenta o saldo pela taxa percentual fornecida usando o getter e setter de balance, e então imprime Interest applied. Balance: $balance.
  • checking_account.dart: Crie uma CheckingAccount que estende Account. As contas correntes têm proteção de cheque especial de até $100 - elas podem ficar negativas, mas não abaixo de -$100. Implemente canWithdraw() para permitir saques desde que o saldo resultante permaneça em ou acima de -$100.
  • customer.dart: Crie uma classe Customer com um id (String), name (String) e uma List<Account> para suas contas. Inclua os métodos addAccount(Account account) para adicionar uma conta e getTotalBalance() que retorna a soma de todos os saldos das contas. Sobrescreva toString() para retornar Customer: name (X accounts).
  • main.dart: Demonstre seu sistema bancário. Crie um cliente (C001, John Smith). Crie uma SavingsAccount (SAV001, saldo inicial $1000) e uma CheckingAccount (CHK001, saldo inicial $500). Adicione ambas as contas ao cliente e imprima o cliente. Em seguida, realize estas operações:
    1. Deposite $200 na conta poupança
    2. Saque $300 da conta poupança (deve ser bem-sucedido)
    3. Tente sacar $600 da conta poupança (deve ser negado - excede o limite)
    4. Aplique 5% de juros à conta poupança
    5. Saque $550 da conta corrente (deve ser bem-sucedido usando o cheque especial)
    6. Tente sacar mais $100 da conta corrente (deve ser negado - excederia o limite do cheque especial)
    Por fim, imprima Savings transactions: X e Total balance: $Y (formatado para 2 casas decimais).

Saída esperada:

Customer: John Smith (2 accounts)
Deposited $200.0. Balance: $1200.0
Withdrew $300.0. Balance: $900.0
Withdrawal denied
Interest applied. Balance: $945.0
Withdrew $550.0. Balance: $-50.0
Withdrawal denied
Savings transactions: 3
Total balance: $895.0

Experimente você mesmo

import 'transaction.dart';
import 'account.dart';
import 'savings_account.dart';
import 'checking_account.dart';
import 'customer.dart';

void main() {
  // TODO: Criar um cliente com id "C001" e nome "John Smith"
  
  // TODO: Criar uma SavingsAccount com accountNumber "SAV001" e saldo inicial de $1000
  
  // TODO: Criar uma CheckingAccount com accountNumber "CHK001" e saldo inicial de $500
  
  // TODO: Adicionar ambas as contas ao cliente
  
  // TODO: Imprimir o cliente
  
  // TODO: Realizar as seguintes operações:
  // 1. Depositar $200 na conta poupança (savings account)
  // 2. Sacar $300 da conta poupança (deve ser bem-sucedido)
  // 3. Tentar sacar $600 da conta poupança (deve ser negado - excede o limite)
  // 4. Aplicar 5% de juros à conta poupança
  // 5. Sacar $550 da conta corrente (checking account) (deve ser bem-sucedido usando o cheque especial/overdraft)
  // 6. Tentar sacar mais $100 da conta corrente (deve ser negado - excederia o limite do cheque especial)
  
  // TODO: Imprimir "Savings transactions: X" onde X é a contagem de transações
  
  // TODO: Imprimir "Total balance: \$Y" onde Y está formatado com 2 casas decimais
}

Todas as lições de Programação Orientada a Objetos