Категория Objective-C по сравнению с Mixins - PullRequest
16 голосов
/ 07 августа 2009

Схожа ли концепция категорий Objective-C с концепцией mixins? Если так: в чем сходство? В нет: в чем различия?

Ответы [ 4 ]

17 голосов
/ 07 августа 2009

Насколько я понимаю:

Mixins

  • Синтаксический сахар для композиции
  • Добавлено разработчиком класса, а не пользователем
  • Может использоваться несколькими классами
  • Может добавлять переменные экземпляра
  • Может быть реализовано с использованием пересылки в Objective-C

Категории

  • Аналогично методам расширения в других языках
  • Обычно добавляется пользователем класса, а не разработчиком
  • Используется ровно одним классом и его подклассами
  • Может 't добавить переменные экземпляра
7 голосов
/ 19 октября 2012

Для ясности ответ НЕТ - они не одинаковы.

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

Это ключевое различие, поскольку оно означает, что варианты использования этих двух функций совершенно разные. Еще один способ взглянуть на это так: если вы переходите с Ruby на Objective-C и пропускаете свои миксины, вы не найдете никакой радости с категориями.

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

Mixins - это "множественное наследование" того типа, которого вы не найдете в Objective-C. Самая близкая вещь в target-c - это протоколы, так же как самая близкая вещь Java - это интерфейсы, но они не имеют ни переменных экземпляра, ни тел методов (в target-C или java). Таким образом, вы обычно создаете вспомогательные классы или помещаете код в суперклассы.

Вариант использования для категорий target-c заключается в том, что вы хотите добавить методы в существующий класс - даже класс системы или библиотеки.

Я бы сказал, что миксины более мощные, но так как это сравнение яблок с апельсинами, это было бы бессмысленно.

Чтобы быть точным:

  • Ruby-эквивалент Категорий, это просто повторное открытие класса, который вы хотите расширить и расширить его. (Вы можете сделать это где угодно в Ruby, и он фактически идентичен категориям)

  • Я не уверен, что цель-c эквивалентна Mixins, хотя - кто-нибудь?

[Update] Немного больше поиска, и нет никакого эквивалента Mixins в Objective-C, но предприимчивый Владимир Митрович создал библиотеку, которая эффективно это делает. https://github.com/vl4dimir/ObjectiveMixin

У меня две мысли о том, использовать ли его или нет: иногда, если используемый вами язык не поддерживает что-либо, легче работать с ним, чем бороться с ним или пытаться импортировать ваши любимые функции из Другие языки. («Если ты не можешь быть с тем языком программирования, который любишь, люби тот, с кем ты»).

Опять же, возможно, это просто немного издеваться над мной. Целое движение по аспектно-ориентированному программированию годами привлекало внимание к Java (но я мог бы добавить, что за пределами JBoss он никогда не набирает обороты). В любом случае, Владимир получает дополнительные похвалы за использование Черепашек ниндзя в своем примере.

На другом боковом узле: как относительный объект-c noob, мне кажется, что категории чрезмерно используются в примере кода, который я нахожу во всем Интернете. Кажется обычной практикой добавлять статические вспомогательные методы в системные классы с категориями, когда было бы так же просто создать вспомогательный класс для размещения этих методов в вашем проекте, с меньшим риском их поломки при обновлении системного класса или при импорте. чужая библиотека со своими собственными такими категориями. Типичным примером является добавление новых статических методов цвета в UIColor. Почему бы просто не добавить их в локальный класс?

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

В итоге: - забудьте о категориях как о решении для миксинов - категории хороши для базовых данных, но переоценены и переоценены в противном случае

4 голосов
/ 07 августа 2009

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

2 голосов
/ 07 августа 2009

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

С категорией вы фактически добавляете непосредственно базовый класс, чтобы все экземпляры этой базы имели доступ к функциям, предоставляемым этой категорией.

...