Category

Objective-C にあるカテゴリは非常に面白い。Ruby の mix-in って感じなんだろうか。既に存在するクラスに、新しいメソッドを追加できる柔軟で強力な仕組みだ。

Cocoa でビューに描画するときに、ベジェ曲線を使うなら

  NSBezierPath *path;
  
  /* ... make path here ...*/
  
  [path stroke];

みたいにやる。文字列を描画したいときには

  NSString *stringToDraw;
  
  /* ... make string to draw here ...*/
  
  [stringToDraw drawInRect:rect withAttributes:attributes];

とフォントの大きさや色を指定して描画できる。しかしながら、NSString クラスは GUI アプリケーションとは無関係のクラスだから、そのクラスに描画メソッドが入っているのは気持ち悪いなぁと思っていた。Cocoa フレームワークは Model-View-Controller でちゃんと分けられて設計されているはずなのに、モデルとビューが一緒になってるなんて。

しかし実はこの drawInRect:withAttributes: メソッドはカテゴリとして実装されていて、NSString そのものには宣言されていないメソッドだった。だから GUI アプリケーションを作るときにつかう AppKit フレームワークを使わないのであれば存在しないメソッドなのだ。カテゴリを使うことで、本来の NSString の機能に、描画という機能を後付けしているわけだ。ほほーって感じ◎ 静的な言語でやるんだったら、NSString を継承するか、移譲を使うしかないんだろうけど、動的な Objective-C はそこら辺をスマートに解決できる。デザインパターンとかを駆使する必要もなく素直に作ればいいんだと思う。

最初の 3 文字だけを抜き出す機能が欲しければ、カテゴリを使って解決できる。firstThreeWords というメソッドをカテゴリとして実装しておいて、

  NSString *string = @"ABCDEFG";
  NSString *firstThreeWords = [string firstThreeWords];

こんだけ。

もちろんここら辺のダイナミックなところは好き嫌いの部分も多いにあると思うので、優劣をつけるつもりはないけど、僕は好きだ。