2012-04-09 27 views
1

In einem Spiel, das ich programmiere, verwende ich ein zusammengesetztes Objekt für alle Entitäten innerhalb des Spiels. Die Entitäten bestehen aus Komponentenobjekten, die kleine Funktionsbereiche wie Gesundheit oder Bewegung definieren.Best Practice für NSNotifications

Meine Frage ist:

Ist es in Ordnung, eine Benachrichtigung von einer Komponente zu schreiben, aber die übergeordneten Entität als Objekt verweisen, anstatt die Benachrichtigung zu senden?

Ich bin versucht, dies zu tun, wie es einfacher ist, Beobachter der Entität hinzuzufügen, anstatt die richtige Komponente innerhalb der Entität zu finden.

Mir wurde gesagt, dass Sie nie eine Benachrichtigung für ein anderes Objekt veröffentlichen sollten.

Was sind die Vor- und Nachteile?

+0

Vielleicht die Frage von einer Wiederaufstellung Kohäsion Sicht ist besser. Das heißt, betrachten die Beobachter die zusammengesetzten Objekte oder die feinkörnigen Objekte? Zum Beispiel, wenn die Gesundheit Null erreicht, ist das Ereignis auf einer höheren Ebene (Tod-Ereignis) auf Ihrem zusammengesetzten Objekt nicht? – Fuhrmanator

Antwort

0

Normalerweise halten Sie eine Benachrichtigung für "von" einem Objekt. Wenn Sie das Debuggen ausführen und die Quelle der Benachrichtigung suchen möchten, suchen Sie daher nach dem Code in diesem Objekt.

Es ist nicht illegal, diese Erwartung zu verletzen, aber es kann jemanden dazu bringen, Sie ein wenig zu verfluchen, wenn Sie härter arbeiten müssen, um die wahre Quelle der Benachrichtigung zu finden.

Auch wenn Sie viele separate Komponenten haben, die alle die Benachrichtigung bereitstellen, kann es schwieriger werden, den Code zu refaktorieren, wenn Sie die Benachrichtigung (z. B. userInfo) ändern möchten.

Wenn Sie garantieren, dass Ihre Komponente immer einen gültigen Zeiger auf seine Eltern hat, ist die beste Lösung der Komponente stellt ihre Mutter zu machen, die Benachrichtigung zu schreiben:

@implementation ComponentA 

- (void)someMethod 
{ 
    [self.parent pleasePostSomethingChangedNotification]; 
} 

@end 

@implementation Parent 

- (void)pleasePostSomethingChangedNotification 
{ 
    // Parent may post the notification immediately, 
    // or may selectively post the notification based on some other condition, 
    // or post it later on after coalescing changes from several components, 
    // or ... 
} 

@end 
+0

Meine Gesundheitskomponente sendet eine Benachrichtigung, wenn die Gesundheit Null erreicht. Wenn ich es weitergebe, wie Sie es vorschlagen, wird es immer eine Methode für den Elternteil geben, selbst wenn es keine Gesundheitskomponente gibt. –

+0

Nun, wenn es in Ihrem Fall keinen Sinn macht, tun Sie es nicht so! Es ist ein Vorschlag für einen möglichen Weg, keine Anforderung. –