Tài khoản ngân hàng
Lê Hồng Phương phuonglh@gmail.com Khoa Toán-Cơ-Tin học, Trường Đại học Khoa học Tự nhiên, ĐHQG Hà Nội
Nội dung
● Giới thiệu
● Đặc tả
● Thiết kế
● Cài đặt
2012-2013
Object-Oriented Programming: Bank Accounts
2
Giới thiệu
● Mô phỏng một số loại tài khoản ngân hàng
thường gặp
● Mục tiêu kiến thức:
– Kế thừa (inheritance)
– Đa hình (polymorphism)
– Đóng gói (encapsulation)
2012-2013
Object-Oriented Programming: Bank Accounts
3
Đặc tả
● Ngân hàng cung cấp cho khách hàng các loại tài
khoản sau:
– Tài khoản vãng lai, còn gọi là tài khoản séc: không có lãi suất, mỗi tháng được miễn phí một số lượng nhỏ giao dịch, các giao dịch bổ sung phải trả phí.
– Tài khoản tiết kiệm: có lãi hàng tháng theo một lãi
suất được ấn định trước.
2012-2013
Object-Oriented Programming: Bank Accounts
4
Phân tích
● Mọi loại tài khoản đều cần hỗ trợ các chức năng
sau:
– Truy vấn số dư tài khoản
– Nạp tiền vào và rút tiền ra khỏi tài khoản
– Chuyển tiền giữa hai tài khoản
● Tài khoản vãng lai cần có chức năng trừ phí giao
dịch.
● Tài khoản tiết kiệm cần có chức năng tính và trả
lãi.
2012-2013
Object-Oriented Programming: Bank Accounts
5
Thiết kế: Sơ đồ lớp
2012-2013
Object-Oriented Programming: Bank Accounts
6
Thiết kế: BankAccount
● Mỗi BankAccount có một số dư (balance)
– Chú ý: một số ngân hàng cho phép số dư âm.
● Các thao tác trên tài khoản:
– Truy vấn số dư: double getBalance().
– Nạp tiền: void deposit(double)
– Rút tiền: void widthraw(double)
– Chuyển tiền tới tài khoản khác: void transfer(double,
BankAccount)
2012-2013
Object-Oriented Programming: Bank Accounts
7
Thiết kế: CheckingAccount
● Mỗi CheckingAccount cần có khả năng theo dõi số
lần giao dịch được thực hiện trên tài khoản (rút tiền, nạp tiền) để tính phí.
– Có thêm trường dữ liệu int transactionCount
● Cần sửa đổi hành vi của các thao tác rút tiền, nạp
tiền sao cho mỗi lần tài khoản thực hiện các thao tác đó thì sẽ tăng transactionCount lên thêm 1.
● Có thêm phương thức trừ phí giao dịch:
– void deductFees()
2012-2013
Object-Oriented Programming: Bank Accounts
8
Thiết kế: SavingAccount
● Mỗi SavingAccount cần có thêm thông tin về lãi suất
và chức năng cộng thêm tiền lãi cho tài khoản.
– Có thêm trường dữ liệu double interestRate
– Có thêm phương thức void addInterest()
2012-2013
Object-Oriented Programming: Bank Accounts
9
Thiết kế: Sơ đồ lớp
2012-2013
Object-Oriented Programming: Bank Accounts
10
Thiết kế: Sơ đồ lớp
● Quyền truy cập cho các trường/phương thức:
– Kí hiệu - chỉ private
– Kí hiệu + chỉ public
● Các trường dữ liệu đều được đặt là private.
● Các lớp con muốn truy cập vào các trường private của lớp cha thì phải sử dụng các phương thức (public) của lớp cha.
– Đảm bảo tính đóng gói và an toàn dữ liệu
– Cách gọi: super.methodName()
2012-2013
Object-Oriented Programming: Bank Accounts
11
Cài đặt
● Xem các tệp
– BankAccount.java
– CheckingAccount
– SavingAccount
– IConstants
– AccountTester
2012-2013
Object-Oriented Programming: Bank Accounts
12
Cài đặt: BankAccount
public class BankAccount { private double balance;
public BankAccount() {
balance = 0;
}
public BankAccount(double initialBalance) {
balance = initialBalance;
}
public void deposit(double amount) {
balance = balance + amount;
}
public void withdraw(double amount) {
balance = balance - amount;
} // more methods go here...
2012-2013
Object-Oriented Programming: Bank Accounts
13
}
Cài đặt: BankAccount
public class BankAccount {
// ... public double getBalance() {
return balance;
}
public void transfer(double amount, BankAccount other) {
withdraw(amount); other.deposit(amount);
}
}
2012-2013
Object-Oriented Programming: Bank Accounts
14
Trong thực tế, các phương thức cần phải được đồng bộ hóa.
Cài đặt: CheckingAccount
public class CheckingAccount extends BankAccount {
private int transactionCount;
public CheckingAccount(double initialBalance) {
super(initialBalance); transactionCount = 0;
}
public void deposit(double amount) { Gọi phương thức nạp tiền của lớp cha để nạp tiền.
transactionCount++; super.deposit(amount);
}
public void withdraw(double amount) {
Nếu không dùng từ khóa super?
transactionCount++; super.withdraw(amount);
} // more methods go here...
Object-Oriented Programming: Bank Accounts
15
} 2012-2013
Cài đặt: CheckingAccount
public class CheckingAccount extends BankAccount {
// ...
/** * Deducts the accumulated fees and resets * the transaction count. */ public void deductFees() {
if (transactionCount > IConstants.FREE_TRANSACTIONS) {
double fees = IConstants.TRANSACTION_FEE
*(transactionCount - IConstants.FREE_TRANSACTIONS);
super.withdraw(fees);
} transactionCount = 0;
}
2012-2013
Object-Oriented Programming: Bank Accounts
16
} Các hằng số được lưu trong giao diện IConstants.
Cài đặt: SavingAccount
public class SavingsAccount extends BankAccount {
private double interestRate;
public SavingsAccount(double rate) {
interestRate = rate;
}
public void addInterest() {
double interest = getBalance() * interestRate / 100; deposit(interest);
}
2012-2013
Object-Oriented Programming: Bank Accounts
17
}
Cài đặt: AccountTester
public class AccountTester {
public static void main(String[] args) {
SavingsAccount momsSavings = new SavingsAccount(0.5); CheckingAccount myChecking = new CheckingAccount(100);
momsSavings.deposit(10000); momsSavings.transfer(2000, myChecking); myChecking.withdraw(1500); myChecking.withdraw(80);
momsSavings.transfer(1000, myChecking); myChecking.withdraw(400);
momsSavings.addInterest(); myChecking.deductFees();
System.out.println("Mom's savings balance: " + momsSavings.getBalance()); System.out.println("Expected: 7035");
System.out.println("My checking balance: " + myChecking.getBalance()); System.out.println("Expected: 1116");
}
}
2012-2013
Object-Oriented Programming: Bank Accounts
18