Прочитавши статтю з покірною назвою "Команди заповідей: кращі практики кодування об'єктива-C" Роберта МакНіллі трохи менше двох років тому, я прийняв практику використання властивостей майже для кожного члена даних моїх класів Objective-C ( 3-та заповідь станом на травень 2012 року). McNally перераховує ці причини для цього (мій акцент):
- Властивості застосовують обмеження доступу (наприклад, лише для читання)
- Властивості застосовують політику управління пам'яттю (сильна, слабка)
- Властивості надають можливість прозоро реалізовувати власні налаштування та користувачі.
- Властивості за допомогою спеціальних сетерів або getters можна використовувати для забезпечення стратегії безпеки потоку.
- Наявність єдиного способу доступу до змінних екземплярів збільшує читабельність коду.
Я розміщую більшість моїх властивостей у приватних категоріях, тому зазвичай №1 та 4, як правило, не є проблемами, в які я стикаюся. Аргументи 3 та 5 є більш "м'якими", і за допомогою правильних інструментів та інших консистенцій вони можуть стати невідповідними. Отже, нарешті, для мене найбільш впливовим з цих аргументів було число 2, управління пам’яттю. Я роблю це з тих пір.
@property (nonatomic, strong) id object; // Properties became my friends.
Протягом останніх кількох моїх проектів я перейшов на використання ARC, що змусило мене сумніватися, чи все ще є хорошою ідеєю створення властивостей для чогось іншого чи, можливо, трохи зайвого. ARC піклується про управління пам'яттю об'єктами Objective-C для мене, що для більшості strong
членів працює чудово, якщо ви просто оголосили ivars. Типи С, яким вам довелося вручну керувати, до і після ARC, а weak
властивості переважно публічні.
Звичайно, я все ще використовую властивості для всього, що потребує доступу з-за класу, але це здебільшого лише декілька властивостей, тоді як більшість учасників даних перелічені як заголовки в заголовку реалізації
@implementation GTWeekViewController
{
UILongPressGestureRecognizer *_pressRecognizer;
GTPagingGestureRecognizer *_pagingRecognizer;
UITapGestureRecognizer *_tapRecognizer;
}
В ході експерименту я робив це трохи більш суворо, і відхід від властивостей до всього має деякі приємні позитивні ефекти.
- Вимоги (
@property
/@synthesize
) для учасників коду даних зменшилися лише до декларації ivar. - Більшість моїх
self.something
довідок очищено до просто_something
. - Легко розрізнити, які учасники даних є приватними (ivars), а які - загальнодоступними (властивості).
- Нарешті, це "відчуває" більше, як це було метою, яку Apple призначила властивостями, але це суб'єктивна спекуляція.
Щодо питання : Я повільно ковзаю до темної сторони, використовуючи все менше і менше властивостей на користь реалізації-іварів. Чи можете ви надати мені трохи міркувань, чому я повинен дотримуватися використання властивостей для всього, або підтвердити свій поточний порядок думок щодо того, чому я повинен використовувати більше ivars та менше властивостей лише там, де це потрібно? Найбільш переконлива відповідь будь-якої сторони отримає мій бал.
EDIT: МакНіллі зважує в Twitter, кажучи : "Я думаю, що моя головна причина дотримуватися властивостей полягає в тому, що один із способів робити все, що робить все (включаючи KVC / KVO.)"