はじめに
前回の、いきなり!TDD(当方テスト初心者でいきなりTDD!) 2日目では、
- 仮実装
- 三角測量
について学びました。今回は「明白な実装」について学びます。
開発環境
- Xcode 10.3
- Swift
- XCTest
作るもの
ポーカー
明白な実装
必ずしも小さな歩幅でテストと開発を繰り返す必要はなく、確実性、自信のもてるコードがあると判断した場合には、仮実装をせずに、直接コードに落とし込む「明白な実装」を使い分けながら、TDDは進めていくのが通常です。
実装
現在のCardオブジェクトのnotationは、3♥のように記号が後にきている事に対し、現在の初期化は、
Card(suit:, rank:)
と、suit、rankの順になっているため、この順序が一致するように修正してみます。
struct Card {
//順序を入れ替えた
enum Rank: String {
// (省略)
}
enum Suit: String {
// (省略)
}
//順序を入れ替えた
let rank: Rank
let suit: Suit
// (省略)
}
ここで、Command + U でテストを実行します。
結果はレッドになります。グリーンにするために、続けて、TDDPokerBySwiftTests.swiftも修正していきます。
class TDDPokerBySwiftTests: XCTestCase {
func testInitializeCard() {
var card: Card
card = Card(rank: .three, suit: .heart) //順序を入れ替えた
XCTAssertEqual(card.suit, .heart)
XCTAssertEqual(card.rank, .three)
card = Card(rank: .jack, suit: .spade) //順序を入れ替えた
XCTAssertEqual(card.suit, .spade)
XCTAssertEqual(card.rank, .jack)
}
func testCardNotation() {
var card: Card
card = Card(rank: .three, suit: .heart) //順序を入れ替えた
XCTAssertEqual(card.notation, "3♥")
card = Card(rank: .jack, suit: .spade) //順序を入れ替えた
XCTAssertEqual(card.notation, "J♠")
}
}
Card.swiftの、
let rank
let suit
の変数定義を入れ替えたことで、初期化も、
Card(rank:, suit:)
の順に変更されました。
これは、swiftのstructは、プロパティの宣言順序に応じて、初期化の引数の順序が変わります。
この機能を考慮しない場合、
let rank: Rank
let suit: Suit
init(rank: Rank, suit: Suit) {
self.rank = rank
self.suit = suit
}
というように記述すべきですが、こういった機能を確実に理解しているのであれば、記述を省略することができますし、仮実装も省略して構いません。こういった考え方が「明白な実装」になります。
不要なテストを削除する(テストのリファクタリング)
notationは初期化時に渡したrankとすいtに応じて文字列を返却するプロパティになるため、Cardの初期化が成功し、同時にrankとすいtが期待通りインスタンスに保持されることが証明できています。
よって、既存のテストケースであるtestInitializeCard()は必要ないということになり、これを削除したテストコードが、以下になります。
import XCTest
@testable import TDDPokerBySwift
class TDDPokerBySwiftTests: XCTestCase {
func testCardNotation() {
var card: Card
card = Card(rank: .three, suit: .heart)
XCTAssertEqual(card.notation, "3♥")
card = Card(rank: .jack, suit: .spade)
XCTAssertEqual(card.notation, "J♠")
}
}
ToDoリストも更新しましょう。
- Cardを定義して、インスタンスを作成する
- CardはSuitを持つ
- CardはRankを持つ
- Cardのインスタンスから文字列表記(notation)を取得する
終わりに
今回は、
- 明白な実装
- テストのリファクタリング
について学びました。次回から、本格的なSwiftの設計、実装を踏まえながら、引き続きTDDを学びます。