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 criar um Sistema Bancário que modele operações financeiras do mundo real usando os princípios de OOP que você dominou ao longo deste curso. Você criará contas com regras diferentes, acompanhará 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 represente um registro imutável de uma operação financeira. Cada transação tem campos final para type (String — "deposit", "withdrawal" ou "transfer"), amount (double) e timestamp (DateTime). Substitua 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 subclasses em outros arquivos possam atualizar o saldo, um método abstrato bool canWithdraw(double amount) que as subclasses implementarão e estes métodos concretos:
    • deposit(double amount) — adiciona ao saldo, registra uma transação e imprime Deposited $amount. Balance: $balance
    • withdraw(double amount) — se canWithdraw() retornar true, subtrai do saldo, registra uma transação e 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 estenda Account. Contas de poupança têm um limite de saque — não podem sacar mais de $500 em uma única transação. Implemente canWithdraw() para impor essa regra (garanta também que haja saldo suficiente). Adicione um método applyInterest(double rate) que aumente o saldo pela taxa percentual fornecida usando o getter e o setter balance e, em seguida, imprima Interest applied. Balance: $balance.
  • checking_account.dart: Crie uma CheckingAccount que estenda Account. Contas-correntes têm proteção contra 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 igual ou acima de -$100.
  • customer.dart: Crie uma classe Customer com um id (String), um 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 dos saldos de todas as contas. Substitua 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 de $1000) e uma CheckingAccount (CHK001, saldo inicial de $500). Adicione as duas contas ao cliente e imprima o cliente. Em seguida, execute estas operações:
    1. Deposite $200 na conta poupança
    2. Saque $300 da conta poupança (deve funcionar)
    3. Tente sacar $600 da conta poupança (deve ser negado — excede o limite)
    4. Aplique juros de 5% à conta poupança
    5. Saque $550 da conta-corrente (deve funcionar 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 com 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.00

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
  // 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 (deve ser bem-sucedido usando o cheque especial)
  // 6. Tentar sacar mais $100 da conta corrente (deve ser negado - excederia o limite do cheque especial)
  
  // TODO: Imprima "Savings transactions: X" onde X é a contagem de transações
  
  // TODO: Imprima "Total balance: \$Y" onde Y está formatado com 2 casas decimais
}

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

Pratique por conta própria: Compilador de Dart online