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