📖

【学習備忘録】(Swift)TDDでポーカーを実装(STEP2)

2022/05/23に公開

はじめに

「Swiftで書いておぼえるTDD」のポーカーアプリのコードをもとに学習しました。
TDDでポーカーアプリを実装します。

サンプルコード

0. 今回実装すること

  • Cardのインスタンスから文字列表記(notation)を取得する。

1. 仮実装

  • まず、テストを実行しエラーを確認。
func testCardNotation() {
        let card = Card(suit: .heart, rank: .three)
        XCTAssertEqual(card.notation, "3❤︎")
    }

もちろん、テスト対象であるCardのnotationメソッドを定義していないので、エラーが出ます。

struct Card {
    enum Suit {
        case spade
        case heart
        case club
        case diamond
    }

    enum Rank {
        case ace
        case two
        case three
        case four
        case five
        case six
        case seven
        case eight
        case nine
        case ten
        case jack
        case queen
        case king
    }

    let suit: Suit
    let rank: Rank

    var notation: String {
        return "3❤︎"
    }
}

仮実装でreturn"3❤︎"をすることにより、とりあえずテストが通る。

2. 三角測量

  • "3❤︎"を返すnotationは保証できたが、一般化が保証できていないため、もう一つのケースを実装。
func testCardNotation() {
        let card1 = Card(suit: .heart, rank: .three)
        XCTAssertEqual(card1.notation, "3❤︎")

        let card2 = Card(suit: .spade, rank: .jack)
        XCTAssertEqual(card2.notation, "J♠︎")
    }

機能の一般化を導き出すテクニックを三角測量という。

  • Cardの実装
struct Card {
    enum Suit: String {
        case spade = "♠︎"
        case heart = "❤︎"
        case club = "♣︎"
        case diamond = "♦︎"
    }

    enum Rank: String {
        case ace = "A"
        case two = "2"
        case three = "3"
        case four = "4"
        case five = "5"
        case six = "6"
        case seven = "7"
        case eight = "8"
        case nine = "9"
        case ten = "10"
        case jack = "J"
        case queen = "Q"
        case king = "K"
    }

    let suit: Suit
    let rank: Rank

    var notation: String {
        return rank.rawValue + suit.rawValue
    }
}

Cardの実装を行い、これでテストが通るようになります。

3. テストケースをリファクタリング

  • card変数をテストケースごとに初期化し、共通利用できるようリファクタリング
func testCardNotation() {
        var card: Card

        card = Card(suit: .heart, rank: .three)
        XCTAssertEqual(card.notation, "3❤︎")

        card = Card(suit: .spade, rank: .jack)
        XCTAssertEqual(card.notation, "J♠︎")
    }

これで、テストを実行し成功すれば、notationメソッドが完成です。
が、この後少し修正を加えるので、STEP3の記事にコードをupします。

GitHub

https://github.com/MasakatsuTagishi/Practice-TDD-Poker/tree/step2

参考にしたもの

1.Swiftで書いておぼえるTDD

https://www.amazon.co.jp/Swiftで書いておぼえるTDD-技術書典シリーズ(NextPublishing)-田中-賢治/dp/484439858X

さいごに

実際に業務で追加機能を実装をしたときに、コードを読み解くだけでものすごい時間がかかりました。
その経験からメンテナンスのしやすさというのは、後々の改修に大きな影響を与えるものだと思っています。
今回、TDDの入門ですが、とてもワクワクしながら勉強しています。
間違いや認識違いがあれば指摘いただければ幸いです。

Discussion