Digamos que eu tenha uma aula da Event
seguinte maneira:
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
}
}
É uma prática recomendada usar funções ou propriedades calculadas nos 2 casos indicados acima?
functions
swift-language
Ashley Mills
fonte
fonte
Respostas:
Siga o Princípio de acesso uniforme ,
Para mim, isso significa que não escrevo funcs que não recebem argumentos e retornam um valor. Eu sempre uso propriedades computadas. Dessa forma, se eu decidir posteriormente alterar a propriedade computada para uma propriedade armazenada, posso fazê-lo sem ter o desejo de remover as parênteses em todos os lugares no meu aplicativo e sem ter um método "getter" separado que apenas retorne o valor de uma propriedade armazenada. propriedade, o que parece bastante desperdício IMHO.
E se eu alterar uma propriedade armazenada em uma computada, não preciso adicionar parênteses ao final e a qualquer lugar em que ela for usada no aplicativo.
fonte
Eu diria que depende da complexidade do cálculo versus da frequência de uso.
O(1)
/*
, use a propriedade computada.O(N)+
/rare-use
, use a funçãoO(N)+
/frequent-use
, pense se, no futuro, você pode optar por usar o cache ou outras técnicas "inteligentes" para compensar a complexidade; se "sim", use a propriedade; se "não-não-não, é apenas pesado", use a função .fonte
Recentemente, comecei a aprender Kotlin e eles têm uma ótima heurística sobre quando usar propriedades computadas:
- https://kotlinlang.org/docs/reference/coding-conventions.html
fonte
No Swift, funções sem parâmetros e propriedades calculadas têm quase os mesmos recursos (pode haver uma diferença de que uma função sem parâmetro também seja um fechamento, enquanto uma propriedade calculada não).
A diferença é semanticamente. Se o seu código executar uma ação e retornar, por exemplo, uma descrição do resultado dessa ação, eu usaria uma função. Se o seu código calcula uma propriedade, mas do ponto de vista do usuário, isso poderia ter sido uma propriedade armazenada ou talvez uma propriedade armazenada que exija a atualização de algum valor em cache primeiro, então eu usaria uma propriedade calculada.
Uma grande diferença: o que acontece se você chamar a função ou a propriedade calculada duas vezes? Para uma propriedade calculada, espero que x = propriedade; y = propriedade tem exatamente o mesmo comportamento que x = propriedade; y = x, exceto que pode ser um pouco mais lento. Para funções, eu não ficaria surpreso se o comportamento fosse diferente.
fonte
Use
countOfAttendees
ecountOfPaidAttendees()
.Uma variável calculada é aquela que retorna um valor calculado cada vez que é acessado. Ou seja, ele não armazena um valor. Internamente, é implementado como uma função.
Qual é a diferença com uma função?
Você deve usar uma variável quando
Razões irrelevantes para preferir uma variável a uma função
Recursos
Da WWDC 2014 - 204 O que há de novo no cacau > 24:40 Quando usar uma @property
From Swift Style por Erica Sadun > Propriedades computadas vs. Métodos
Nas convenções de codificação Kotlin> funções x propriedades . Veja a resposta de Daniel acima .
Outros recursos sem informações relevantes:
fonte
Eu usaria um
func
. A programação orientada a objetos funciona bem sem propriedades calculadas. Como você está recuperando um valor calculado / filtrado, alguns podem argumentar que uma propriedade calculada parece correta. Mas aqui está a minha reclamação: se você fizer isso, a legibilidade será afetada, porque parece um valor.Nesse contexto, não faria sentido tentar atribuir o valor calculado (e, felizmente, o IDE nos ajuda a evitar isso), mas e se eu tentar atribuir algo que seja calculado, mas pareça um valor?
Ao usar o func, o responsável pela chamada sabe que você não está lidando com um valor diretamente:
Eu acho que se é um objeto comportamental, deve parecer que se comporta em vez de parecer uma estrutura de dados. Se seu objeto é burro e não tem nenhum comportamento, por que tentar encapsulá-lo? Nesse caso, é possível que apenas os participantes sejam públicos
fonte