Когда использовать Категории

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

Надеюсь, это имеет смысл. Большое спасибо

Жюль

Ответ 1

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

Ответ 2

Если я правильно понимаю ваш вопрос, создание "нового класса" всегда "подклассифицируется", потому что вы подклассифицируете NSObject как минимум.

Вы можете использовать категории в новом классе для разделения разделов ответственности сложного класса. Например, все основные функции (переменные экземпляра, аксессоры, описание и т.д.) Могут находиться в одном файле ( "основной" файл класса), в то время как все методы поддержки протокола (например, NSTableViewDataSource) могут идти в другом.

Некоторые используют этот подход, чтобы держать вещи "опрятными". Я твердо верю в "если это мой собственный пользовательский класс, весь его код должен быть в одном файле", поэтому я лично этого не делаю. Я разграничиваю различные логические аспекты кода класса с помощью "#pragma mark Some Section Name", чтобы помочь навигации и удобочитаемости. Ваш пробег может отличаться.

Ответ 3

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

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

Ответ 4

В книге "Рефакторинг" Мартина Фаулера у него есть раздел под названием "Ввести иностранный метод" (для используемого вами класса сервера необходим дополнительный метод, но вы не можете изменить класс.) Для каких категорий подходят.

Тем не менее, бывают случаи, когда использование категории вместо изменения класса является подходящим. Хорошим примером использования категории, даже если вы можете изменить класс сервера, является то, как Apple обрабатывает UIViewController MediaPlayer Additions. Они могли бы поместить эти два метода в UIViewController, но поскольку единственные люди, которые когда-либо использовали бы их, - это люди, которые используют среду Media Player, было разумнее сохранить методы там.