Als unsere Codebasis reift, fange ich an, das Muster der Übergabe von Wörterbüchern als eine Möglichkeit, Informationen für Nachrichtenübergabe oder noch schlimmer, Funktionsargumente zu sammeln, nicht mehr zu mögen. Es erfordert die Sende- und Empfangsfunktion, die beide eine undokumentierte API von String-Literalen haben.Besseres Muster als die Weitergabe von NSDictionaries als Parameter?
..in some function..
NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:
thisObject, @"thisKey",
thatObject, @"thatKey",
nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"MY_NOTIFICATION" object:nil userInfo:info];
....
und dann in someClass
‚s Hörer
- (void)someClassListener:(NSNotification *)notification {
NSDictionary *info = [notification userInfo];
ThisObject *ob1 = [info objectForKey:@"thisKey"];
ThatObject *ob2 = [info objectForKey:@"thatKey"];
}
Sie müssen bedenken, dass thisKey
und thatKey
die Schlüssel vom Typ ThisObject
und ThatObject
für diese Meldung sind, sicher, dass Sie für die, einige Konstanten irgendwo schaffen könnte Schlüssel, aber das löst das Problem nicht wirklich.
Und sagen Sie, Sie haben eine Funktion, die 15 Argumente benötigt, Sie werden keine Funktion mit 15 Parametern machen, es wäre viel einfacher (obwohl weniger lesbar), nur ein Wörterbuch zu übergeben, aber jetzt haben Sie die Das gleiche Problem wie oben.
Ich spielte mit dem Erstellen von "Message Classes" in diesen Header-Dateien der Klasse (dh zwei Schnittstellen in einem Header) und die Message-Klasse war nur eine Liste von Objekten, die Sie definieren und senden an die Methode, die eine stärkere erstellt Vertrag, aber das fühlt sich falsch an.
Es wäre toll, wenn ich so etwas wie typeDef
ein Parameterobjekt im Header tun könnte, aber das nicht unterstützt NSObject
‚s nur Dinge wie int
oder float
usw.
im Wesentlichen Ich versuche, Erstellen Sie einen stärkeren Vertrag zwischen dem Nachrichtensender und dem Nachrichtenempfänger, seien es Funktionen oder Benachrichtigungen.
Ich erwähne Konstanten für Schlüssel als nicht eine gute Lösung, weil Sie immer noch suchen müssen, was der Schlüssel ist, und es nicht einen starken Vertrag für was der Wert (Objekt) sein wird, mehr wie ein Vorschlag. Das Einkapseln der Daten in eine Klasse war eine Richtung, die ich untersuchte, aber es scheint umständlich, eine Klasse für jede Nachricht zu erstellen, die ich weitergeben möchte, sei es 2 Argumente sind 10, würden Sie nicht zustimmen? – Shizam
@Shizam, Wenn diese Nachrichten in verschiedene Wörterbücher geschrieben würden, würden Sie wahrscheinlich mehr als eine Klasse benötigen. Aber wenn Sie über Nachrichten sprechen, die manchmal zwei Schlüssel aus einem Wörterbuch und manchmal 10 übergeben, dann wäre das immer noch nur ein Klassenobjekt. – rdelmar
@rdelmar Was ich während unseres Programms habe, haben wir wahrscheinlich 10-15 eindeutige Benachrichtigungen, jede dieser Benachrichtigungen würde eine eigene Klasse benötigen, um ihre Eigenschaften für die Nachricht usw. zu definieren. – Shizam