Mr.Hack | ||
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ◆目次◆ Mr.Hackです。お元気ですか? 前回のコンソールベースのユーザーインターフェイスはどうでしたか?楽しめましたか?プログラムが起動してから、一連に預金・引き出し・残高参照としているため、なんとも使いづらいですね。それも、預金しないときはゼロを入力しなければなりませんでした。
これをさける一つの方法として、メインメニューを作り、その一つ一つの項目を選ぶと、その項目のロジックを実行させるようにすれば、より使いやすくなりそうです。例えば、メインメニューを ┌──────────────────────────────────┐ [1] 預金をする のように表示して、1を選ぶと預金のロジックをするようにするのです。そして、そのロジックが終了すると、また上記のメインメニューに戻ります。こうすると、一連に預金・引き出し・残高参照する前回のユーザーインターフェイスより操作しやすくなりそうですね。 メインメニューが表示された後に、ユーザーに入力を促します。例えば、こんな感じです。 ┌──────────────────────────────────┐ ご希望のお取引番号をお選び下さい : └──────────────────────────────────┘ ユーザーが入力した値をコンソールから得るには、BufferedReaderクラスのインスタンスを使いました。 ┌──────────────────────────────────┐ BufferedReader buffer = new BufferedReader( コンソールから、String型のchoiceを得ることが出来ましたが、このchoiceを元にどうやって、各項目のロジックを実行するようにすればいいのでしょう?各ロジックは、if文をつかったり、switch文を使ったりして分岐できます。 ┌──────────────────────────────────┐ if (choice.equals("1")) { └──────────────────────────────────┘ とできます。では、switch文を使う場合はどうすればいいでしょうか? ■switch文 switch文を使うと、 ┌──────────────────────────────────┐ switch (choice) { というように書けます。switch文を使ってもif文と全く同じことをすることが出来ます。ただし、switch文は変数choiceとしてString型がつかえません。使えるのは、byte、char、short、int型だけです。つまり、buffer.readLine()はString型の値を返しますから、何らかの方法でString型→char型と変換してあげないといけません。その変換にはどのメソッドを使いましたか?そうです。String#charAt()メソッドですね。charAt(int Index)メソッドはString型(実はchar[]型をラップしたもの)のindexのポジションにあるchar型のキャラクタを得ることが出来ますので、 ┌──────────────────────────────────┐ で一文字目の値を得ることができます。char型に変換すれば、switch文として使うことができますね。ところで、buffer.readLine().charAt(0)の"."(ドット)はどう解釈するのでしたっけ? ┌──────────────────────────────────┐ と、buffer.readline() をまず読みます。これが String 型を返しますね。その String 型のインスタンスに"."で charAt() メソッドを適用すると char 型であchoiceを得ることができます。 ┌──────────────────────────────────┐ と同じ意味です。 話を switch 文に戻します。switch 文で int 型が使えると書きましたが、僕は char型を使った方がいいとおもいます。というのは、case に ┌──────────────────────────────────┐ とは書けますが、 ┌──────────────────────────────────┐ とは書けないのです。つまり、switchでaと言う文字を判別したいときは、 ┌──────────────────────────────────┐ とするしかありません。'a'がint型で97と覚えている人は少ないと思いますので、switch文にはchar型を使った方が使いやすいと思います。 それから、switch文で注意しないといけないのは、条件分岐としてbreak(switch文を抜け出す)やreturn(switchを含むメソッドを抜け出す)、throw(try/catch文があるところまで抜ける)を使うことです。もしそれらがない場合は、全て上から順に実行されてしまいます。例えば、 ┌──────────────────────────────────┐ switch (choice) { └──────────────────────────────────┘ で choice が '1'なら、預金・引き出し・残高・プログラム終了・上記に当てはまらない場合、まで全て実行されてしまいます。この点を注意しておいて下さい。 あとは、前回の預金ロジック、引き出しロジック、残高参照ロジック、プログラム終了ロジックを各 case 以下に移せばいいと思います。預金ロジック、引き出しロジックでは、今回では、『0』は預金・引き出しをしないということを意味しないので、0 もそのまま、deposit()、withdraw() に渡して良いでしょう。ただし、その場合は、IllegalArgumentException が発生しますので、例外処理もします。 プログラム終了のロジックですが、前回はユーザーが'q'か'Q'を入力したときだけプログラムを終了するようにしました。今回は、メインメニューで4を選ぶと終了出来ますが、もし誤って4を押してしまったらどうしましょう。4を押すこと自体が意思表示だから、間違えることがないのでしょうか?テンキーではないキーボード上の数字は1から順に並んでいますね。当然ですが、4の右隣は3です。残高を参照しようと思って、3を押したかと思ったら4を押してそのままリターンキーを押してしまう場合もあるかもしれません。それを防止するために、本当に4の『プログラムを終了する』のかどうかをもう一度ユーザーに問い合わせてみましょう。 そのユーザーに取引を続けるかどうかを問い合わせるロジックをisContinued()として分離します。このメソッドがtrue返せば、取引続行、falseを返せば取引終了(プログラム終了)そして、そのboolean型をnextTransactionというboolean型のフラグにセットしてこのフラグがfalseのあいだは取引を続行するようにしてみましょう。 ┌──────────────────────────────────┐ boolean nextTransaction = true; // ユーザーに取引終了かどうか問い合わせ
└──────────────────────────────────┘
では、isContinued()メソッドはどのように設計すればいいでしょうか? ┌──────────────────────────────────┐ boolean isContinued() { └──────────────────────────────────┘
┌──────────────────────────────────┐ └──────────────────────────────────┘ というようになりますね。今回は、ユーザーからString型である文字列でその条件をチェックします。String型を比較するときはどのメソッドを使えばいいのでしょう?SDK API仕様をみてください。Stringクラスにはどのようなメソッドがありますか?比較するのだから、compareTo()メソッド?それでもいいですね。ompareTo()メソッドは戻り値がint型で一致した場合は、0を返すので ┌──────────────────────────────────┐
┌──────────────────────────────────┐ if (!choice.compareTo("y")) {
文字列が同じか同じでないかを比較する場合は、compareTo()メソッドより使いやすいメソッドがあります。equals()メソッドです。このメソッドは戻り値がboolean型で比較文字列が同じ場合はtrue、それ以外はfalseを返します。それを利用すると、 ┌──────────────────────────────────┐ String choice //ユーザーの選択した値 └──────────────────────────────────┘ とできますね。また、String型なので、 ┌──────────────────────────────────┐ というように、一字ではない文字列の比較も出来ます。char型ではこうはできませんね。 ところで、 ┌──────────────────────────────────┐ とは出来るでしょうか?答えはNOです。文法的には正しいです。しかし、==(イーコール・イーコール)では思わぬプログラムエラーを招いてしまいます。この場合は、.equals(ドット・イーコール)を必ず使って下さい。 完成したisContinued()メソッドは以下のようになります。 ┌──────────────────────────────────┐ /**
このカラクリを次号で見ていきたいと思います。次号もをお楽しみに。 Mr.Hack
|
||
© 2002 MR.HACK ALL RIGHTS RESERVED |