1. 程式人生 > >簡單的個人銀行管理系統實現(二)

簡單的個人銀行管理系統實現(二)

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修飾的話,也可能會提高一定的效能。

有坑再填。。