簡單的個人銀行管理系統實現(二)
阿新 • • 發佈:2019-02-01
2、 個人銀行管理系統版本0.2(對應第5章記錄)
2.1系統需求
為活期儲存賬戶類加入記錄所有賬戶總金額的功能,並且能夠輸出總金額,其餘功能與之前一致。
2.2系統設計
在SavingsAccount類中增加一個靜態資料成員total,用來記錄所有賬戶總金額,並增加相應靜態成員方法getTotal對其訪問。SavingsAccount類如下圖所示:
2.3系統實現
SavingsAccount.java
package self.SelfBank2.test;
public class SavingsAccount {
//儲蓄賬戶類
private int id; //賬號
private double balance; //餘額
private double rate; //存款的年利率
private int lastDate; //上次變更餘額的時期
private double accumulation; //餘額按日累加之和
private static double total; //所有賬戶的總金額
private void record(int date, double amount) {
//獲得到指定日期為止的存款金額按日累積值
if(date <= lastDate){
System.out.println("請檢查輸入!");
}else{
accumulation = accumulate(date);
lastDate = date;
amount = Math.floor(amount * 100 + 0.5) / 100; //保留小數點後兩位
balance += amount;
total += amount;
System.out .println(date+"\t"+"#"+id+"\t"+amount+"\t"+balance);
}
}
private final double accumulate(int date) {
if(date < lastDate){
System.out.println("請輸入正確的日期!");
return 0;
}else{
return accumulation + balance * (date - lastDate);
}
}
SavingsAccount(int date, int id, double rate){
//建構函式及相關成員函式的實現
if(date == 1 && rate > 0 && id > 0){
this.id = id;
this.balance = 0;
this.rate = rate;
this.lastDate = date;
this.accumulation = 0;
System.out.println(date+"\t"+"#"+id+" is created");
}else {
System.out.println("請檢查輸入!");
}
}
public final int getId() { return id; }
public final double getBalance() { return balance; }
public static double getTotal() {
return total;
}
public double getRate() { return rate; }
public void deposit(int date, double amount){
//存入現金;
record(date, amount);
}
public void withdraw(int date, double amount){
//取出現金
if (amount > getBalance())
System.out.println("Error: not enough money");
else if(amount <= 0){
System.out.println("請檢查輸入!");
}
else
record(date, -amount);
}
//結算利息,每年1月1日呼叫一次該函式
public void settle(int date){
double interest = accumulate(date) * rate / 365; //計算年息
if (interest != 0)
record(date, interest);
accumulation = 0;
}
//顯示賬戶資訊
public void show(){
System.out.println("#"+id+"\tBalance: "+balance);
}
}
Main,java
package self.SelfBank2.test;
public class Main {
public static void main(String[] args) {
//建立幾個賬戶
SavingsAccount sa0 = new SavingsAccount(1,21325302,0.015);
SavingsAccount sa1 = new SavingsAccount(1,58320212,0.015);
//幾筆賬目
sa0.deposit(5, 5000);
sa1.deposit(25, 10000);
sa0.deposit(45, 5500);
sa1.withdraw(60, 4000);
//開戶後第90天到了銀行的計息日,結算所有賬戶的年息
sa0.settle(90);
sa1.settle(90);
//輸出各個賬戶資訊
sa0.show(); System.out.println();
sa1.show(); System.out.println();
System.out.println("Total: "+SavingsAccount.getTotal());
}
}
2.4系統測試
書上的例子得到的結果如下:
測試結果基本和之前版本相同,這裡只測試了新加入的getTotal()函式。
使用Junit4來測試的程式碼如下:
初始化設定:
測試用例:
結果通過了測試:
2.5體會心得
這一節最大的問題是用const修飾的常函式在Java裡怎麼轉換,我一開始認為將所有const換為final就可以,然而實際上有問題。const修飾成員函式的作用是:只能讀取資料成員,不能改變資料成員。const成員函式只能呼叫const函式,不能呼叫其它非const成員函式;const物件只能呼叫const成員函式,不能呼叫非const成員函式。而final修飾的方法是不能被過載的,類似於類中的private方法,所以private方法預設是final的。所以final和C++的const差別太大了,而我查資料也沒有發現關於java使用常函式的用法。然後既然是一種保護機制,我看了方法中的程式碼不涉及這個問題,所以沒有這個功能也是可以的。
但我在程式碼中依然保留了final。帶來的一個附帶的好處就是,final方法可以被編譯器優化,比如內聯什麼的,也就是說final的方法可能效率會高一些(僅僅是可能,具體取決於編譯器),並且將方法的引數用final修飾的話,也可能會提高一定的效能。
有坑再填。。