blog.waterlow.work

Ruby, Rails, js, etc...

【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;
	}
}

意味のないことはコメントしない!とどちらの資料にも書いてありますが
それが一番難しい気がしますね。
リーダブルコードを繰り返し見つつコメント見直していくことにします。