イントロダクション
役割分担などのクラスを扱う、プログラム設計をする。ということをやってきたので、今度は実際にプログラムを作成しなが
設計から実装までをやってみたいと思います。
そのため、前書きというか能書きが長くなります。申し訳ない・・・
設計したプログラム
設計したプログラムは「コーダー銀行アプリ」です。単純に標準入力から金額を入力してそれを保持します。
お金を入金すれば、加算され、引き出せば減算されるというようなプログラムです。
このプログラムの実装には、以下のクラスを使用しています。※Githubにソースがあります
クラス図 ※利用していないものもあります。
- MainBankクラス: メインメソッドがある、プログラムを起動するクラス
- Calcurationクラス: 細かい計算などを行うためのクラス
- InputCheckerクラス: 入力値などをチェックするためのクラス
それぞれ上のように役割分担をしました。
MainBankクラスの設計
- このクラスは、メインメソッドを実行しATMの機能を実装したatm()メソッドを起動する。
- atmメソッドは、以下の処理を行う
- ATMの受付表示
- ATMの終了・入金・引出し操作
Calcurationクラス
- このクラスは、ATMに貯金されている金額の管理を行う ※預金額は1000円スタート
- 入金処理と引出し処理を行う
InputCheckerクラス
- このクラスは、入力した値が適当かどうか判定する
設計後の実装
今回は、部品の設計を行った後の、実装を行います。(設計で)作成したクラスは以下の通りです。
- MainBankクラス
- Calcurationクラス
設計レベル1
作成するクラスは上記の通りですので、これらをシンプルに実装します。
MainBakクラス
筆者が実装したメインメソッドは、以下になります。
public static void main(String[] args) {
MainBank main = new MainBank();
main.atm();
}
2行で終わりました。。。デワデワ。。。
というのは冗談として、最終的なソースはGitにコミットしておきます。(本当はPUSHですが。。。)
mainメソッドで、「ATIMを起動する」という言葉をmain.atm()
と実装しています。次は、ATMを起動したら、「ATMの処理内容」を実装します。以下は、その実装例になります。これを参考にオリジナル仕様で作成してください。
- 「いらっしゃいませ」などのメッセージを表示する
- 入力を促す文言の表示
- 入力を受付て「入金」「引出」を選択する
- 上記と同様に、「入金」「引出」の処理を実行する
- ATMを終了する入力を受けたらプログラム終了
ここまできたら、あとは創意工夫がモノを言うので、ここでは参考程度に、筆者が実装した結果を記載したいと思います。
部品一覧
一覧と言っても、2つのクラスしかないので、大したことはないのですが、簡単に説明だけつけておきます。
- MainBankクラス
- ・メインメソッ: このクラスのatm()メソッドを呼び出します。これだけです。
- ・フィールド: cal=Calcurationクラス
- ・コンストラクタ: 引数なしのコンストラクタで、Calcurationクラスのインスタンスを生成する
- ・atm()メソッド: コンソール表示を行い、入金、引き出しのどちらかの処理を呼び出す。
そして、想定外の入力があった時はエラーメッセージを出力して再度入力を促す
- Calcurationクラス
- ・フィールド: 預金額を保持
- ・預金額のGetterとSetterを持っている
- ・入金・引き出し処理メソッド: 第二引数のbooleanで入金か引き出しか判定する。あとは入金なら足し算、引き出しなら引き算を行う。
- 他のメソッドは細かい入力チェック、計算処理
これらのクラス関係
MainBankクラスはフィールドにCalcurationクラスを持っている。このクラスがアプリケーションのメインを担当する。
これに対して、Calcurationクラスは、入金、引き出し処理の担当を行い。フィールドには預金額を保持するようにしている。入金、引き出しの処理で預金額が加算されたり、減算される。
コンストラクタについて
コンストラクタはクラスのインスタンスを作る(newする)ときに動くメソッドのようなものでクラスの初期化を行う。
そして、引数のあるなしによりコンストラクタは区別される。具体的には下のようなコードです。
public class MainBank {
MainBank() {
// コンストラクタA
}
MainBank(int yokingaku) {
// コンストラクタB
}
}
上の2つのコンストラクタはJVMによって区別されます。つまりは、両方とも定義(コードに書くことができる)ということです。
例えば、メインメソッドでコンストラクタを呼び出したときに処理が走る場所が変わります。サンプルコードをいかに記載しいます。
public static void main(String[] args) {
// コンストラクタAが起動する
MainBank main = new MainBank();
// コンストラクタBが起動する
MainBank main = new MainBank(1008);
}
このようにコンストラクタを複数作るのは、初期化するパターンを何個か作成したいからです。
もし、「このパターンはいらんな。。。」という場合はこのようにコンストラクタを複数作らなければ良いのです。
そして、上のように「引数あり」と「引数なし」のコンストラクタ(メソッド)を作成することを「オーバーロード」と言いいます。
のちに、「オーバーライド」という言葉も出てくるので混同しないようにしましょう。
とりあえずは、クラスを作った後に、どのようにしようするのか?という部分について記載しました。今後は、作成したクラスにいろいろな使い方ができるように、次を意識しながら実装していきます。
- コンストラクタでは何をする?
- インスタンスの数は?
- 処理の流れはこれでよいか?
- わかりやすいコードになっているか?
でわでわ。。。
<Java関連の動画リスト>