Menu
Coddy logo textTech

銀行システム

CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 108/110。

challenge icon

チャレンジ

簡単

このコースで習得したOOP(オブジェクト指向プログラミング)の原則を使用して、現実世界の金融業務をモデル化した銀行システムを構築しましょう。異なるルールを持つアカウントを作成し、取引を追跡し、顧客を管理します。これらすべてを複数のファイルに整理して作成します。

銀行システムは、以下の6つのファイルで構成されます。

  • transaction.dart: 金融操作の不変の記録を表す Transaction クラスを作成します。各トランザクションには、type(String - "deposit"、"withdrawal"、または "transfer")、amount(double)、および timestamp(DateTime)の final フィールドを持たせます。toString() をオーバーライドして、[type] $amount を返すようにします。
  • account.dart: 抽象クラス Account を作成します。プライベートな _balance(double)、final の口座番号(accountNumber - String)、および取引履歴を保存するための List<Transaction> を持たせます。残高のゲッター、他のファイルのサブクラスが残高を更新できるようにするためのプロテクトセッター set balance(double value)、サブクラスが実装する抽象メソッド bool canWithdraw(double amount)、および以下の具体的なメソッドを含めます。
    • deposit(double amount) - 残高に追加し、取引を記録し、Deposited $amount. Balance: $balance と出力します。
    • withdraw(double amount) - canWithdraw() が true を返す場合、残高から差し引き、取引を記録し、Withdrew $amount. Balance: $balance と出力します。それ以外の場合は Withdrawal denied と出力します。
    • getTransactionCount() - 取引の数を返します。
  • savings_account.dart: Account を継承する SavingsAccount を作成します。普通預金口座(Savings account)には引き出し制限があり、1回の取引で $500 を超えて引き出すことはできません。このルールを適用するために canWithdraw() を実装します(十分な残高があることも確認してください)。balance のゲッターとセッターを使用して、指定されたパーセンテージ率で残高を増やす applyInterest(double rate) メソッドを追加し、Interest applied. Balance: $balance と出力します。
  • checking_account.dart: Account を継承する CheckingAccount を作成します。当座預金口座(Checking account)には $100 までの当座貸越保護があり、残高がマイナスになっても -$100 を下回らなければ許容されます。結果の残高が -$100 以上に保たれる限り引き出しを許可するように canWithdraw() を実装します。
  • customer.dart: id(String)、name(String)、および所有する口座の List<Account> を持つ Customer クラスを作成します。口座を追加する addAccount(Account account) メソッドと、すべての口座残高の合計を返す getTotalBalance() メソッドを含めます。toString() をオーバーライドして、Customer: name (X accounts) を返すようにします。
  • main.dart: 銀行システムのデモンストレーションを行います。顧客(C001, John Smith)を作成します。SavingsAccountSAV001、開始残高 $1000)と CheckingAccountCHK001、開始残高 $500)を作成します。両方の口座を顧客に追加し、顧客情報を出力します。 次に、以下の操作を実行します。
    1. 普通預金口座に $200 を預け入れる
    2. 普通預金口座から $300 を引き出す(成功するはずです)
    3. 普通預金口座から $600 を引き出そうとする(制限を超えるため、拒否されるはずです)
    4. 普通預金口座に 5% の利息を適用する
    5. 当座預金口座から $550 を引き出す(当座貸越を使用して成功するはずです)
    6. 当座預金口座からさらに $100 を引き出そうとする(当座貸越限度額を超えるため、拒否されるはずです)
    最後に、Savings transactions: XTotal balance: $Y(小数点以下2桁にフォーマット)を出力します。

期待される出力:

Customer: John Smith (2 accounts)
Deposited $200.0. Balance: $1200.0
Withdrew $300.0. Balance: $900.0
Withdrawal denied
Interest applied. Balance: $945.0
Withdrew $550.0. Balance: $-50.0
Withdrawal denied
Savings transactions: 3
Total balance: $895.0

自分で試してみよう

import 'transaction.dart';
import 'account.dart';
import 'savings_account.dart';
import 'checking_account.dart';
import 'customer.dart';

void main() {
  // TODO: id が "C001"、name が "John Smith" の顧客を作成する
  
  // TODO: accountNumber が "SAV001"、開始残高が $1000 の SavingsAccount を作成する
  
  // TODO: accountNumber が "CHK001"、開始残高が $500 の CheckingAccount を作成する
  
  // TODO: 両方のアカウントを顧客に追加する
  
  // TODO: 顧客情報を出力する
  
  // TODO: 以下の操作を実行する:
  // 1. 普通預金口座(savings account)に $200 を預け入れる
  // 2. 普通預金口座から $300 を引き出す(成功するはずです)
  // 3. 普通預金口座から $600 の引き出しを試みる(限度額を超えるため、拒否されるはずです)
  // 4. 普通預金口座に 5% の利息を適用する
  // 5. 当座預金口座(checking account)から $550 を引き出す(オーバードラフトを使用して成功するはずです)
  // 6. 当座預金口座からさらに $100 の引き出しを試みる(オーバードラフトの限度額を超えるため、拒否されるはずです)
  
  // TODO: "Savings transactions: X" と出力する(X は取引数)
  
  // TODO: "Total balance: \$Y" と出力する(Y は小数点以下2桁にフォーマットする)
}

オブジェクト指向プログラミングのすべてのレッスン