Неправильно ли использовать точечный синтаксис в качестве геттера? - PullRequest
5 голосов
/ 20 января 2011

Я знаю, что. это ярлык для сеттера. Иногда я использую такой код:

cell.textLabel.text = [NSString stringWithFormat:@"this is row %i", indexPath.row];

Это работает как ожидалось, но мне было интересно, лучше (или, может быть, более правильно?) Написать

cell.textLabel.text = [NSString stringWithFormat:@"this is row %i", [indexPath row]];

Или, другими словами, должен ли я использовать точечный синтаксис только с оператором =, например

aTextField.text = @"whatever";

Любые ссылки / документы приветствуются, спасибо:)

PS. Если вы не видите тег, я говорю об iOS здесь.

Ответы [ 5 ]

6 голосов
/ 20 января 2011

Точка (.) - это не только ярлык для установщика, но и ярлык для получателя.Вы также можете использовать точку для получения.Нет проблем, и это не плохая практика.Из Руководства по программированию Obj-C 2.0 , «Вы можете использовать синтаксис точки для вызова методов доступа, используя тот же шаблон, что и для доступа к элементам структуры. Синтаксис точки - это просто« синтаксический сахар »».Обратите внимание, что речь идет о методе доступа, а не только об установщике.

4 голосов
/ 20 января 2011

Это вопрос вкуса.

Я предпочитаю не использовать точечный синтаксис по разным причинам:

  • При использовании точечного синтаксиса гораздо сложнее найти только те места в вашем коде, где вы устанавливаете значение. Поиск setValue: намного проще, чем поиск .value

  • Как давний программист на C, мой мозг настроен связывать точечный синтаксис с доступом к членам структуры. Мне довольно сложно привыкнуть к точечному синтаксису в другой области.

  • Синтаксис setXY: close близко следует естественному языку. Упрощает чтение чужого кода.

3 голосов
/ 20 января 2011

""это ярлык для доступа к @property (который, кстати, может быть readonly ).С синтаксической точки зрения, является ли это получатель или установщик, зависит от позиции операнда:

self.enabled = NO; // setter
BOOL isEnabled = self.enabled; // getter
self.selected = self.enabled = NO; // this is OK too
1 голос
/ 20 января 2011

Это стиль кодирования, поэтому ни тот, ни другой лучше.

Я бы отметил две вещи.

В качестве кода Objective C долгое время я предпочитаю строку [indexPath], поскольку она согласуется состальная часть кода и для набора я бы использовал [aTextField setText: @ "независимо от того"]

Но если вам нужно использовать.нотация для ключевых путей доступа к одной и той же переменной через нотацию метода в одном и том же фрагменте кода покажется странной.

В документации Apple говорится

Objective-C обеспечиваетТочечный (.) оператор, который предлагает компактный и удобный синтаксис, который можно использовать в качестве альтернативы квадратной скобке ([] s) для вызова методов доступа.

и

myInstance.value = 10;
printf("myInstance value: %d", myInstance.value);

Точечный синтаксис является чисто «синтаксическим сахаром» - он преобразуется компиляторомв вызов методов доступа (так что вы на самом деле не обращаетесь непосредственно к переменной экземпляра).Приведенный выше пример кода в точности соответствует следующему:

[myInstance setValue:10]; printf("myInstance value: %d", [myInstance value]);
0 голосов
/ 20 января 2011

Использование синтаксиса точки не является стилем кодирования или вопросом вкуса!

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

Прогнозировать, использовать ли пользователь с точечным синтаксисом или нет, просто:открытый заголовок объявляет что-то как свойство , а затем обращается к нему как к свойству, используя точечный синтаксис , как явно намеревался автор интерфейса!

Если публичныйзаголовок объявляет что-то как метод , а затем обращается к нему с помощью синтаксиса отправки сообщений , как явно намеревался автор интерфейса! Make NO исключения.

Сложный вопрос: должны ли вы объявить что-то как свойство и, таким образом, сказать своим клиентам, что следует использовать doit-синтаксис, или вы должны объявить метод?Ответ прост:

  • Использовать свойства для состояний (что-то) .
  • Использовать методы для поведения (что-то сделать / вычислить) .

Другое практическое правило заключается в том, что свойства должны быть автономными, другого способа изменить значение свойства быть не должно, кромеустановить само свойство.Это не жесткое правило, используйте здравый смысл, существует много разумных исключений.Например, свойство hidden, которое можно изменить с помощью метода setHidden:animated:.

...