きりかノート 3冊め

おあそびプログラミング

Objective-Cへの名前空間の導入の提案(Draft Proposal for Namespaces in Objective-C)を読んでみた

昔から要望されることの多い、Objective-Cへの名前空間の導入の提案がobjc-language MLに流れてた。リクエスト自体は多いけど、今回は具体的な提案付きなので読んでみた。

クラスだけでなく、メソッドにも名前空間を適用しようってのがちょっと珍しいかも。Rubyで提案されてたselector namespace|Classbox(参考: Matzにっき 2006-01-04, 関西Ruby会議03 「Classbox 入門」(PDF), RubyKaig 2010「君のクラスの最高の偽物」)と似たような感じかな。

概要

自分の理解も含めてなので正しくはリンク先見てね。

@namespaceで名前空間を宣言できる。利用時はドットでつないで表記する。

   // .h
   @namespace MyNamespace // <= 名前空間の宣言
   @inteface MyClass : NSObject
     //
   @end
   @end
   // .m
   @implementation MyNamespace.MyClass // 名前空間.クラス名
   -(id) foo
   {
        baz = [[OthersNamespace.BazClass alloc] init];
   }
   @end

名前空間はメソッド呼び出しにも利用できる。たぶんカテゴリを想定してる。

   // .m
   [obj @namespace(MyNamespace) foo:arg1 bar:arg2];

@usingで名前空間の指定を省略または略称を指定できる。C#のusingやVB.netのImportsをイメージするけど、例ではメソッドの実装定義中にしかないので、メソッドの名前空間だけなのかな?ここはちょっとわからん。

   // .m
   -(id) foo
   {
       // 名前空間の指定を省略できるようにする
       @using MyNamespace;
       [obj foo:arg1 bar:arg2];

       // 別名で参照できるよう定義する
       @using MyNs = MyNamespace;
       [obj @namespace(MyNs) foo:arg1 bar:arg2];
   }

感想

頭から読んでくと"Namespaced Selectors"のところで「あれっ?」となるので、クラス/プロトコル名前空間を前に書いたほうが良かったような。でも"At the heart of this proposal"とあるから、提案者的にはこっちが肝なんだろうね。

このメソッドの名前空間の意図は、カテゴリ+namespaceでRubyのModuleみたいに使えるってことなのかなあ。@usingでincludeを、@namespace()でClassboxを実現するって感じでしょうか。「Cの関数でいいじゃん!」てのをNSObjectのカテゴリにごりごり入れる人が出そう。

今のランタイムを変更せずにコンパイラ側だけで対応するとしたら、内部のクラス名やセレクタ名を名前空間付きにすれば実装できそう。と考えてたら、MLの議論見た感じ提案者もそういう方向っぽいのかな?

サードパーティのライブラリ・フレームワークを使いやすくするために、少なくともクラスの名前空間は必要だと考えてるので、この提案そのものかどうかはわからないけど導入されてほしいなーと思う。