Sistema Bancário
Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy — lição 108 de 110.
Desafio
FácilVamos 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 classeTransactionque representa um registro imutável de uma operação financeira. Cada transação possui camposfinalparatype(String - "deposit", "withdrawal", ou "transfer"),amount(double) etimestamp(DateTime). SobrescrevatoString()para retornar[type] $amount.account.dart: Crie uma classe abstrataAccountcom um_balance(double) privado, um número de contafinal(accountNumber- String) e umaList<Transaction>para armazenar o histórico de transações. Inclua um getter para o saldo, um setter protegidoset balance(double value)para que as subclasses em outros arquivos possam atualizar o saldo, um método abstratobool canWithdraw(double amount)que as subclasses implementam e estes métodos concretos:deposit(double amount)- adiciona ao saldo, registra uma transação, imprimeDeposited $amount. Balance: $balancewithdraw(double amount)- secanWithdraw()retornar verdadeiro, subtrai do saldo, registra uma transação, imprimeWithdrew $amount. Balance: $balance. Caso contrário, imprimeWithdrawal denied.getTransactionCount()- retorna o número de transações
savings_account.dart: Crie umaSavingsAccountque estendeAccount. As contas poupança têm um limite de saque - elas não podem sacar mais de $500 em uma única transação. ImplementecanWithdraw()para aplicar esta regra (também garanta saldo suficiente). Adicione um métodoapplyInterest(double rate)que aumenta o saldo pela taxa percentual fornecida usando o getter e setter debalance, e então imprimeInterest applied. Balance: $balance.checking_account.dart: Crie umaCheckingAccountque estendeAccount. As contas correntes têm proteção de cheque especial de até $100 - elas podem ficar negativas, mas não abaixo de -$100. ImplementecanWithdraw()para permitir saques desde que o saldo resultante permaneça em ou acima de -$100.customer.dart: Crie uma classeCustomercom umid(String),name(String) e umaList<Account>para suas contas. Inclua os métodosaddAccount(Account account)para adicionar uma conta egetTotalBalance()que retorna a soma de todos os saldos das contas. SobrescrevatoString()para retornarCustomer: name (X accounts).main.dart: Demonstre seu sistema bancário. Crie um cliente (C001,John Smith). Crie umaSavingsAccount(SAV001, saldo inicial $1000) e umaCheckingAccount(CHK001, saldo inicial $500). Adicione ambas as contas ao cliente e imprima o cliente. Em seguida, realize estas operações:- Deposite $200 na conta poupança
- Saque $300 da conta poupança (deve ser bem-sucedido)
- Tente sacar $600 da conta poupança (deve ser negado - excede o limite)
- Aplique 5% de juros à conta poupança
- Saque $550 da conta corrente (deve ser bem-sucedido usando o cheque especial)
- Tente sacar mais $100 da conta corrente (deve ser negado - excederia o limite do cheque especial)
Savings transactions: XeTotal 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.0Experimente 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
1Fundamentos de POO
Arquivos ExternosBibliotecas e ImportaçõesIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosVariáveis de InstânciaFundamentos de ConstrutoresRecapitulação - Calculadora Simples4Null Safety
Introdução ao Null SafetyNullable vs Non-NullableOs Operadores ? e !Palavra-chave Late e Null SafetyOperadores Null-AwareNull Safety em ClassesRecapitulação - Sistema de Perfil de Usuário7Classes Abstratas e Interfaces
Classes AbstratasMétodos AbstratosInterfaces em DartInterfaces ImplícitasImplementando vs EstendendoMúltiplas InterfacesRecapitulação - Calculadora de Formas10Coleções e Generics
Visão Geral de List, Set e MapColeções Type-SafeClasses GenéricasMétodos GenéricosRestrições de GenericsIterable e IteratorRecapitulação - Armazenamento Genérico13Conceitos Avançados de POO
Composição vs HerançaMétodos de ExtensãoClasses ChamáveisClasses Seladas (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums com Métodos16Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário2Construtores em Dart
Construtor PadrãoConstrutores NomeadosListas de InicializaçãoConstrutores ConstantesConstrutores FactoryConstrutores de RedirecionamentoRecapitulação - Shape Builder5Encapsulamento
Membros Públicos vs PrivadosA Convenção do Prefixo _Privacidade em Nível de BibliotecaAprofundamento em Getters & SettersOcultação de InformaçãoRecapitulação - Registros de Estudantes8Mixins
Introdução aos MixinsCriando MixinsUsando Múltiplos MixinsPalavra-chave on em MixinsMixin vs HerançaMixin vs InterfaceRecapitulação - Sistema Animal11Métodos Especiais
Sobrescrita de toString()Sobrescrita de hashCode & ==Interface ComparableMétodo call()Sobrescrita de noSuchMethodRecapitulação - Coleção Personalizada14Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy17Desafios Finais
Plataforma de E-LearningSistema BancárioSistema de Personagens de JogoServiço de Aluguel de Veículos3Propriedades de Classe
Membros de Instância vs EstáticosCampos Final & ConstVariáveis LateMétodos e Campos EstáticosGetters e SettersRecapitulação - Gerenciador de Conta Bancária6Herança
Herança BásicaA Palavra-chave superSobrescrita de MétodoA Anotação @overrideA Palavra-chave final para ClassesConstrutores e HerançaRecapitulação - Hierarquia de Funcionários9Polimorfismo
Fundamentos do PolimorfismoPolimorfismo via InterfacesVerificação de Tipos em Tempo de ExecuçãoOs Operadores is & asPalavra-chave CovariantRecapitulação - Processador de Pagamentos12POO Assíncrona
Futures e async/awaitFundamentos de StreamsStream ControllersConstrutores AssíncronosAsync em Métodos de ClasseRecapitulação - Data Fetcher15Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository