Недвижимость под ARC: всегда или только для общественности?

9

Прочитав статью Роберта МакНэлли, написанную Робертом МакНэлли чуть менее двух лет назад, смиренно названную «Заповеди кода: лучшие практики для кодирования в Objective-C» , я принял практику использования свойств почти для каждого члена данных в моих классах Objective-C ( 3-я заповедь от мая 2012 года). МакНалли перечисляет эти причины для этого (мой акцент):

  1. Свойства обеспечивают ограничения доступа (например, только для чтения)
  2. Свойства применяют политику управления памятью (сильная, слабая)
  3. Свойства предоставляют возможность прозрачной реализации пользовательских сеттеров и геттеров.
  4. Свойства с пользовательскими установщиками или получателями могут быть использованы для реализации стратегии безопасности потоков.
  5. Наличие единственного способа доступа к переменным экземпляра повышает читабельность кода.

Я помещаю большинство своих свойств в частные категории, поэтому номера 1 и 4 обычно не являются проблемами, с которыми я сталкиваюсь. Аргументы 3 и 5 являются более «мягкими», и с правильными инструментами и другими согласованиями они могут стать несущественными. Итак, наконец, для меня наиболее влиятельным из этих аргументов был номер 2, управление памятью. Я делал это с тех пор.

@property (nonatomic, strong) id object; // Properties became my friends.

Для моих последних нескольких проектов я перешел на использование ARC, что заставило меня усомниться в том, что создание свойств для чего-либо еще - хорошая идея или, может быть, немного излишняя. ARC заботится о памяти, управляя объектами Objective-C для меня, что для большинства strongчленов прекрасно работает, если вы просто объявляете ivars. C-типы, которыми вы должны были в любом случае управлять вручную, до и после ARC, а weakсвойства в основном общедоступны.

Конечно, я все еще использую свойства для всего, что требует доступа извне класса, но это в основном лишь несколько свойств, в то время как большинство членов данных указаны в виде ivars под заголовком реализации.

@implementation GTWeekViewController
{
    UILongPressGestureRecognizer *_pressRecognizer;
    GTPagingGestureRecognizer *_pagingRecognizer;
    UITapGestureRecognizer *_tapRecognizer;
}

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

  1. Требования к коду элемента данных ( @property/ @synthesize) сократились до декларации ivar.
  2. Большинство моих self.somethingссылок приведено в порядок _something.
  3. Легко различить, какие члены данных являются частными (ivars), а какие общедоступными (свойства).
  4. Наконец, кажется, что именно для этого и предназначались свойства Apple, но это субъективное предположение.

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

РЕДАКТИРОВАТЬ: McNally взвешивает в Твиттере, говоря : «Я думаю, что моя главная причина придерживаться свойств является: один способ сделать все, что делает все (включая KVC / KVO.)»

epologee
источник

Ответы:

5

Можете ли вы дать мне немного рассуждений о том, почему я должен использовать свойства для всего, или подтвердить свой текущий ход мыслей относительно того, почему я должен использовать больше иваров и меньше свойств только там, где это необходимо?

Прямо сейчас, я думаю, будет справедливо сказать, что это в основном вопрос стиля. Как вы говорите, преимущество ARC в управлении памятью менее важно. С другой стороны, «преимущества» возврата к прямому доступу к ивару тоже не очень убедительны:

  1. Объявление @property очень похоже на объявление ivar. Отказ от директивы @synthesize не кажется большой победой - мы не говорим о большом количестве кода.

  2. foo.somethingСинтаксис, возможно , намного лучше , чем _something. Синтаксис доступа к свойству, очевидно, разработан так, чтобы выглядеть и работать как точечный синтаксис Си для доступа к членам структуры. Выяснить, к какому объекту вы обращаетесь (будь то selfили что-то еще), полезно. (Некоторые люди - не я! - выступают self->somethingза доступ к ivar по этой причине.) Соглашение о нижнем подчеркивании для ivars прекрасно, но оно не используется последовательно всем кодом Objective-C.

  3. Свойства кажутся лучшим выбором для доступа к данным, хранящимся в других объектах того же класса (что разрешено в «частном» доступе) и для доступа подклассами (например, «защищенный» в C ++). Так что идея 'properties == public' несколько размыта.

  4. Я чувствую, что свойства были предназначены для упрощения управления памятью и обеспечения некоторых других преимуществ. Как вы говорите, с уменьшением преимущества управления памятью свойства кажутся менее привлекательными.

Выбранный вами путь - возвращение к прямому доступу к данным через ivar - кажется очень разумным выбором, и нет никаких очевидных причин менять свой курс. Но придерживаться свойств также вполне разумно - недостатки не являются существенными, и есть некоторые приятные преимущества, такие как соответствие KVO и более согласованный стиль доступа к членам.

Свойства не были последним шагом в развитии Objective-C, и я не ожидаю, что ARC тоже будет. У меня нет никакой конкретной информации, но кажется хорошим предположением, что в какой-то момент могут быть добавлены дополнительные функции, которые делают свойства более привлекательными или менее привлекательными. Придется подождать и посмотреть что получится.

Калеб
источник
1
Привет @Caleb, спасибо, что нашли время и написали твердый пост. Я не думал об аспекте КВО. Мне действительно очень любопытно, куда Apple все это берет. ARC как есть, чувствует себя как один в серии шагов. Я подожду, чтобы посмотреть, не захочет ли кто-нибудь еще взвесить тему, в противном случае рассмотрите вопрос, помеченный галочкой.
epologee
1
@epologee Рад помочь. Еще один элемент, который нужно добавить в столбец плюс для ivars, заключается в том, что вы легко можете увидеть его в отладчике. Это верно и для свойств, если вы явно объявили ivar, который использует свойство. Синтезированные ивы не отображаются в отладчике. (Я не удивлюсь, увидев такое изменение в ближайшее время.)
Калеб
-1

Я также размышлял над этим вопросом. По моему скромному мнению, только использование свойств для методов доступа делает код более читабельным. Вы можете сразу увидеть, какие переменные предназначены для публичного доступа. И лично всегда ввод @property (...) перед переменной занимает много времени.

Алекс Будро
источник
Привет, Алекс, я думаю, тебе лучше отвечать на более свежие вопросы здесь, на SE. Я не очень согласен с длительным аргументом. Я не пишу код, который экономит мое время при написании, я люблю писать код, который экономит мое будущее, или кому-то еще, чтобы понять это. Тем не менее, -1 голос не был моим. Было бы неплохо для этого человека, чтобы уточнить голосование.
epologee