Как Вы мешаете контроллерам Какао становиться слишком большими?

У Вас есть некоторые приемы или методы для повреждения классов контроллера Какао в меньшие блоки? Я нахожу, что независимо от того, что я, контроллеры заканчивают тем, что были одним из более сложных классов в моем дизайне. Основной материал прост, но после того как у меня есть несколько легкой сдобы, или действие покрывает выполнение, вещи становятся неприятно сложными. Дело не в этом плохо, но тем не менее я хотел бы осуществить рефакторинг код в несколько автономных частей.

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

6
задан zoul 18 May 2010 в 18:57
поделиться

2 ответа

Проблема не в размере, а в ответственности. На вашем контроллере больше одной шляпы? Если это так, разбейте его на несколько контроллеров, по одному на каждый класс.

Категории помогают с размером, но не с ответственностью. Если вы по-прежнему выполняете несколько задач в одном (объединенном) классе, проблема все равно остается; перенос их в отдельные файлы не решал.

Наличие множества категорий в одном классе создает риск коллизии методов: реализация одного и того же метода в нескольких категориях, возможно, путем реализации его в категории B, при этом забывая, что категория A уже имеет один. Это вызовет проблему, когда объект отправит себе сообщение, ожидая ответа одной категории на это сообщение и получая ответ другой.

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

Если ваш контролер носит более одной шляпы, разбейте ее на несколько классов.

Я рекомендую книгу Мартина Фаулера «Рефакторинг». Рефакторинг вашего кода очищает его, а взорвать слишком большие классы (а также методы и функции) - это подмножество такой очистки.

Конечно, несколько классов, которые когда-то были одним, нуждаются в замене коммуникации, которая раньше была внутренней внутри класса. Какао предоставляет ряд решений:

Вам не нужно выбирать ни одного, ни вам нужно использовать их все. Подходящие решения будут зависеть от того, какие именно коммуникационные потребности будут иметь ваши новые классы друг с другом.

4
ответ дан 10 December 2019 в 02:43
поделиться

Категории - это то, что вам нужно. Уловка (для вашего «не такого независимого» материала) состоит в том, чтобы объявить методы категории в вашем главном файле контроллера .h (а не в отдельном файле controller + category.h, его не будет), а затем реализовать их в вашем контроллере + категории. m файл. Примерно так:

//******************
// MyController.h
//******************
#import <Cocoa/Cocoa.h>

@interface MyContoller : NSObject 
{
    NSWindow   *window;

    // stuff to implement in the category
    NSComboBox *someCombo;
    NSButton       *someButton; 
}

@property IBOutlet NSWindow   *window;

@property IBOutlet NSComboBox *someCombo;
@property IBOutlet NSButton   *someButton;

@end

@interface  MyController (MyCategory)

- (IBAction)someComboSelected:(id)sender;
- (IBAction)someButtonPressed:(id)sender;

@end

//**************************
// MyController+MyCategory.m
//**************************
#import <Cocoa/Cocoa.h>
#import "MyController.h"

@implementation MyContoller (MyCategory)

- (IBAction)someComboSelected:(id)sender
{
    ....
}

- (IBAction)someButtonPressed:(id)sender
{
    ....
}

Очевидно, я не включил «MyController.m», где вы помещаете материал «@synthesize» и все остальное, что нужно для главного контроллера / awake-from-nib / чего угодно. В любом случае, такой способ дает вашим методам контроллера доступ к методам категорий и наоборот, а методы категорий имеют доступ ко всем свойствам.

3
ответ дан 10 December 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: