📖
【学習備忘録】(Swift)TDDでポーカーを実装(STEP2)
はじめに
「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
参考にしたもの
1.Swiftで書いておぼえるTDD
さいごに
実際に業務で追加機能を実装をしたときに、コードを読み解くだけでものすごい時間がかかりました。
その経験からメンテナンスのしやすさというのは、後々の改修に大きな影響を与えるものだと思っています。
今回、TDDの入門ですが、とてもワクワクしながら勉強しています。
間違いや認識違いがあれば指摘いただければ幸いです。
Discussion