blog.waterlow.work

Ruby, Rails, js, etc...

【Java】拡張性とネストの深さ・コードの汚さ

以下の問題を解いてみました。
"トランプのカードを切って1枚引く"を再現せよ。

以下のようになりました。
トランプの長さは不変なので固定長配列を使いました。
配列の内容をシャッフルするメソッドが見つからず、一回コレクションにして
シャッフルしてから再び配列に戻しています。

重要ポイント:拡張性とネストの深さ

AllCardのコンストラクタ内のネストは一番深くて2です。
ただ、今回はトランプでのためマークが増えることはほとんどありません。
そのためenumの要素でforループしなくても4行処理を書いてしまってもいいのかもしれません。
この辺はいつも悩ましくて、納得できずに困っているので誰か教えていただける方がいらっしゃれば…

以下ソースです。

import java.util.Arrays;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;


public class AllCard {
	/**
	 * カードの数字に使う最大値
	 * 今回はトランプのため4つを指定
	 */
	private final int MAX_RANK = 13;
	/**
	 * マークの数をenumから取得
	 */
	private final int NUMBER_OF_MARKS = EnumSet.allOf(Mark.class).size();
	/**
	 * 全カードを格納する配列
	 * 長さは(カードの数字に使う最大値)*(マークの数)から求める。
	 */
	private Card[] allCard = new Card[MAX_RANK * NUMBER_OF_MARKS];

	/**
	 * (マーク1, 1), (マーク1, 2), …, (マーク1, MAX_RANK), (マーク2, 1), …
	 * の順番にカードを格納する
	 */
	public AllCard() {
		for (int i = 0; i < MAX_RANK; i++){
			int markCount = 0;
			for (Mark mark : Mark.values()){
				allCard[i + MAX_RANK * markCount] = new Card(i + 1, mark);
				markCount++;
			}
		}
	}

	/**
	 * カードをシャッフルする
	 */
	public void suffle() {
		List<Card> list=Arrays.asList(allCard);
		Collections.shuffle(list);
		allCard =(Card[])list.toArray(new Card[list.size()]);
	}

	public static void main(String[] args) {
		AllCard cards = new AllCard();
		cards.suffle();
		System.out.println(cards.allCard[0]);
	}
}
public class Card {
	private int number;
	private Mark mark;
	public Card(int number, Mark mark) {
		this.number = number;
		this.mark = mark;
	}
	@Override
	public String toString() {
		return "Card [number=" + number + ", mark=" + mark + "]";
	}

}
public enum Mark {
	HART, SPADE, CLUB, DAIA
}