Почему переменные экземпляра считаются плохой практикой Apple?
В Apple Programming с Objective-C в разделе Encapsulating Data указано, что:
Вы можете определить переменные экземпляра без свойств
Лучше всего использовать свойство на объекте в любое время, когда вам нужно отслеживать значение или другой объект.
Другими словами, они настоятельно рекомендуют использовать частные свойства, а не переменные экземпляра для любого состояния частного объекта.
Мне интересно, почему это может быть так? Я понимаю, что у свойств есть такие функции, как KVO и атрибуты (сильный, слабый...), но во многих случаях мне не нужны эти функции, и переменная экземпляра будет работать нормально.
Есть ли веские причины, почему переменные экземпляра не могут считаться лучшей практикой?
Ответы
Ответ 1
Несмотря на то, что теперь ваша частная переменная может работать как простая переменная, вы можете позже решить, что некоторые полезные свойства полезны:
- наблюдения
- атомные аксессоры
- пользовательские аксессоры
- регистрация при доступе
- доступ из подклассов
Если вы только получаете доступ к своим переменным как свойствам, вы не добавляете много накладных расходов (за исключением жестких циклов) и оставляете место для получения любого из этих преимуществ, описанных выше.
В принципе, свойства полезны, даже если вы никогда не планируете публиковать их.
Конечно, есть места, где использование переменной экземпляра по-прежнему "более естественно", например, если вы переопределяете классы Foundation в кластере классов (например, NSArray
), он ожидает, что ваша реализация является частной и эффективной, поэтому я не использую свойства.
Кроме того, я не думаю, что вы должны слишком много читать в советах. Для меня это больше похоже на "Если вы только что узнали 5 минут назад о свойствах и переменных экземпляра, начните сначала с использования свойств".
Люди, которые не знакомы с языком, могут пойти довольно далеко, не зная, что представляют собой переменные экземпляра.
Ответ 2
Другими словами, они настоятельно рекомендуют использовать частные свойства, а не переменные экземпляра для любого состояния частного объекта.
Где вы читали, что они рекомендуют свойства private? Я думаю, что они означают публичные переменные/свойства.
И, конечно, использование свойств вместо переменных публичного экземпляра имеет множество преимуществ:
- инкапсуляция и пользовательские геттеры/сеттеры
- Управление памятью
- KVO
- двоичная совместимость
- и т.д.
Но, на мой взгляд, использование свойств private вообще не имеет преимуществ, и гораздо проще использовать частные переменные экземпляра. Единственная причина, по которой я могу себе представить, - это сделать пользовательские геттеры/сеттеры для таких переменных в будущем, но я не думаю, что это "лучшая практика".
Ответ 3
Точка лежит в основе абстракции хранилища. Такой простой, но очень мощный.