Категории против служебных классов в iOS
Почему служебные классы считаются плохой практикой в iOS? И категории, используемые в качестве замены вместо вспомогательных классов / служебных классов. Есть ли какая-то особая выгода от категорий, которые мы не получаем от служебных классов?
3 ответа
Категории имеют конкретное назначение. Они расширяют функциональность класса в коде, который по какой-то причине является внешним по отношению к классу (у вас нет исходного кода для оригинала, вам нужна другая видимость для категории,...).
Когда вы говорите "вспомогательный" класс, это звучит как делегаты, а не категории... или просто простая композиция.
Фактические служебные классы - те, которые не имеют экземпляров или состояний - существуют там, где это необходимо.
Не следует говорить, что служебные классы хуже. Это зависит от задачи.
Возможно, причина этого утверждения заключается в том, что разработчики, работающие на разных языках программирования, не знают категорий и просто используют служебные классы, даже категория будет работать лучше. Это особенно применяется к служебным классам, единственной целью которых является разделение существующего родительского класса на более легкие части. Это похоже на плохое, потому что оно не отражает смысла класса: если код помещен в класс семантически правильно, вы не должны нарушать семантику по административным причинам. Это часть класса, пусть это будет часть класса.
Для этого есть простой тест: если вы печатаете self.master
(за master
будучи оригинальным классом) очень часто (особенно это единственное использование self
вообще) очевидно, что служебный класс не имеет индивидуального назначения и полностью работает с исходным классом.
Но, конечно, если у вас есть отдельная функциональность, подкрепленная отдельным набором иваров, может быть правильным иметь дополнительные классы для них. (Они все еще являются служебными классами? Может быть, вы должны спросить свой Q более конкретно.)
Утилиты не плохая практика в iOS. Иногда имеет смысл иметь их рядом, если вам нужен центральный хаб для полезных функций с определенной общей целью (например, класс MathUtils для анализа значений типа double или ints в target-c).
Сказав это, по соглашению категории / расширения считаются более хорошими, поскольку они позволяют вам работать непосредственно с самими объектами без необходимости выделять память / создавать экземпляры других объектов. Например, вы можете создать категорию на объекте NSNumber, чтобы легко делить на число, что позволит вам иметь синтаксис языка, которому легко следовать: т.е.
в кратчайшие сроки:
number.divideBy(2)
или в объективе-с
[number divideBy:2]
В отличие от:
let utility = UtilityClass()
utility.divideNumber(number, by:2)
Надеюсь, это поможет убедить вас начать работать с категориями, они здесь ваши лучшие друзья!