イントロダクション
前回作成したプログラムを改修します。大まかに下の動画のような動きをします。
このプログラムは、githubにアップロードしてあるので、参考にどうぞ。付随するプログラムとしては下のものです。
- MainBank: 上のリンクと同じものです。メイン処理を行います。
- Calcuration: 計算処理、貯金金額の管理をおないます。
- InputChecker: 入力チェックを行います。
上のリンクにあるプログラムは作成済みのものです。
チェック処理クラスの作成
今回も、下のような作成したクラスをカスタムして、入力チェック処理を作成します。
ちなみに前回は、コンストラクタを修正(カスタム)してコーダー銀行ATM(仮装)のアプリを作成しました。
実装内容確認
今回は、コーダー銀行の入力チェック処理を作成してみようと思います。
なんども、同じようなことを記載しますが、オブジェクト指向プログラミングでは「役割分担」が大切です。大雑把に以下のような形(イメージ)で実装します。
- 「〜担当のクラス」という役割を割り当てやる
- メイン処理で呼び出してやる。
コードで書くと下のような感じです。
A.処理のはじめ「いらっしゃいませ」という挨拶部分。
System.out.println("コーダー銀行へようこそ、入金しますか?引き出しますか?"); System.out.println("あなたの、預金額は ¥" + cal.getYokingaku() + "-です。"); System.out.println("入金の時は「in」、引き出しの時は「out」を、終了する時は「bye」を入力してください。");
B.入力を行う部分
Scanner input = new Scanner(System.in);
while(true) {
String inStr = input.nextLine();
if ("in".equals(inStr)) {
System.out.println("入金処理を行います。");
cal.nyukin(input, true);
} else if ("out".equals(inStr)) {
System.out.println("引出し処理を行います。");
cal.nyukin(input, false);
} else if ("bye".equals(inStr)) {
break;
} else {
System.out.println("「in」か「out」を入力してください。");
}
}
処理の終わり
System.out.println("ATM処理を終了します。ご利用ありがとうございました。");
こんな感じ(イメージ)です。
「なんだ、処理を区分けして説明しただけぢゃねぇか。。。」と思った方、その通りでございます。
「処理を区分け」することがはじめの一歩目になります。
改めて、仕様を見て見ます。
- アプリを起動してコンソールから「引き出す」「入金」を選択する
- それぞれの処理に対して「預金額」から足し算、引き算を行いその結果を表示する
このアプリを作成するために作った「部品」は以下の通りです。
- メインメソッドを持ち、入力の受付も行うクラス
- 入金、引き出しを行う計算処理クラス
早い話が、以下のようなクラスを作成するということです。
- メインの処理を作成する(実装する)クラス
- 預金額を管理して、預金額の計算を行うクラス
入力チェック処理
今回のミッションは「入力チェック処理」を作成することです。
なので、「入力処理」を担当するクラスの処理内容を確認します。
上記より、1のメイン処理を作成するクラスがそのクラスになります。
入力処理
ズバリ、Scannerクラスを使用しているところです。
つまり、String inStr = input.nextLine();
の部分が入力を受け取っている処理です。
このScannerクラスは、java.utilパッケージにあります。
とにかく入力された値をStringクラスで受け取ります。
そして、入力された値が妥当かチェックしようというわけです。
チェック処理
チェック処理は、以下のようなものを作成しようと思います。
- 入力チェック1:入金、引き出し、終了の選択をさせる
- 「in」「out」「bye」の入力以外はエラーにする
そして、入力チェック処理(クラス)を作成したら、ソースの整理をします。
入力チェック処理は、今回の目玉なので処理内容を記載しません。つまりコードは書きません。その代わり、チェック処理を作成した後の整理(リファクタリング)部分について記載します。現在の入力部分は以下のようになっています。※他にもありますが、今回はこの部分を対象とします。
while(true) {
String inStr = input.nextLine();
if ("in".equals(inStr)) {
System.out.println("入金処理を行います。");
cal.nyukin(input, true);
} else if ("out".equals(inStr)) {
System.out.println("引出し処理を行います。");
cal.nyukin(input, false);
} else if ("bye".equals(inStr)) {
break;
} else {
System.out.println("「in」か「out」を入力してください。");
}
}
無限ループする処理の中です。しかし入力チェックと無限ループは関係ありません。(オブジェクト間の依存関係がないということです)ただし、コード上ではループの中で入力チェックを行うので関連性があります。
ちょっとややこし言い方をしましたが、これは以下のようなループ部分
while(true) { ... }
と入力を受ける処理String inStr = input.nextLine();
をはっきりと分けて考えるために記載しました。つまりは以下のようにチェック処理を独立させたいということです。
入力チェック処理を担当するクラスを作成し、そのクラスが入力チェックを行うようにする
こうすることで何が変わるか?ということなのですが、これはチェック処理の内容のみを変更したいときにすぐに追加・変更が可能なようにするということです。
チェック処理を独立させる(今回の目玉)
ズバリ、チェッククラスを作成します。名前は「InputChecker」にします。MainBankのループ部分の処理は、以下のような実装にします。
単純に、次の処理を追加しただけです。
-
入力チェックを行い、エラーがあればメッセージを返す処理を追加
String errorMessage = InputChecker.validNyukinHikidashi(inStr);
-
メッセージ(errorMessage)が、Nullかどうかの判定を追加
最終的に下のようなコードになりました。
while(true) {
String inStr = input.nextLine();
String errorMessage = InputChecker.validNyukinHikidashi(inStr);
// この部分を追加しました。↓
if (errorMessage != null) {
System.out.println(errorMessage);
continue;
}
// 追加した部分終了行↑
if ("in".equals(inStr)) {
System.out.println("入金処理を行います。");
cal.nyukin(input, true);
} else if ("out".equals(inStr)) {
System.out.println("引出し処理を行います。");
cal.nyukin(input, false);
} else if ("bye".equals(inStr)) {
break;
}
}
これで、処理中にエラーがあった場合、は上のコードの一部のみを実行するだけで良いので、無駄な処理を行わなくて済みます。つまりは下のコードのみを実行するだけになります。
String inStr = input.nextLine();
String errorMessage = InputChecker.validNyukinHikidashi(inStr);
if (errorMessage != null) {
System.out.println(errorMessage);
continue;
}
もう一つ、入力チェッククラスを新たに作成しているので、チェック処理を追加するときは、InputCheckerクラスの修正をするだけでよくなります。
※どのような実装にするかは、プログラマ側で決めるところです。こういうところが面白い☆
でわでわ。。。
<Java関連の動画リスト>