3

特定の入力に基づいて何らかの計算を行い、副作用を引き起こすことなく出力を返す関数を実装している場合。

クラスに静的メソッドを持たせる代わりに、常に通常の C 関数を使用します。

クラスに強制的に入れられた静的メソッドを使用する理由はありますか?

シングルトンやファクトリ メソッドを作成するメソッドについては話していませんが、通常のメソッドについては次のように話しています。

このようなものの代わりに:

+(NSString *)generateStringFromPrefixString:(NSString *)prefixString word:(NSString *)word;

これで良くなりませんか?

NSString *generateString(NSString *prefixString, NSString *word);

効率の面でも、関数ポインターを取得するためにセレクターをルックアップして節約しませんか?

4

4 に答える 4

2

重要な要素の 1 つは、テスト容易性です。あなたのC関数は特にテストが必要ですか? (もちろん、すべてを理想的にテストする必要がありますが、呼び出すものを呼び出すことでテストできる場合もあります)。必要に応じて、これらの機能に個別にアクセスできますか? 他の機能をテストするためにそれらをモックする必要があるのではないでしょうか?

2013 年の時点で、Apple/Xcode/iOS/MacOS の世界に住んでいる場合は、単純な c よりも objc でテストするための組み込みツールが多い可能性がはるかに高くなります。私が言おうとしているのは、「c-function のモックはより難しい」ということです。

私はC関数がとても好きです。最初は、見栄えの良い objc コードに含めるのが好きではありませんでした。しばらくして、それはあまり重要ではないと思いました。本当に重要なのは文脈です。私の要点は (NSObjcRuntime.h の PLPiper と同じように)、名前や機能から判断すると、関数がどのクラスにも属さない場合があるということです。したがって、それらをクラスメソッドにする意味的な理由はありません。いくつかのインラインc 関数を含むコードのテストを書き始めたとき、このあいまいなようなことはすべてなくなりました。さて、c関数を具体的にテストしたり、モックしたりする必要がある場合は、objcで実行する方が簡単です。objc のものをテストするためのより多くの/より簡単な組み込みツールがあります。

興味のある方へ: C での関数のモック (テスト用)?

于 2013-07-20T13:10:19.370 に答える
2

設計が悪いとは思いませんが、特定の状況では、一方が他方よりも適切であると見なされる場合があります。主な質問は次のとおりです。

  • このメソッドはクラスに属していますか?
  • このメソッドをクラスに追加する価値はありますか?

クラスは、自己完結型で再利用可能なものです。あなたの例の方法については、「はい、そうです/そうです」と答えたくなるでしょうNSString。パラメータの型も ですNSString。したがって、クラス拡張でメッセージフォームを使用し、#import必要に応じて拡張を使用します。

これが実際には適切でない状況が 2 つあります (私の頭の中で)。1 つ目は、メソッドが「メイン クラス」の外部にある他のエンティティと具体的に対話する状況です。NSObjcRuntime.hこの例は、Apple のファイルの下部付近にあります。これらはすべて標準の C 関数です。彼らは実際には特定のクラスに属していません。

標準 C 関数を使用する 2 つ目の状況は、非常に特殊な状況で 1 回 (または非常に少数) しか使用されない場合です。は完璧な例であり、特定のサブクラスのメソッドのUIApplicationMainヘルパー メソッドも思い浮かびます。UIView-drawRect:

効率に関する最後のポイント。はい、セレクター ルックアップは、標準 C 呼び出しがわずかに遅くなります。ただし、ランタイム (少なくとも Apple の場合、GCC についてコメントすることはできません) はキャッシュ システムを使用するため、最も一般的に送信されるメッセージはセレクタ テーブルの「トップ」にすばやく引き寄せられます。

免責事項:これはややスタイルの問題であり、上記の推奨事項は、コードをより整理して読みやすくすると思うので、私が行う方法です。CおよびObjective-Cコードを構造化/インターリーブする他の同様に有効な方法があると確信しています。

于 2013-07-20T10:09:22.803 に答える