[Retour d'expérience / Débat] Fonction VS Propriété calculée

JérémyJérémy Membre
février 2017 modifié dans Objective-C, Swift, C, C++ #1

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:

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.


  • Je fais des choses parce que j'ai l'impression que c'est juste, sans chercher à  définir de règles.


     


    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. ;)

  • Joanna CarterJoanna Carter Membre, Modérateur

    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.

  • JérémyJérémy Membre
    février 2017 modifié #5


    mais seulement sur la première demande.




     


    C'est à  dire ?


     



    Moi, j'utilise les lazy vars quand je veux construire un objet assez compliqué



     


    D'accord et dans quel cas tu utilises une fonction ? Uniquement quand tu as besoin d'un / de paramètre(s) d'entré(s) ?


  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2017 modifié #6


    C'est à  dire ?




     


    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 :



    {
    private var _person: Person?

    public var person: Person
    {
    if _person == nil
    {
    _person = Person()
    }

    return _person!
    }
    }

    Mais, avec une lazy var :



    {
    public lazy var person: Person =
    {
    let person = Person()

    // autre code pour préparer person

    return person
    }()
    }

    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



  • 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 :



    public var side: Double

    public lazy var square: Double = {
    return side * side
    }()
    }

    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 ?

  • Joanna CarterJoanna Carter Membre, Modérateur


    D'accord. Mais si tu as le code suivant :



    public var side: Double

    public lazy var square: Double = {
    return side * side
    }()
    }

    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.



    public var side: Double

    public var square: Double
    {
    return side * side
    }
  • Jamais !




    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 ?
  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2017 modifié #10
    C'est ce que j'ai dit. Et, en plus :

    public var side: Double

    public lazy var square: Double = {
    return side * side
    }()
    }

    Ne compile pas

  • 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 ?

  • Joanna CarterJoanna Carter Membre, Modérateur


    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.



    let optionList: [Option] = [option1, option2, option3, ...]

    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 



    // var calculée

    var square: Double // pas de "=" ici
    {
    return side * side
    } // pas de parenthèses ici


    // lazy var

    lazy var optionList: [Option] = // à  noter le "="
    {
    let list = [Option]()

    list.append(...)

    list.append(...)

    list.append(...)

    return list
    }() // il faut les parenthèses ici
  • LexxisLexxis Membre
    février 2017 modifié #13


    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 ?




     


    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.


  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2017 modifié #14


    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 :



    var side: Double = 0 // valeur initiale
    {
    didSet
    {
    square = side * side
    }
    }

    lazy var square: Double =
    {
    return 0 // valeur initiale
    }()

    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



  • Du coup, tu pourrais faire :



    var side: Double = 0 // valeur initiale
    {
    didSet
    {
    square = side * side
    }
    }

    lazy var square: Double =
    {
    return 0 // valeur initiale
    }()



    Je pensais plus à  un truc comme ça:



    class Foo {
    public var side: Double

    public lazy var square: Double = {
    return self.side * self.side
    }()

    init(_ value: Double) {
    self.side = value
    }
    }

    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




    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é.


  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2017 modifié #16


    Je pensais plus à  un truc comme ça:



    class Foo {
    public var side: Double

    public lazy var square: Double = {
    return self.side * self.side
    }()

    init(_ value: Double) {
    self.side = value
    }
    }



     


    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--)


  • CéroceCéroce Membre, Modérateur

    - pour vous existe t'il une règle qui définit l'emploi d'une propriété calculé par rapport à  une fonction ?

    Laisse-moi poser la question autrement: "Dans quels cas faut-il utiliser un propriété read-only, et dans lesquels utiliser une méthode" ?

    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.
  • Joanna CarterJoanna Carter Membre, Modérateur

    Laisse-moi poser la question autrement: "Dans quels cas faut-il utiliser un propriété read-only, et dans lesquels utiliser une méthode" ?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 :)


  • Dans quels cas faut-il utiliser un propriété read-only, et dans lesquels utiliser une méthode




     


    Pourquoi read-only ?

  • Joanna CarterJoanna Carter Membre, Modérateur

    Car il ne tient pas debout d'affecter une var qui est calculée ?  ::)




  • Car il ne tient pas debout d'affecter une var qui est calculée ?  ::)




     


    :p :p :p


     


    Okay je sors. :D

Connectez-vous ou Inscrivez-vous pour répondre.