Méthode classes

Bonjour à tous,
Nouveau et débutant en dart, je bloque de temps en temps sur des questions et je souhaiterais profiter de vos expériences pour avancer.

Lorsque je vais sur la documentation du package xml, je trouve un exemple :

final total = document.findAllElements('book')
    .map((element) => double.parse(element
        .findElements('price')
        .single
        .innerText))
    .reduce((a, b) => a + b);
print(total);   // prints 69.94

Je suis peut-être passé à coté dans le cours « apprendre le dart » ou « la programmation objet en dart », mais je ne suis pas sûr de comprendre la syntaxe.
L’emploi de méthodes sur une classe est-elle « cumulative » ? Est-ce systématique ou propre à la classe XmlDocument ?

Vous remerciant par avance.
Bonne soirée.

Hello,

Bonne question et pas facile d’y répondre…
La réponse simple : Tout dépend du type retourné par la méthode.

C’est pas clair ?
Créons une première classe :

class MonObjetA {
  void sayHello() => print("Bonjour je suis un objet A!");
}

On est d’accord que tu peux instancier cette classe et appeler la méthode sayHello().

main() {
  final objetA = MonObjetA();
  objetA.sayHello();
}

Maintenant créons une seconde classe :

class MonSuperObjet {
  MonObjetA createA() => MonObjetA();
}

La méthode createA renvoie un objet de type MonObjetA.
Je peux modifier ma fonction main pour récupérer objetA depuis ma classe MonSuperObjet

main() {
  final superObjet = MonSuperObjet();
  final objetA = superObjet.createA();
  objetA.sayHello();
}

Mais je peux aussi directement faire

main() {
  MonSuperObjet().createA().sayHello();
}

Donc si tu retourne un objet depuis une méthode de ta classe, tu peux directement utiliser cet objet sans l’instancier. Tout dépend ensuite de la créativité du développeur.


MODE_ASPIRINE = true;

Dans le cas de la librairie XML XmlDocument est un XmlNode.
Une extension XmlFindExtension sur XmlNode contient les méthodes findElements() et findAllElements() qui renvoie respectivement un Iterable<XmlElement>.

On a donc une liste de XmlElement en appelant la méthode findAllElements() d’un objet XmlDocument.

Ensuite on a la méthode map appartenant à la classe Iterable qui est appelée et qui renvoie un Iterable<T> ou T ici est un double.

Dans les paramètres de la méthode map() on a un element qui est de type XmlElement forcément puisqu’il est issu de l’Iterable<XmlElement> de la méthode findAllElements().

Donc pour chaque element on appelle la méthode findElements('price') avec le paramètre price qui renvoie comme vu plus haut un Iterable<XmlElement> sur lequel on appelle le getter single de la classe Iterable qui vérifie que la liste ne contient qu’un seul élément et le renvoie, on récupère donc un XmlElementsur lequel on appelle le getter innerText qui renvoie un String.
Ce String est parsé dans la méthode parse de la classe double ainsi notre String se transforme en double.

Si je reprend

Ensuite on a la méthode map appartenant à la classe Iterable qui est appelée et qui renvoie un Iterable<T> ou T ici est un double.

la méthode map() nous renvoie donc un un Iterable<double> sur lequel on appelle la méthode reduce().

Et tout cela est écrit de manière compacte ce qui donne le code que tu as donné en exemple.

MODE_ASPIRINE = false;

On peut faire des choses très puissantes avec les objets :slight_smile: et encore une fois tout dépend de la créativité du développeur.

1 « J'aime »

Bonjour,
Merci beaucoup pour votre réponse.
J’attends que le dolipranne fasse effet :sweat_smile:, mais cela répond à ma question concernant la manière de découper/comprendre la syntaxe, et me permet de mettre en exergue les points sur lesquels mon niveau de compréhension/maitrise est encore trop léger.
Je vous souhaite une bonne journée.
Cordialement.