Категории против служебных классов в 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)

Надеюсь, это поможет убедить вас начать работать с категориями, они здесь ваши лучшие друзья!

Другие вопросы по тегам