【Java】【HitAndBlow】コメント書いてみた
前回公開したソースを読みやすくすることを目標に。
がっつりJavadoc作る気はないので普通のラインコメントにしてみましたが
JavadocコメントののほうがJava読みなれている人にはいいんですかね?
コメントの書き方に関しては以下を参考にしました。
Amazon.co.jp: リーダブルコード
良い?悪い?コードコメントの書き方 - SlideShare
package play; import java.util.ArrayList; import java.util.Arrays; import java.util.Random; public class HitAndBlow { // CHAR_USED_IN_THIS_GAMEの文字を1回ずつ使ってゲームに使う文字列を作る // Guestも参照 static final String[] CHAR_USED_IN_THIS_GAME = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; // makeOneRandomCodeがCODE_LENGTHの値をもとに文字列の長さを決める // Guestも参照 final static int CODE_LENGTH = 4; // HitAndBlowのインスタンスが生成されるたびランダムに1つ正解の文字列を作る private final String ANSWER_OF_THIS_GAME = makeOneRandomCode(); // judgeGameEndの戻り値を保持する private boolean gameIsEnd = false; private Guest player = new Guest(); // HitAndBlowのインスタンスを作りstartGameを呼び出すことで // Gameを開始する private void startGame(){ System.out.println(ANSWER_OF_THIS_GAME); // 4hitが出るまで無限にゲームを繰り返す while(!gameIsEnd){ this.gameIsEnd = this.startThisTurn(); } } // playerにコマンドラインから文字列入力を要求し // answerHitBlowResultで結果を判定 // judgeGameEndでゲーム終了か否かを返す private boolean startThisTurn(){ String inputOfThisTurn = player.input(); HitBlowResult hitBlowResultOfThisTurn = HitAndBlow.answerHitBlowResult(ANSWER_OF_THIS_GAME, inputOfThisTurn); System.out.println(hitBlowResultOfThisTurn); return judgeGameEnd(hitBlowResultOfThisTurn); } private static boolean judgeGameEnd(HitBlowResult result){ boolean gameIsEnd = (result.getHitCount() == CODE_LENGTH); return gameIsEnd; } // removeメソッドが便利なのでコレクションを使う private static String makeOneRandomCode(){ ArrayList<String> al = new ArrayList<String>(Arrays.asList(CHAR_USED_IN_THIS_GAME)); String str = ""; for (int ai = 0; ai < CODE_LENGTH; ai++){ Random random = new Random(); int tmp = random.nextInt(al.size()); str += al.get(tmp); // 一度選んだ文字は使わない al.remove(tmp); } return str; } // 2つのコードからhitとblowを数え、HitBlowResultインスタンスにして返す。 private static HitBlowResult answerHitBlowResult(String code1, String code2){ int hitCount = 0; int blowCount = 0; for (int i1 = 0; i1 < CODE_LENGTH; i1++){ for (int i2 = 0; i2 < CODE_LENGTH; i2++){ if(i1 == i2) { if(code1.charAt(i1) == code2.charAt(i2)) hitCount++; }else{ if(code1.charAt(i1) == code2.charAt(i2)) blowCount++; } } } HitBlowResult r = new HitBlowResult(code2, hitCount, blowCount); return r; } }
意味のないことはコメントしない!とどちらの資料にも書いてありますが
それが一番難しい気がしますね。
リーダブルコードを繰り返し見つつコメント見直していくことにします。