身内で楽しくペアプロTDDする会をやってみた

はじめに

おばんです、学生時代以来久々にやる、バスケットボールというスポーツで膝をやってしまった田中です。

仲間内10人ちょいでペアプロTDDを楽しむ会というのをやったので、振り返ります。 会の趣旨は以下の通り。

  • TDDをやってみよう
  • ペアプロをやってみよう
  • TDDとペアプロの文化を理解しよう
  • 他の言語との実装の違いを楽しもう
  • みんなでプログラムを書いてわいわいしよう

内容

  • t_wadaさんの講演動画をみんなで見て、田中が情報を補足
  • FizzBuzz問題をペアプロTDDでやってみる

参加したグループの言語はSwift, JavaScript, TypeScript, Goなど。

特に盛り上がったのは言語ごとの書き方の違いと、テスト環境の違いなど。最終結果をいくつかのグループが前で発表する形式をとりました。

VSCodeのLive Sharing機能が便利そうだったし、Goのコンパイル速度が速すぎて自分の組みのSwift/Xcode環境が言い訳できなかったのが面白かった。

ソースコード

Swift組のコードはこちら。

ペアプロTDDを楽しむ会 in DarkでやったFizzBuzzのお題。 · GitHub

こだわりのポイント

最初はIntの入力値をもとに、FizzBuzz判定の結果をStringで返す実装をしようとしていたが、「Stringで欲しいかどうかというのはPresentation層の話ではないか」「FizzBuzzの本質に迫るならば、Stringではなく別の型で範囲を絞った方が良いのではないか」という、ペアプロならではの着眼点と相談から、enumでFizzBuzzの結果を判定したところ。

enum FizzBuzzResult: Equatable {
    case number(Int)
    case fizz
    case buzz
    case fizzBuzz
    
    static func ==(lhs: FizzBuzzResult, rhs: FizzBuzzResult) -> Bool {
        switch (lhs, rhs) {
        case (.fizz, .fizz), (.buzz, .buzz), (.fizzBuzz, .fizzBuzz):
            return true
            
        case (.number(let lhsValue), .number(let rhsValue)) where lhsValue == rhsValue:
            return true
            
        default:
            return false
        }
    }
}
func judge() -> FizzBuzzResult {
    if number % 3 == 0 && number % 5 == 0 {
        return .fizzBuzz
    }
        
    if number % 3 == 0 {
        return .fizz
    }
        
    if number % 5 == 0 {
        return .buzz
    }
        
    return .number(number)
}

FizzBuzzにおいて設計的観点がここまで入りこむのは初めてでアツかった。TDDならではの見直しができて、ペアプロの力を実感できたのでとても有意義だった。

参考