Подтвердить что ты не робот

Objective-C по сравнению с Mixins

Является ли понятие категорий Objective-C в любом случае похожим на понятие mixins? Если да: каковы сходства? В не: в чем отличия?

4b9b3361

Ответ 1

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

Примеси

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

Категория

  • Подобно методам расширения на других языках
  • Обычно добавляется пользователем класса, а не разработчиком
  • Используется только одним классом и его подклассами
  • Невозможно добавить переменные экземпляра

Ответ 2

Чтобы быть ясным, ответ НЕТ - они не совпадают.

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

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

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

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

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

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

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

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

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

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

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

Опять же, возможно, это немного для меня. Весь процесс Aspect Oriented Programming на протяжении многих лет демонстрирует возможности Java на Java (но я никогда не получаю много усилий, помимо JBoss). Во всяком случае, Владимир получает дополнительную награду за использование черепах ниндзя в своем примере.

С другой стороны node: как относительный Objective-C noob, мне кажется, что категории используются в образце кода, который я нахожу во всем Интернете. По-видимому, обычной практикой является добавление статических вспомогательных методов к системным классам с категориями, когда было бы так же просто создать вспомогательный класс для размещения этих методов в вашем проекте, с меньшим риском их нарушения при обновлении системного класса или при импорте кто-то другой библиотеки со своими подобными категориями. Общим примером является добавление новых методов статического цвета в UIColor. Почему бы просто не добавить их в локальный класс?

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

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

Ответ 3

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

Ответ 4

С помощью mixin вы можете получить новый класс из своей базы и mixin, а затем создать новый класс, чтобы использовать его.

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