Disons que j'ai une classe Event
comme suit:
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
}
}
Est-il recommandé d'utiliser des fonctions ou des propriétés calculées dans les 2 cas indiqués ci-dessus?
functions
swift-language
Ashley Mills
la source
la source
Réponses:
Suivez le principe d'accès uniforme ,
Pour moi, cela signifie que je n'écris pas de fonctions qui ne prennent aucun argument et ne renvoient aucune valeur. J'utilise toujours des propriétés calculées. De cette façon, si je décide plus tard de changer la propriété calculée en une propriété stockée, je peux le faire sans avoir l'envie de supprimer les parens partout dans mon application et sans avoir une méthode "getter" distincte qui renvoie simplement la valeur d'un stocké propriété, ce qui semble IMHO assez gaspillage.
Et si je change une propriété stockée en une propriété calculée, je n'ai pas besoin d'ajouter de parens à la fin de celle-ci, et partout où elle est utilisée dans l'application.
la source
Je dirais que cela dépend de la complexité du calcul par rapport à la fréquence d'utilisation.
O(1)
/*
, utilisez la propriété calculée.O(N)+
/rare-use
, utilisez la fonction.O(N)+
/frequent-use
, pensez si à l'avenir vous pourriez décider d'utiliser la mise en cache ou d'autres techniques "intelligentes" pour compenser la complexité, si "oui" alors utilisez la propriété, si "non-non-non, c'est juste lourd" alors utilisez la fonction .la source
J'ai récemment commencé à apprendre Kotlin et ils ont une grande heuristique sur le moment d'utiliser les propriétés calculées:
- https://kotlinlang.org/docs/reference/coding-conventions.html
la source
Dans Swift, les fonctions sans paramètres et propriétés calculées ont presque les mêmes capacités (il peut y avoir une différence qu'une fonction sans paramètre est également une fermeture, alors qu'une propriété calculée ne l'est pas).
La différence est sémantique. Si votre code effectue une action et retourne par exemple une description du résultat de cette action, alors j'utiliserais une fonction. Si votre code calcule une propriété mais du point de vue de l'utilisateur, cela aurait pu être une propriété stockée, ou peut-être une propriété stockée qui nécessite d'abord la mise à jour d'une valeur mise en cache, alors j'utiliserais une propriété calculée.
Une grande différence: que se passe-t-il si vous appelez deux fois la fonction ou la propriété calculée? Pour une propriété calculée, je m'attends à ce que x = propriété; la propriété y = a exactement le même comportement que la propriété x =; y = x sauf qu'il peut fonctionner un peu plus lentement. Pour les fonctions, je ne serais pas surpris si le comportement était différent.
la source
Utilisez
countOfAttendees
etcountOfPaidAttendees()
.Une variable calculée est une variable qui renvoie une valeur calculée à chaque fois qu'elle est accédée. Autrement dit, il ne stocke pas de valeur. En interne, il est implémenté en fonction.
Quelle est la différence avec une fonction?
Vous devez utiliser une variable lorsque
Raisons non pertinentes de préférer une variable à une fonction
Ressources
Extrait de WWDC 2014-204 Quoi de neuf dans Cocoa > 24:40 Quand utiliser un @property
From Swift Style by Erica Sadun > Propriétés calculées et méthodes
D'après les conventions de codage Kotlin> fonctions vs propriétés . Voir la réponse de Daniel ci-dessus .
Autres ressources sans informations pertinentes:
la source
J'utiliserais un
func
. La programmation orientée objet fonctionne très bien sans propriétés calculées. Parce que vous récupérez une valeur qui a été calculée / filtrée, certains peuvent affirmer qu'une propriété calculée se sent bien. Mais voici ma plainte, si vous faites cela, alors la lisibilité prend un coup, car cela ressemble à une valeur.Dans ce contexte, il ne serait pas logique d'essayer d'attribuer la valeur calculée (et heureusement, l'IDE nous aide à éviter cela), mais que se passe-t-il si j'essaie d'attribuer quelque chose qui est calculé mais qui ressemble à une valeur?
Lorsque vous utilisez func, l'appelant sait que vous ne traitez pas directement avec une valeur:
Je pense que si c'est un objet comportemental, il devrait ressembler à un comportement plutôt qu'à une structure de données. Si votre objet est stupide et n'a aucun comportement, alors pourquoi essayer de l'encapsuler? Dans ce cas, vous pourriez tout aussi bien que les participants soient publics
la source