Я должен Использовать сам Ключевое слово (Свойства) В Реализации?

Копирование / вставка не является антипаттерном, это помогает избежать ошибок

Мое эмпирическое правило - печатать только то, что нельзя скопировать / вставить. При создании аналогичного метода, класса или файла - скопируйте существующий и измените то, что нужно. (Я не говорю о дублировании кода, который должен был быть помещен в один метод).

Я обычно даже не печатаю имена переменных - либо копирую их, либо использую автозаполнение IDE. Если нужен какой-то метод DAO - скопируйте аналогичный и измените то, что нужно (даже если будет изменено 90%). Для некоторых это может показаться чрезмерной ленью или отсутствием знаний, но мне почти никогда не приходится иметь дело с проблемами, вызвавшими неправильное написание чего-то тривиального, и их обычно трудно поймать (если не обнаруживаются на уровне компиляции).

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

11
задан ROMANIA_engineer 21 October 2017 в 09:16
поделиться

2 ответа

Во-первых, вы не должны использовать сеттеры или геттеры в init или dealloc в соответствии с документацией Apple (и по уважительным причинам).

В остальном вам обычно следует использовать сеттер для установки переменная, если она есть.

Обычно я не утруждаю себя использованием геттера для доступа к ivar изнутри реализации, но бывают случаи, когда это необходимо. В частности, если вы ожидаете, что геттер может выполнять некоторую вычисление или проверку, или если вы хотите разрешить подклассам переопределять поведение.

Конечно, использование геттера в реализации является более общим и безопасным, но также обычно бессмысленно и расточительно. Сделайте свой выбор.

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

Однако я настоятельно рекомендую использовать другое имя для вашего ivar и вашего свойства. Обычное соглашение - это префикс подчеркивания ( _ ), хотя я лично использую i_ в качестве префикса, чтобы избежать путаницы с частным использованием Apple. Таким образом, вы не сможете случайно использовать неправильный:

self.name // use property
i_name // use ivar
self.i_name // syntax error
name // syntax error
5
ответ дан 3 December 2019 в 11:38
поделиться

Если вы открываете доступ к свойству извне world, и вы используете его внутри, вы должны использовать свойство во всем своем коде. Причина в инкапсуляции. Допустим, у вас есть свойство «Id» для SomeObj. Скажем, в какой-то момент вы решили изменить способ поведения Id (возможно, вы начали с того, что Id был членом var класса, и в процессе эволюции он становится частью данных, которые извлекаются из базы данных). Теперь вам нужно выполнить реализацию вашего класса и заменить все ссылки на член var вызовами базы данных. Если бы у вас был self.Id, вам просто нужно было бы переопределить геттер.

повторно выставляя свойство внешнему миру, и вы используете его внутри, вы должны использовать свойство во всем своем коде. Причина в инкапсуляции. Допустим, у вас есть свойство «Id» для SomeObj. Скажем, в какой-то момент вы решили изменить способ поведения Id (возможно, вы начали с того, что Id был членом var класса, и в процессе эволюции он становится частью данных, которые извлекаются из базы данных). Теперь вам нужно выполнить реализацию вашего класса и заменить все ссылки на член var вызовами базы данных. Если бы у вас был self.Id, вам просто нужно было бы переопределить геттер.

повторно выставляя свойство внешнему миру, и вы используете его внутри, вы должны использовать свойство во всем своем коде. Причина в инкапсуляции. Допустим, у вас есть свойство «Id» для SomeObj. Скажем, в какой-то момент вы решили изменить способ поведения Id (возможно, вы начали с того, что Id был членом var класса, и в процессе эволюции он становится частью данных, которые извлекаются из базы данных). Теперь вам нужно выполнить реализацию вашего класса и заменить все ссылки на член var вызовами базы данных. Если бы у вас был self.Id, вам просто нужно было бы переопределить геттер.

Скажем, в какой-то момент вы решили изменить способ поведения Id (возможно, вы начали с того, что Id был членом var класса, и в процессе эволюции он становится частью данных, которые извлекаются из базы данных). Теперь вам нужно выполнить реализацию вашего класса и заменить все ссылки на член var вызовами базы данных. Если бы у вас был self.Id, вам просто нужно было бы переопределить геттер.

Скажем, в какой-то момент вы решили изменить способ поведения Id (возможно, вы начали с того, что Id был членом var класса, и в процессе эволюции он становится частью данных, которые извлекаются из базы данных). Теперь вам нужно выполнить реализацию вашего класса и заменить все ссылки на член var вызовами базы данных. Если бы у вас был self.Id, вам просто нужно было бы переопределить геттер.

0
ответ дан 3 December 2019 в 11:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: