1

最終的に github にアップロードする予定のオープン ソース iOS ライブラリを Objective-C で作成しています。私のライブラリは、特定の関数に依存し、定義しています。たとえば...

CGFloat DegreesToRadians(CGFloat degrees);
UIColor RGB(int r, int g, int b);

これはすべて問題ありませんが、誰かが自分のライブラリを自分のプロジェクトに追加した場合、DegreesToRadiansまたはRGB関数を定義している場合、またはそれらを定義する別のライブラリを使用している場合は、Redfinition of DegreesToRadiansコンパイル エラーが発生します。

とにかく、関数の定義を整理したり、適切なキーワードを使用したり、#ifndef を使用したり、#import ステートメントを移動したり、関数がライブラリの内部にのみ効果的に存在し、外部に公開されないようにするためのその他の解決策を講じたりすることはできますか?紛争を起こさない?

警告:

  • これらは内部で広く使用され、コードのセマンティクスと可読性を損なうため、関数にプレフィックスを付けないことをお勧めします。

  • 関数「静的」および関数を使用するクラス内で定義できることは承知していますが、これらの関数は多くのクラスで使用されるため、このアプローチは DRY 原則に違反します。

  • 理想的な世界では、ユーザーはこのエラーを回避するためにライブラリ コードを変更したくないため、ライブラリ コードまたはその他の競合する可能性のあるライブラリ コードの定義をコメント アウトするだけでは受け入れられません。

4

4 に答える 4

3

最も簡単な方法は、これらの関数定義をプライベート ヘッダー ファイルに含めることです。

.hそれらが定義されている場所を、ライブラリ構成の「プライベート ヘッダー」セクションに追加します。その後、ライブラリを使用しているユーザーには表示されません。

それらを公開したいが、それでも衝突が心配な場合は、それらをクラスに移動してみませんか? それらが異なる関数であることは知っていますが、オブジェクトの関数としてクラスに移動できます。

MyConverter
- (CGFloat)radiansFromDegrees:(CGFloat)degrees;

その後、ユーザーは必要に応じてクラスを使用して同じことを実行したり、機能を変更したい場合に機能を拡張したりできます。ライブラリは作成したクラスを引き続き使用するため、配線が交差することはありません。

于 2013-07-18T09:55:32.227 に答える
1

関数の実装をヘッダー ファイルに配置し、静的として宣言します。

例えば:

static UIColor *RGB(int r, int g, int b) {
   // blah...
}

この名前RGBは、ヘッダーを含むコンパイル ユニットからはエクスポートされないため、同じ名前が別の場所で使用されてもリンカー エラーが発生することはありません。

関数が小さい限り、コード サイズへの影響は最小限に抑えられます。それ以外の場合は、静的関数から適切にプレフィックスが付けられた関数を呼び出すことができます。

マクロを使用する場合と比べてこれが優れている点は、オートコンプリートが引き続き適切に機能し、コンマに奇妙な点がないことです。

于 2013-07-18T10:33:39.183 に答える
1

この解決策を避けたいと思っていますが、最も簡単なのは、これらの関数の名前に十分に一意のプレフィックスを追加することだと思います (C にも Objective-C にも名前空間がないことを考えると)。

コードの可読性を向上させたい場合は、プライベート ヘッダーに次のマクロを追加できます。

#define DegreesToRadians() HLDegreesToRadians()
于 2013-07-18T10:01:38.103 に答える
0

これらは内部で広く使用され、コードのセマンティクスと可読性を損なうため、関数にプレフィックスを付けないことをお勧めします。

グローバルに表示されるもの (または C++ を使用している場合は名前空間) にプレフィックスを付けるだけです。

関数「静的」および関数を使用するクラス内で定義できることは承知していますが、これらの関数は多くのクラスで使用されるため、このアプローチは DRY 原則に違反します。

これらは両方ともワンライナーである可能性があります。それらをプライベートヘッダーに入れて宣言するだけstaticです。その後、このヘッダーをファイルにインポートでき*.mます。クライアントがこれらを確認する必要はありませんstatic。プレフィックスを省略することができます。

于 2013-07-18T11:18:41.023 に答える