translation:adc:cocoa:foundation:introduction_to_dynamically_loading_code:1100_nameconflicts

名前衝突の防止

Objective-Cランタイムは平坦な名前空間を用いるため、プラグイン開発時にはアプリケーションコードやアプリケーションが読み込む他のプラグインと衝突する名前を選ばないよう、十分に注意しなければなりません。 本章では、クラスや他のシンボルにおいて、この種の衝突を避ける方法を解説します。

Objective-Cランタイムは、公開される全てのシンボルについて、1プロセスごとに単一で平坦なグローバル名前空間だけを持ちます。 これには全グローバル変数、非静的関数、クラス名、そして個々のクラスで宣言されたカテゴリが含まれます。プロトコルは個別に自身の名前空間を持ちます。

同一プロセス空間に異なるプラグインが共存しなければならないため、あなたは慣例に従いシンボル名の衝突を回避しなければなりません。 プラグインで公開される全てのシンボルは、そのプラグインに固有の識別子で接頭辞修飾されなければなりません。 次のプラグインを読み込む前に以前のプラグインを解放したとしても、この要求からは逃れられません。 Objective-Cのシンボル(クラス名、プロトコル、カテゴリ)が一度読み込まれてしまえば、それらが解放されることはありません。

以下のアルゴリズムを使って、プラグインはバンドル識別子から一意の接頭辞を引き出すべきです:

  1. バンドル識別子から始めます(com.apple.preference.sound
  2. ピリオドで分けられた各要素の頭文字を大文字にします(Com.Apple.Preference.Sound
  3. ピリオドを削除します(ComApplePreferenceSound

この慣例は各バンドル識別子の一意性に基づく点に注目して下さい。 バンドル識別子の一意性を保証するために、各組織は逆転させたICANNドメイン(例:com.apple)を、その識別子の接頭辞とするべきです。

組織内で開発されるバンドル間のバンドル識別子衝突を避けるため、開発工程と規約を制定するべきです。

ソースコード内で長く完全な接頭辞付きシンボル名の利用を避けるために、略記用のプリプロセッサマクロを作ることが出来ます。 これらマクロは1つのヘッダファイルで定義され、全てのソースファイル内でインポートされます。例:

#define SoundPref ComApplePreferenceSoundPref
#define AlertController ComApplePreferenceSoundAlertController
#define MicrophoneController ComApplePreferenceSoundMicrophoneController

この短縮はヘッダファイルをインクルードしたObjective-Cソースファイルでのみ有効です。 このようなソースファイル外(例えばバンドルプロパティリストやメインnibファイル)でのクラス名の参照には、完全な本当の名前を指定します。

プラグインは、Objective-Cのカテゴリを用いた、公開フレームワークのクラスのメソッドのオーバーライドを避けるべきです。 複数のプラグインが同一クラスの同一メソッドのオーバーライドを試みた場合、ただ1つのオーバーライドのみが有効となり、予測不能な挙動の原因となります。

  • translation/adc/cocoa/foundation/introduction_to_dynamically_loading_code/1100_nameconflicts.txt
  • 最終更新: 2020-12-03 12:50
  • by Decomo