Aller au contenu


Photo

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

Swift

  • Please log in to reply
20 réponses à ce sujet

#1 Jérémy

Jérémy

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 342 messages
  • LocationBordeaux

Posté 27 février 2017 - 14:08

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


Twitter : @jrmguimberteau


#2 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 599 messages
  • LocationParis

Posté 27 février 2017 - 14:33

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.


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#3 Jérémy

Jérémy

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 342 messages
  • LocationBordeaux

Posté 27 février 2017 - 14:52

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


Twitter : @jrmguimberteau


#4 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 27 février 2017 - 15:37

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.



#5 Jérémy

Jérémy

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 342 messages
  • LocationBordeaux

Posté 27 février 2017 - 15:54

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


Twitter : @jrmguimberteau


#6 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 27 février 2017 - 16:23

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


  • colas_ aime ceci

#7 Jérémy

Jérémy

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 342 messages
  • LocationBordeaux

Posté 27 février 2017 - 16:36

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 ?


Twitter : @jrmguimberteau


#8 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 27 février 2017 - 17:31

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
  }


#9 Jérémy

Jérémy

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 342 messages
  • LocationBordeaux

Posté 27 février 2017 - 18:19

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 ?

Twitter : @jrmguimberteau


#10 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 27 février 2017 - 18:27

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

#11 Jérémy

Jérémy

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 342 messages
  • LocationBordeaux

Posté 28 février 2017 - 10:18

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 ?


Twitter : @jrmguimberteau


#12 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 28 février 2017 - 10:53

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

  • colas_ aime ceci

#13 Lexxis

Lexxis

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 404 messages

Posté 28 février 2017 - 11:01

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.



#14 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 28 février 2017 - 11:29

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



#15 Lexxis

Lexxis

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 404 messages

Posté 28 février 2017 - 11:55

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



#16 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 28 février 2017 - 12:05

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


  • Lexxis aime ceci

#17 Céroce

Céroce

    Mouleur de chocolats

  • Contrôleur d'arômes
  • 5 206 messages
  • LocationSaint-Leu-d'Esserent / France

Posté 28 février 2017 - 13:33

- 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.
  • Draken aime ceci
RenaudPradenc.com Je suis développeur iOS & Mac indépendant.

#18 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 28 février 2017 - 13:57

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 :)
  • Jérémy aime ceci

#19 Jérémy

Jérémy

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 342 messages
  • LocationBordeaux

Posté 28 février 2017 - 16:54

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

 

Pourquoi read-only ?


Twitter : @jrmguimberteau


#20 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 28 février 2017 - 17:22

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







Also tagged with one or more of these keywords: Swift

0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)