Objective-Cのクラスプレフィックスはキャメルケースにするべきではないか

AppleのCocoa向け公式文章にはObjective-Cのクラス名に使用するプレフィックスを全て大文字にするよう書かれています。しかし個人でライブラリを作成する際にはそれらが問題になることがあります。

名前衝突の問題

NSをクラスプレフィックスに採用している開発者はNSStringというクラスを作ることが出来ないのです。 なぜなら、Cocoaライブラリには既にNSStringというクラスが存在するためです。 NSLoaderという自作クラスを作っても、今後Appleが同名のクラスを追加する可能性だって無きにしもあらずです。

NSだけれあればそれほど大きな問題にはなりませんが、AppleのライブラリにはNS以外にもWK (WebKit)やMK (MapKit)等のクラスプレフィックスが存在します。今後登場されるライブラリのクラスプレフィックスが、自身のものと被ってしまう恐れもあります。

ちなみにAppleは3文字プレフィックスの利用も容認しています。ですがそれを利用したいと思う人は少数だと思います。NSNStringなんて読みづらいクラス名は嫌ですよね。そもそもAppleのライブラリにも3文字プリフィックスは存在します。結局Objective-Cに名前空間の概念が存在しない以上、名前衝突の問題からは逃れられないのです。

思い切ってキャメルケースにしてみる

そこでクラスプレフィックスにキャメルケースを使おうという発想に行き着きます。つまりプレフィックスをNSでは無くNsにするわけです。幸いコンパイラ側ではNSStringとNsStringは別物として解釈されます。

この方法であれば既存クラスや今後追加されるクラスとの名前衝突を気にする必要はなることでしょう。これでもう名前衝突の恐怖に怯える必要はありません。またこの記法によってプレフィックスと機能名の区切りが視覚的に明瞭になるというメリットも得られます。

時と場合によってはこういう型破りなコーディング規約も必要なのではないでしょうか。

注意

Appleはキャメルケースの接頭辞を推奨していませんので、現場で採用する際は慎重に。 いつでも名前の一括変換が出来るように、クラス名の文字列化にはNSStringFromClassを使うようにしましょう。

NSString *className = @"NsString"; // 直書きはリファクタリングの対象外
NSString *className = NSStringFromClass(NsString.class);
Class clazz = NSClassFromString(className);

私「どや」
Objective-C「そういうことばかりしてるから、社会不適合者って言われるんですよ」

広告