[Retour d'expérience / Débat] Fonction VS Propriété calculée
Jérémy
Membre
Bonjour à tous,
Je sais que ce sujet avait été abordé dans des sous questions lors de divers conversations. Mais j'ouvre un topic pour que nous puissions échanger sur nos visions, notre façon de faire.
L'idée, très simple, est de répondre aux questions suivantes :
- dans quel cas utilisez vous une fonction ?
- dans quel cas utilisez vous une propriété calculée ?
- pour vous existe t'il une règle qui définit l'emploi d'une propriété calculé par rapport à une fonction ?
Merci pour vos réponses !
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Euh ..
Si je répond, c'est mon instinct qui me guide ça te semble valable comme réponse ?
Je fais des choses parce que j'ai l'impression que c'est juste, sans chercher à définir de règles. Bon, il faut dire aussi que je suis un autodidacte avec une vision intuitive de la technologie, pas vraiment le profil type de l'informaticien rigoureux.
Il en va de même de mon côté et c'est ce que je cherche à casser ici. L'idée est de se servir de divers retours d'expériences pour identifier si il existe une bonne façon de procéder.
Bon j'avoue que c'est peut être une démarche utopiste mais ça peut être utile comme conversation.
Pour moi, c'est comme Draken. De mon avis, ça dépende sur si tu aime taper les () ou non ::)
Plus sérieusement, on pourrait dire, avec une propriété calculée, c'est comme calculer l'age de la date de naissance.
En appelant une fonction, c'est à dire qu'on attend que la fonction s'occupe de quelque chose et renvoie le résultat.
Mais, en swift, on a moins de différence. On peut avoir les lazy vars, qui sont les vars qui sont initialisées par un closure (fonction).
Moi, j'utilise les lazy vars quand je veux construire un objet assez compliqué, mais seulement sur la première demande. Oui, c'est une var mais, en-dessous, c'est une fonction.
C'est à dire ?
D'accord et dans quel cas tu utilises une fonction ? Uniquement quand tu as besoin d'un / de paramètre(s) d'entré(s) ?
C'est à dire que la var n'est pas initialisée jusqu'à la première fois que ton code fait appel à la var.
Avant les lazy vars, on utilisait :
Mais, avec une lazy var :
Ce code n'est appelé qu'une seule fois ; n'importe combien de temps que l'on appelle la var, il n'est appelé que la première fois
D'accord. Mais si tu as le code suivant :
Si tu appelles square puis, par la suite, que la propriété side évolue, à quel moment square changera de valeur ? Lorsque tu le rappelleras par la suite ?
Jamais !
Tu utiliserais une var calculée pour telles situations.
Ce qui veut dire que si j'appelle square, qui me donne 4 et que je change la valeur de side par 9 il me retournera tout de même 4 ?
Ne compile pas
Du coup quand tu utilises un Lazy, il ne faut pas que le calcul soit lié aux propriétés de ta structure et de ta classe ?
L'idée qui sous-tend le lazy var, c'est pour tenir une ressource figée, un peut comme un let mais avec l'avantage qu'elle ne soit pas construit jusqu'au moment que l'on ait besoin.
On pourrait utiliser un let pour créer une ressource mais, comme tu peux voir, si tu avais beaucoup de choses à faire pour la construire, ce n'est pas très jolie et, en plus, c'est construit au commencement du program, même si tu n'avais jamais besoin pour l'exécution actuelle.
Pour ce que tu proposes, tu utiliserais les vars calculées.
La différence en syntaxe est subtile
Si tu peux en utilisant self. Mais pour cela il faut que toute les variables de la classe soit initialisés (soit en fixant une valeur soit lors de l'init)
La variables lazy ne sera "calculé" que lors du premier accès à cette variable. Cela étant tu peux très bien par la suite modifier la valeur de cette variable.
Du coup, tu pourrais faire :
Mais, c'est vachement débile. Les lazy vars ne sont pas faits pour ça. Elles sont plutôt pour l'initialisation des objets complex que l'on ne pourrait pas peut-être utiliser
Je pensais plus à un truc comme ça:
Effectivement tu as raison, les lazy sont surtout utilisés pour ce genre de cas. Une initialisation complexe et longue pour une variable qui peut ne pas être utilisé.
J'entends que tu comprends pourquoi on ne le fait pas mais, pour le renforcer pour les autres...
C'est contre l'intention d'un lazy var de l'utiliser seulement pour le calcul d'une valeur quand on a déjà une var calculée qui ne rien fait jusqu'au premier appel.
Comme tu as dit, le seul avantage d'un lazy var, c'est de décaler l'éventuel initialisation d'une ressource lourde ; pas d'autre raison 8--)
Auquel cas je réponds:
- une propriété est une caractéristique intrinsèque de l'objet. Peu importe si elle est déterminée à chaque accès, de façon paresseuse ou calculée à l'init.
- une méthode demande à un objet d'effectuer une action.
Puis-je dire, les propriétés représentent plutôt les noms ; les fonctions, les verbes
Pourquoi read-only ?
Car il ne tient pas debout d'affecter une var qui est calculée ? ::)
Okay je sors.