Java Mid Basic 〜Lv2_2_Javaの基本(リファクタリング)ゲームループ付き〜

イントロダクション

前回は、四則計算を行うプログラム(ゲームループ付き)を作成しました。

しかし問題が。。。

このプログラムには致命的なバグがあります。これは計算結果をセットする変数が「int型」のため割り算の結果も整数になっていることです。本当は「少数」の答えが入るはずです。
つまり4 / 3 = 1.33333 ...の時に答えが「1」というのは間違いで、「1.33333 ...」というのが正しいということです。

もう少しいうならば、int型の変数にセットした時点で、小数点以下の値が切り捨てられマス。JVMがやってくれるようです。

四則演算の解説

プログラムのコードは別物ですが、わかりやすいと思います。

ここでJUnit

JUnitというのは、テスト用のフレームワークです。これを使用すると、メソッドに「@Test」とつけるだけでテストとして実行することができます。

問題に関して

上ような細かい部分に関しては、Javaに長く触っている人間(自分)でもよくわかっていない部分があります。
それは、「4 /3」の答えはdouble型で表示したらどうなるか?です。※小数点以下が何桁表示されるか?がわからない。。。
なのでテストして見ます。「テストクラス」という言葉を前回使用しましたが、その部分には触れませんでした。
前回作成したテストクラスは実装したクラスと同じ名前になっています。名前になっています。これはよろしくないので以下のように作成しました。そして小数点で表示されない原因を探るべくJUnitテストを実行しました。

下の動画と、連動していませんが、具体的には次のような名前です。

項目 クラス名
テストするクラスの名前 Sammple
テストクラスの名前 SampleTest

JUnitクラス

色々試した結果「割り算を行うときには(答えが小数点になるときは)」計算する値も小数点で計算する必要がある」という結論に至り、「割り算のときは数値を小数(double)で扱う」という仕様を追加することにしました。以下のようなコードになるということです。

// 割り算の場合
double sahenDouble = sahen;
double uhenDouble = uhen;
ansDouble = sahenDouble  / uhenDouble ;

つまり、割り算のときは「小数」を使用するということです。
そしてそれをコードにしたのがGitにアップしてあります。初めのコードと比較された形で閲覧することができると思います。

リファクタリング準備

そして、ソースが汚いのでこれを綺麗にしてやる必要があります。そのために必要なテクニックが「メソッドを作成する」です。「え?そんなのわかるけど?」と思った方はスキありで一本取られます(笑)

メソッドの作り方

先ほどの通りに「メソッドの書き方」は今までに説明しているのでわかると思います。

どーゆーことか?

「メソッドを作るのはなぜか?」という問いに答える事が必要だということです。現状のコードは汚いです。
何を持って「キレイ」「キタナい」の判断をするのか?は今後理解して行けば良いと思いますが、現状では「同じようなコードを何度も書いている」というところが「キタナい」というとこに着眼して話を進めます。というか問題(クエスチョン)にしようと思います。

問題

Gitにあるソースの話をします。switch文が何度も出てきているのでこれをなんとかしたいと思っています。どーしたら良いでしょうか?※つまり長ったらしいコードでスッキリしていないので「キタナイ」というわけです。

ヒント:メソッドを作れば良いのです。

<問題のソース>

public String calculate(String fomula) {
    // 計算の記号を判定
    /* 「ここもコメント」
     * 足し算:0 
     * 引き算:1 
     * 掛け算:2 
     * 割り算:3
     */
    int kigo = -1;
    int tashi = fomula.indexOf("+");
    int hiki = fomula.indexOf("-");
    int kake = fomula.indexOf("*");
    int wari = fomula.indexOf("/");

    if (tashi != -1) {
        // 足し算
        kigo = 0;
    } else if (hiki != -1) {
        // 引き算
        kigo = 1;
    } else if (kake != -1) {
        // かけ算
        kigo = 2;
    } else if (wari != -1) {
        // わり算
        kigo = 3;
    } else {
        System.out.println("四則計算の式が不適切です。: " + fomula);
        return "想定外の例外(Exception)のため不明";
    }
    // 計算記号の文字列を初期化(NULLを設定する)
    String calc = null;

    // 入力された式を取り出す
    switch(kigo) {
    case 0:
        calc = "\\+";
        break;
    case 1:
        calc = "\\-";
        break;
    case 2:
        calc = "\\*";
        break;
    case 3:
        calc = "\\/";
        break;
    }
    // 数式から値を取得する
    String[] fomulaArray = fomula.split(calc);
    if (fomulaArray.length != 2) {
        System.out.println("式が不適当です。「1 + 1」のように入力してください。");
        return "想定外の例外(Exception)のため不明";
    }
    // 左の値にあるスペースを削除する
    String leftValue = fomulaArray[0].trim();
    int sahen = Integer.parseInt(leftValue);
    // 右の値にあるスペースを削除する
    String rightValue = fomulaArray[1].trim();
    int uhen = Integer.parseInt(rightValue);
    // 答えの変数を初期化
    int answer = 0;
    // 割り算用の変数
    double ansDouble = 0.0;
    // 計算をする
    switch(kigo) {
    case 0:
        answer = sahen + uhen;
        break;
    case 1:
        answer = sahen - uhen;
        break;
    case 2:
        answer = sahen * uhen;
        break;
    case 3:
        // 割り算の場合
        double sahenDouble = sahen;
        double uhenDouble = uhen;
        ansDouble = sahenDouble  / uhenDouble ;
        break;
    }
    // 三項演算子(記号が3ならばansDoubleを、そうでないならばanswerを文字列に変換
    return kigo == 3 ? String.valueOf(ansDouble) : String.valueOf(answer);
}

でわでわ。。。

<<< 前回 次回 >>>

Java Basic

  1. Java Basic Level 1 Hello Java
  2. Java Basic Level2 Arithmetic Calculate
  3. Java Basic Level3 About String class
  4. Java Basic Level 4Boolean
  5. Java Basic Level 5If Statement
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 Traning of If statement
  8. Java Basic Level8 How to use for statement
  9. Java Basic Level 8.5 Array
  10. Java Basic Level 9Training of for statement
  11. Java Basic Level 10 While statement
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1
  17. Java Basic JUnit 〜テストスイートの作り方〜

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す