Возврат другого объекта из init - PullRequest
1 голос
/ 16 февраля 2012

Я использую объекты, которые соответствуют объектному протоколу для представления расчетов. Есть константы [1], переменные [x] и операции [a + b]. Все эти объекты являются неизменяемыми (переменная содержит ключ (для словаря) и значение по умолчанию (используется, если словарь не содержит значения для ключа)).

Поскольку объекты неизменны, я хотел бы упростить вычисление, если это возможно, когда объект инициализируется. (Примечание: словарь переменных может постоянно меняться, поэтому я никогда не смогу упростить на основе значения переменной, только константы).

Например, очень распространенным вариантом будет увеличение переменной на 1: [[x] +1]. Когда они вложены, я хотел бы вернуть [[x] +2] из init вместо [[[x] +1] +1], так что эту часть вычисления нужно выполнить только один раз. Пока все хорошо.

Когда оба аргумента являются константами (например, [2 + 2]), имеет смысл просто вернуть [4]. Но ARC жалуется на это, потому что [4] - это другой класс, который придерживается того же протокола.

Это заставило меня задуматься о том, является ли то, что я хочу сделать, хорошей формой. Я бы обычно заставлял их всех наследоваться от одного класса (кластера классов), но я хочу использовать NSNumber (расширенный через категорию) для констант.

Я мог бы переместить логику упрощения в другой метод, но это означало бы, что нужно выделять дополнительные объекты довольно часто, и я должен был бы помнить, чтобы всегда вызывать его: [[[MyClass alloc] init ]impifiedCalc].

Мои варианты:

  1. Просто отключите компилятор (и напишите документация)
  2. Создание и вызов отдельного «упрощенного» метода, который возвращает другой объект (создание дополнительных объектов)
  3. Выполнение оптимизаций, которые возвращают один и тот же объект в init (например, [[[x] +1] +1] -> [[x] +2]), но требуют «упрощенного» метод для случая [2 + 2] = [4].
  4. ???

Любые мысли или советы приветствуются.

1 Ответ

2 голосов
/ 17 февраля 2012

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

@protocol Calculation
- (id<Calculation>)simplifiedExpression;
@end

. Это может вернуть self, если он уже упрощен, или создать новую упрощенную версию, если нет.Таким образом, вы все равно можете распределять / инициализировать ваши объекты, как вы делаете сейчас, а затем упростить их.Вы могли бы даже создать удобный конструктор, который делает оба сразу:

+ (id<Calculation>)simplifiedCalculationWithInput:(id)input;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...