Копирование / вставка не является антипаттерном, это помогает избежать ошибок
Мое эмпирическое правило - печатать только то, что нельзя скопировать / вставить. При создании аналогичного метода, класса или файла - скопируйте существующий и измените то, что нужно. (Я не говорю о дублировании кода, который должен был быть помещен в один метод).
Я обычно даже не печатаю имена переменных - либо копирую их, либо использую автозаполнение IDE. Если нужен какой-то метод DAO - скопируйте аналогичный и измените то, что нужно (даже если будет изменено 90%). Для некоторых это может показаться чрезмерной ленью или отсутствием знаний, но мне почти никогда не приходится иметь дело с проблемами, вызвавшими неправильное написание чего-то тривиального, и их обычно трудно поймать (если не обнаруживаются на уровне компиляции).
Всякий раз, когда я отхожу от своего правила вставки копий и начинаю набирать текст, я всегда что-то неправильно пишу (это просто статистика, никто не может написать идеальный текст), а затем трачу больше времени, пытаясь выяснить, где.
Во-первых, вы не должны использовать сеттеры или геттеры в init или dealloc в соответствии с документацией Apple (и по уважительным причинам).
В остальном вам обычно следует использовать сеттер для установки переменная, если она есть.
Обычно я не утруждаю себя использованием геттера для доступа к ivar изнутри реализации, но бывают случаи, когда это необходимо. В частности, если вы ожидаете, что геттер может выполнять некоторую вычисление или проверку, или если вы хотите разрешить подклассам переопределять поведение.
Конечно, использование геттера в реализации является более общим и безопасным, но также обычно бессмысленно и расточительно. Сделайте свой выбор.
Использование установщика важно, поскольку оно дает возможность другому коду наблюдать за изменениями (наблюдение за ключевыми значениями), а также подклассы имеют возможность переопределить установщик и внести любые другие необходимые настройки.
Однако я настоятельно рекомендую использовать другое имя для вашего ivar и вашего свойства. Обычное соглашение - это префикс подчеркивания ( _
), хотя я лично использую i_
в качестве префикса, чтобы избежать путаницы с частным использованием Apple. Таким образом, вы не сможете случайно использовать неправильный:
self.name // use property
i_name // use ivar
self.i_name // syntax error
name // syntax error
Если вы открываете доступ к свойству извне 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, вам просто нужно было бы переопределить геттер.