Tài khoản ngân hàng

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)

pdf18 trang | Chia sẻ: thuychi11 | Lượt xem: 472 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Tài khoản ngân hàng, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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 2012-2013 Object-Oriented Programming: Bank Accounts 2 Nội dung ● Giới thiệu ● Đặc tả ● Thiết kế ● Cài đặt 2012-2013 Object-Oriented Programming: Bank Accounts 3 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 4 Đặ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 5 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 6 Thiết kế: Sơ đồ lớp 2012-2013 Object-Oriented Programming: Bank Accounts 7 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 8 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 9 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 10 Thiết kế: Sơ đồ lớp 2012-2013 Object-Oriented Programming: Bank Accounts 11 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 12 Cài đặt ● Xem các tệp – BankAccount.java – CheckingAccount – SavingAccount – IConstants – AccountTester 2012-2013 Object-Oriented Programming: Bank Accounts 13 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 14 Cài đặt: BankAccount public class BankAccount { // ... public double getBalance() { return balance; } public void transfer(double amount, BankAccount other) { withdraw(amount); other.deposit(amount); } } Trong thực tế, các phương thức cần phải được đồng bộ hóa. 2012-2013 Object-Oriented Programming: Bank Accounts 15 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) { transactionCount++; super.deposit(amount); } public void withdraw(double amount) { transactionCount++; super.withdraw(amount); } // more methods go here... } Gọi phương thức nạp tiền của lớp cha để nạp tiền. Nếu không dùng từ khóa super? 2012-2013 Object-Oriented Programming: Bank Accounts 16 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; } } Các hằng số được lưu trong giao diện IConstants. 2012-2013 Object-Oriented Programming: Bank Accounts 17 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 18 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"); } }