6

私たちのコードベースが成熟するにつれて、私は、メッセージを渡すための情報をパッケージ化する方法として辞書を渡すパターンや、さらに悪いことに、関数の引数を渡すパターンが嫌いになり始めています。文書化されていない文字列リテラルの API を持つ送信関数と受信関数の両方が必要です。

..in some function..
NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:
                         thisObject, @"thisKey",
                         thatObject, @"thatKey",
                         nil];

[[NSNotificationCenter defaultCenter] postNotificationName:@"MY_NOTIFICATION" object:nil userInfo:info];
....

そしてsomeClassのリスナー

- (void)someClassListener:(NSNotification *)notification {
    NSDictionary *info = [notification userInfo];

    ThisObject *ob1 = [info objectForKey:@"thisKey"];
    ThatObject *ob2 = [info objectForKey:@"thatKey"];
}

とはタイプのキーでthisKeyあり、その通知のために、それらのキーのどこかに定数を作成できることを確認する必要がありますが、それでは問題は実際には解決されません。thatKeyThisObjectThatObject

そして、15個の引数を必要とする関数があるとしましょう.15個のパラメータを持つ関数を作成するつもりはありません.辞書を渡すだけの方がはるかに簡単ですが(読みにくいですが)、上記と同じ問題があります. .

私はそれらのクラスのヘッダー ファイル (つまり、1 つのヘッダーに 2 つのインターフェイス) でスタブ化された「メッセージ クラス」を作成して遊んでいました。違う。

ヘッダーでパラメータオブジェクトのようなことができれば素晴らしいのですが、それはorなどのようなものだけをtypeDefサポートしていません.NSObjectintfloat

基本的に、機能であろうと通知であろうと、メッセージの送信者とメッセージの受信者の間でより強力な契約を作成しようとしています。

4

3 に答える 3

4

キーの定数を定義できます。例として、のドキュメントを参照してくださいUIKeyboardDidShowNotification。通知に関する情報を取得するために使用できるすべてのキーへのリンクがあります。

より良いアプローチは、データを辞書ではなくクラスにカプセル化することです。プロパティを使用して単純なクラスを作成します。これは、辞書よりもはるかに自己文書化されます。プロパティ名とプロパティタイプは.hファイルで確認できます。

15個の引数を必要とするメソッドがある場合は、ステップバックして、それらの引数を適切なクラスにカプセル化する必要があります。おそらく、メソッドは適切にいくつかの引数とクラスまたは類似のものに還元されます。

于 2013-02-21T20:06:33.500 に答える
2

必要なのはパラメータオブジェクトです。これは、他のクラスとの便利な通信のために一連のフィールドをカプセル化する小さなオブジェクトです。内部的には、パラメータオブジェクトはディクショナリ、または単に指定されたフィールドのセットを保持する場合があります。

パラメータオブジェクトに、使用する特定のフィールドを両方のクラスで設定および取得できる単純なAPI(setThisKey:およびgetThisKey)を指定します。つまり、本質的に、メソッドとクラスの間のAPIを文書化します。

次に、機能をパラメータオブジェクトに移動する機会を探します。たとえば、次のようなものがある場合:

 param.fieldSize=[self.data size];
 param.fieldColor=[self.data color];
 param.flavor=[self.data lookUpTheRecipe]

これをすべてカプセル化できます

 [param withField: self.data];

作業を使用すると、多くの場合、パラメータオブジェクトに多くの有用な作業を実行させることができます。これは長いメソッドを分割し、大きなクラスが過剰な責任を取り除くのに役立ちます。

于 2013-02-21T20:07:24.597 に答える
0

最初は、15個の引数を持つのは良くありません。そのような場合は、そのようなコールバックを実行しないか、数を減らすことを検討する必要があります。


通知の送信者を使用するのはどうですか?たとえば、オブジェクトTaskが終了し、通知を送信します。受信者は送信者を使用して、、にアクセスsender.resultsender.errorますsender.anything


これらのオブジェクト(送信者/受信者)間のより強力な連絡が必要な場合は、の代わりに他の通信方法を使用する必要がありますNSNotifications

いくつかの選択肢:

  • デリゲート(または他の種類の直接メソッド呼び出し)
  • ブロック
  • ターゲット+アクション

それらはすべて、配列に格納することでto-manyコールバックとして使用できNSDictionaries、値の受け渡しには使用されません。

于 2013-02-21T22:23:12.113 に答える