⑨まとめ

課題6 カードクラスを完成させる 解答

①Cardクラス修正

    public class Card {

        /* 属性 */
        private SuitEnum suit; // スート
        private int number; // 数値

        /* コンストラクタ */
        public Card(SuitEnum suit, int number) {
            this.suit = suit;
            this.number = number;
        }

        /* アクセサ */
        public SuitEnum getSuit() {
            return suit;
        }

        public int getNumber() {
            return number;
        }

        // 自身の情報を表示するメソッド
        public void openFace() {
            System.out.println(this.suit.getName() + "の" + this.number);
        }

    }

②全52枚のカード作成

    // カードリストを表示
    List<Card> cards = new ArrayList<>();

    // 2重ループで各スート1-13までを作成+格納
    for (SuitEnum suit : SuitEnum.values()) {
        for (int i = 1; i <= 13; i++) {
            cards.add(new Card(suit, i));
        }
    }

スートのEnumのリストを使って二重ループを行うことで
先に問題になっていたスートの曖昧さ、順番の問題が
解消していることがわかると思います

③全カードの和名表示

    // // 全カード表示
    for (Card card : cards) {
        card.openFace();
    }

実行画面は省略しますが
クラス内部に表示メソッドが存在することで、mainメソッド側の修正は不要でした
これが単一責任の法則に基づいて設計した場合の利点ですね

まとめ

この章でやったこと

  • カードクラスを作成した

    • for文を使った

      • 単純なfor文

      • 拡張for文

      • 二重ループなどの応用

    • Listを使った

      • リストの宣言や、基本的な操作方法

      • 公式リファレンス紹介

    • Enumを使った

      • 単純なEnumの定義

      • 属性の追加方法

      • リストの取得などの応用

これからやりたいこと

この章では、上記の様々な機能を使用して
トランプの一枚一枚のカードをクラスとして表現しました
また、全種類のカードを作ることができたので
トランプの山札を作ることができたと考えてもいいかもしれません

しかしここはオブジェクト指向の世界
もう一個踏み込んで「山札」もオブジェクトとして考えてみましょう
思えば、山札にだってドローをしたりシャッフルしたり…
固有の振る舞いを持ちそうですよね(=クラスにしたくなる)

でも山札ってどのような属性を持てばいいんでしょう
そして、今回作ったカードクラスとのつながりは?

こんな疑問を抱えつつ、次の章では「山札」のクラスを作っていきます