2010-11-18 9 views
1

Ich habe eine Situation, in der ich mehrere Ebenen verschachtelter Objekte in einer dokumentenbasierten Anwendung habe, die Informationen über ein bestimmtes Modell benötigen.Schnittstellen an Objekte übergeben oder Delegierung in Cocoa verwenden?

Insbesondere habe ich eine NSTextView, NSLayoutManager und NSTypesetter, die jeweils bestimmte Eigenschaften über mein Dokumentmodell kennen müssen, um es richtig zu rendern.

Derzeit habe ich jede der Klassen in Unterklassen unterteilt und ihnen eine Eigenschaft zugewiesen, die einen Verweis auf mein Modell enthält. Die Referenz wird von meinem Dokument Controller weitergegeben, auf die subclassed NSLayoutManager, und dann an die subclassed NSTypesetter geben:

ist
@implementation MyLayoutManager : NSLayoutManager { 
    @private 
    MyModel *model; 
} 
@property (retain) MyModel *model; 
-(id)initWithModel:(MyModel *)model; 
@end 

@implementation MyTypesetter : NSATSTypesetter { 
    @private 
    MyModel *model; 
} 
@property (retain) MyModel *model; 
-(id)initWithModel:(MyModel *)model; 
@end 

Das Modell von Controller- geben> MyLayoutManager-> MyTypesetter. Dies scheint ein wenig überflüssig und vielleicht zu eng gekoppelt.

Wäre das Delegiertenmuster besser? Wenn ja, wie kann man das am besten einrichten? Schriftsetzer hat keinen Delegaten, aber LayoutManager hat bereits einen. Soll ein Delegat zu Typesetter hinzugefügt werden, dann überschreiben Sie den Delegaten in LayoutManager? Oder ist es besser, nur bei der Übergabe der Schnittstelle meines Modells zu bleiben?

Jeder Einblick wäre willkommen. Vielen Dank.

Antwort

1

Im Allgemeinen ist es eine gute Idee, die Kommunikation mit dem Modell ausschließlich auf die Steuerung zu beschränken, die Aufgaben an andere beteiligte Objekte delegiert (die erforderlichen Informationen bereitstellen).

Während mehr OO und richtig, es ist nicht immer das schönste. Es ist jedoch am einfachsten zu pflegen.

Model ===> Controller ===> View 
       || 
       || 
       \/ 
      Other Objects 
+0

Einverstanden. Am Ende habe ich Delegiertenmethoden eingerichtet, die den Controller einfach nach den Daten gefragt haben, die ich für die Ansicht benötigt habe. – Donald