Menu
CoddyTech

Hệ thống ngân hàng

Thuộc phần Lập trình hướng đối tượng trong hành trình Dart của Coddy. Bài học 108 trên 110.

challenge icon

Thử thách

Dễ

Hãy xây dựng một Hệ thống ngân hàng mô phỏng các hoạt động tài chính trong thực tế bằng cách áp dụng các nguyên tắc OOP bạn đã nắm vững trong khóa học này. Bạn sẽ tạo các tài khoản với những quy tắc khác nhau, theo dõi giao dịch và quản lý khách hàng, tất cả được tổ chức trong nhiều tệp.

Hệ thống ngân hàng của bạn sẽ được tổ chức trong sáu tệp:

  • transaction.dart: Tạo lớp Transaction đại diện cho một bản ghi bất biến về hoạt động tài chính. Mỗi giao dịch có các trường final cho type (String, "deposit", "withdrawal" hoặc "transfer"), amount (double) và timestamp (DateTime). Ghi đè toString() để trả về [type] $amount.
  • account.dart: Tạo lớp trừu tượng Account với _balance riêng tư (double), số tài khoản final (accountNumber, String) và một List<Transaction> để lưu lịch sử giao dịch. Thêm getter cho số dư, setter được bảo vệ set balance(double value) để các lớp con trong những tệp khác có thể cập nhật số dư, phương thức trừu tượng bool canWithdraw(double amount) để các lớp con triển khai, cùng các phương thức cụ thể sau:
    • deposit(double amount): cộng vào số dư, ghi lại một giao dịch và in ra Deposited $amount. Balance: $balance
    • withdraw(double amount): nếu canWithdraw() trả về true, trừ khỏi số dư, ghi lại một giao dịch và in ra Withdrew $amount. Balance: $balance. Nếu không, in ra Withdrawal denied.
    • getTransactionCount(): trả về số lượng giao dịch
  • savings_account.dart: Tạo một SavingsAccount kế thừa Account. Tài khoản tiết kiệm có giới hạn rút tiền: không thể rút quá $500 trong một giao dịch. Triển khai canWithdraw() để áp dụng quy tắc này, đồng thời bảo đảm số dư đủ. Thêm phương thức applyInterest(double rate) để tăng số dư theo tỷ lệ phần trăm đã cho bằng getter và setter balance, sau đó in ra Interest applied. Balance: $balance.
  • checking_account.dart: Tạo một CheckingAccount kế thừa Account. Tài khoản thanh toán có hạn mức thấu chi $100, tức là số dư có thể âm nhưng không thấp hơn -$100. Triển khai canWithdraw() để cho phép rút tiền miễn là số dư sau giao dịch bằng hoặc lớn hơn -$100.
  • customer.dart: Tạo lớp Customer với id (String), name (String) và một List<Account> chứa các tài khoản của khách hàng. Thêm phương thức addAccount(Account account) để thêm tài khoản và getTotalBalance() để trả về tổng số dư của tất cả tài khoản. Ghi đè toString() để trả về Customer: name (X accounts).
  • main.dart: Minh họa hệ thống ngân hàng của bạn. Tạo một khách hàng (C001, John Smith). Tạo một SavingsAccount (SAV001, số dư ban đầu $1000) và một CheckingAccount (CHK001, số dư ban đầu $500). Thêm cả hai tài khoản vào khách hàng rồi in thông tin khách hàng. Sau đó thực hiện các thao tác sau:
    1. Nạp $200 vào tài khoản tiết kiệm
    2. Rút $300 từ tài khoản tiết kiệm (sẽ thành công)
    3. Thử rút $600 từ tài khoản tiết kiệm (sẽ bị từ chối vì vượt quá hạn mức)
    4. Áp dụng lãi suất 5% cho tài khoản tiết kiệm
    5. Rút $550 từ tài khoản thanh toán (sẽ thành công nhờ hạn mức thấu chi)
    6. Thử rút thêm $100 từ tài khoản thanh toán (sẽ bị từ chối vì vượt quá hạn mức thấu chi)
    Cuối cùng, in ra Savings transactions: X và Total balance: $Y (định dạng với 2 chữ số thập phân).

Đầu ra dự kiến:

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

Tự làm thử

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

void main() {
  // TODO: Tạo một khách hàng có id "C001" và tên "John Smith"
  
  // TODO: Tạo một SavingsAccount có accountNumber "SAV001" và số dư ban đầu $1000
  
  // TODO: Tạo một CheckingAccount có accountNumber "CHK001" và số dư ban đầu $500
  
  // TODO: Thêm cả hai tài khoản vào khách hàng
  
  // TODO: In ra thông tin khách hàng
  
  // TODO: Thực hiện các thao tác sau:
  // 1. Gửi $200 vào tài khoản tiết kiệm
  // 2. Rút $300 từ tài khoản tiết kiệm (giao dịch sẽ thành công)
  // 3. Thử rút $600 từ tài khoản tiết kiệm (giao dịch sẽ bị từ chối vì vượt hạn mức)
  // 4. Áp dụng lãi suất 5% cho tài khoản tiết kiệm
  // 5. Rút $550 từ tài khoản thanh toán (giao dịch sẽ thành công nhờ khoản thấu chi)
  // 6. Thử rút thêm $100 từ tài khoản thanh toán (giao dịch sẽ bị từ chối vì vượt hạn mức thấu chi)
  
  // TODO: In ra "Savings transactions: X", trong đó X là số lượng giao dịch
  
  // TODO: In ra "Total balance: \$Y", trong đó Y được định dạng với 2 chữ số thập phân
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Dart online