Передача интерфейсов объектам или использование делегирования в Какао?

У меня есть ситуация, когда у меня есть несколько слоев вложенных объектов в приложении на основе документов, которые должны знать информацию об определенной модели.

В частности, у меня есть NSTextView, NSLayoutManager и NSTypesetter, каждый из которых должен знать определенные свойства моей модели документа, чтобы правильно ее отобразить.

В настоящее время я подклассифицировал каждый из классов и дал им свойство, которое имеет ссылку на мою модель. Ссылка передается из моего контроллера документов в подклассный NSLayoutManager, а затем передается в подклассный NSTypesetter:

@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

Модель передается из Controller->MyLayoutManager->MyTypesetter. Это кажется немного избыточным, возможно, слишком тесно связанным.

Будет ли модель делегата лучше? Если да, то как лучше это настроить? У Typesetter нет делегата, но у LayoutManager он уже есть. Следует ли добавить делегата в Typesetter, а затем переопределить делегата в LayoutManager? Или лучше придерживаться передачи интерфейса моей модели?

Любое понимание будет оценено. Благодарю.

1 ответ

Решение

Обычно рекомендуется изолировать связь с моделью исключительно с контроллером, который затем делегирует задачи (предоставляя соответствующую информацию по мере необходимости) другим задействованным объектам.

Хотя больше ОО и правильнее, оно не всегда самое красивое. Это, как правило, проще всего поддерживать, однако.

Model ===> Controller ===> View
               ||
               ||
               \/
          Other Objects
Другие вопросы по тегам