[iOSDC Japan 2019 リポート]「ダックタイピングとidでUserDefaultsをモック化する」というセッションを聞いてきました

iOSDCの前夜祭で椎名夏希@9/5 iOSDC Day0 Track E(@417_72ki)さん / TwitterによるダックタイピングとidでUserDefaultsをモック化する」というセッションを聞きました。

~黒魔術がObjecitve-C Runtime APIだけだといつから錯覚していた?~

iOSで黒魔術といえばObjecitve-C Runtime APIが注目されがちですが、 当然それ以外にも色々な黒魔術が存在します。 ダックタイピングはオブジェクトの型を見るのではなく、オブジェクトそのものがメソッドを持つかどうかという考え方に基づいた手法です。 RubyやPythonではポリモーフィズムを実現する手段として使われている一方、iOS(特にSwift)ではあまり馴染みのない考え方だと思います。 しかし、実はObjective-Cでこのダックタイピングの考え方に基づいた設計/実装が行われています。

本セッションでは、そのダックタイピングの考え方が使われている例に触れつつ、 Obj-Cの特徴であるid型と組み合わせてUserDefaultsをテスト用のオブジェクトに差し替えた話をします。 (UserDefaultsをprotocolでラップする話ではありません)

ダックタイピングとidでUserDefaultsをモック化する by 417.72KI | トーク | iOSDC Japan 2019 #iosdc - fortee.jpより引用

印象に残ったところ & 感想

UserDefaultsを扱う部分のテストを書くときに自分は常にprotocolを使ってMockと差し替えられるように設計していました。

また、suiteName((NSHomeDirectory)/Library/Preferences/(suiteName).plistが作成される)は永続領域にテストで触れるのはなーという考えて使ったことがありませんでした。

今回紹介されたのは動的型付け言語で使用されるダックタイピングを使ってObjective-Cで実装したライブラリを使うというものでした。

セッションではダックタイピングとは、という話から静的型付け言語と動的型付け言語の違い、Objective-Cにおけるダックタイピングの話が出てきました。

私はObjective-Cの経験がないもののUITableViewDelegateの定義元に飛んだときに@optionalが出てくるのでその時にこの辺りについて一度調べていたのですが、UserDefaultsのモックにこれを使用することは考えたことがなかったので新鮮でした。

ライブラリはNSUserDefaultsが持っているメソッドをそっくり真似たクラスを作って偽装することでモック化可能にしているとのことでした。また、Objective-C独自の汎用データ型であるid型の説明はありがたかったです。このid型を利用することでキャストを不要にしています。

ライブラリのGitHubリポジトリは以下になります。

自分が想像していなかった手法でTestableな実装を行なっていることを知ることができたのは収穫でした。

最後に

発表をしていただいた椎名夏希@9/5 iOSDC Day0 Track E(@417_72ki)さん、本当にありがとうございました。