はじめに
あるクラスのメソッドはそのインスタンス変数を使ってできる事、つまり実行責務を表現したものである。必要な時に実装すれば良いアプリケーションはともかく、不特定多数で使われるメソッド(=API)はどんなのが必要か想定して実装せざる得ない。実装パターンによると、それは90%の利用者の事情を想定して定義される。残りの10%はアプリケーション固有の物であり、全てを組み込むとなると膨大な量になるためだ。これより、アプリケーション製作者は足らないAPIを独自に実装せざる得ない。
Objective-CのカテゴリーおよびSwiftのエクステンションはこの問題を解決するためのものである。具体的にはアプリーケーションの需要に応じてカテゴリーメソッドを実装する。この言語機能の名に記す通り、対象システム応じてクラスを振る舞いを追加/拡張するものである。
設計/実装のコツ
カテゴリー(エクステンション)はクラスの振る舞いをあるアプリ、レイヤー向けに拡張するというための機構であり、便利関数を実装するところではない。
レイヤーを意識する。
例えば、ViewControllerのレイヤー、Modelのレイヤー、Viewのレイヤー向けに提供するカテゴリーを一つのヘッダーに入れない事。レイヤー間の結合度が複雑になる。
インターフェース分離の法則を意識する。
これも先程の理由の裏返し。
Categoryとかエクステンションとかいうフォルダを作ってそこに入れない。
これも先程の理由の裏返しです。
プレフィックスはつけた方が良い。
名前が衝突してビルドできない。Objective-Cの場合、意図しないメソッドを上書きする。
実例
作業中
最後に
有用であり、Objective-Cの元となったSmalltalk等、30年以上前から実現されている言語機構であるが、実際に有効に活用しているケースはほとんどなく、Utilityクラスとして実装されている場合が多い。これらはカテゴリー(エクステンション)として意識的に実装した方がクラスの実行責務をしっかりと意識できる。とりわけSwiftの場合はプロトコルと組み合わせる事で強力な制御機構を実現できる。