Скажем, у меня есть класс Event
следующим образом:
class Event {
private var attendees: [Person] = []
// Case 1
//*******
// Should I use a func…
func countOfAttendees() -> Int {
return attendees.count
}
// …or a var
var countOfAttendees: Int {
return attendees.count
}
// Case 2
//*******
// Should I use a func…
func countOfPaidAttendees() -> Int {
return attendees.filter({$0.hasPaid}).count
}
// …or a var
var countOfPaidAttendees: Int {
return attendees.filter({$0.hasPaid}).count
}
}
Рекомендуется ли использовать функции или вычисленные свойства в 2 случаях, указанных выше?
functions
swift-language
Эшли Миллс
источник
источник
Ответы:
Следуйте принципу единого доступа ,
Для меня это означает, что я не пишу функции, которые не принимают аргументов и возвращают значение. Я всегда использую вычисленные свойства. Таким образом, если позже я решу изменить вычисляемое свойство на хранимое свойство, я могу сделать это без необходимости удалять символы везде в моем приложении и без отдельного метода «getter», который просто возвращает значение хранимого собственность, которая кажется довольно расточительной ИМХО.
И если я изменяю сохраненное свойство на вычисляемое, мне не нужно добавлять в конец его значение, а также везде, где оно используется в приложении.
источник
Я бы сказал, что это зависит от сложности расчета и частоты использования.
O(1)
/*
, то используйте свойство computed.O(N)+
/rare-use
, то используйте функцию.O(N)+
/frequent-use
, подумайте, возможно ли в будущем вы решите использовать кэширование или другие «умные» методы для компенсации сложности, если «да», тогда используйте свойство, если «нет-нет-нет, это просто тяжело», то используйте функцию ,источник
Недавно я начал изучать Kotlin, и у них есть отличная эвристика о том, когда использовать вычисляемые свойства:
- https://kotlinlang.org/docs/reference/coding-conventions.html
источник
В Swift функции без параметров и вычисляемые свойства имеют почти одинаковые возможности (может быть разница, что функция без параметра также является замыканием, а вычисляемое свойство - нет).
Разница семантически. Если ваш код выполняет действие и возвращает, например, описание результата этого действия, я бы использовал функцию. Если ваш код вычисляет свойство, но, с точки зрения пользователя, это может быть сохраненное свойство или, может быть, хранимое свойство, которое сначала требует обновления какого-либо кэшированного значения, тогда я бы использовал вычисляемое свойство.
Большая разница: что произойдет, если вы вызовете функцию или вычисляемое свойство дважды? Для вычисляемого свойства я ожидаю, что x = свойство; свойство y = имеет то же поведение, что и свойство x =; y = x за исключением того, что он может работать чуть медленнее. Для функций я не удивлюсь, если поведение будет другим.
источник
Используйте
countOfAttendees
иcountOfPaidAttendees()
.Вычисляемая переменная - это переменная, которая возвращает вычисленное значение каждый раз, когда к ней обращаются. То есть он не хранит значение. Внутренне это реализовано как функция.
В чем разница с функцией?
Вы должны использовать переменную, когда
Нерелевантные причины предпочитать переменную функции
Ресурсы
Из WWDC 2014 - 204 Что нового в Какао > 24:40 Когда использовать @property
Эрика Садун от Swift Style > Вычисленные свойства и методы
Из соглашений кодлинга Kotlin> функции против свойств . Смотрите ответ Даниила выше .
Другие ресурсы без соответствующей информации:
источник
Я бы использовал
func
. Объектно-ориентированное программирование прекрасно работает без вычисляемых свойств. Поскольку вы возвращаете значение, которое было вычислено / отфильтровано, некоторые могут утверждать, что вычисленное свойство кажется правильным. Но вот моя жалоба: если вы делаете это, то читаемость требует успеха, потому что это похоже на значение.В этом контексте не имеет смысла пытаться присвоить вычисленное значение (и, к счастью, IDE помогает нам избежать этого), но что если я попытаюсь присвоить что-то, что вычисляется, но выглядит как значение?
При использовании func вызывающая сторона знает, что вы не имеете дело со значением напрямую:
Я думаю, что если это поведенческий объект, он должен выглядеть так, как будто он ведет себя, а не как структура данных. Если ваш объект тупой и не имеет никакого поведения, тогда зачем пытаться инкапсулировать его? В этом случае вы могли бы просто сделать посетителей публичными
источник