Les fonctions dans Dart

Les fonctions dans Dart

Impossible d'aller loin sans elles!

La plupart d'entre nous a certainement entendu parler de fonction. Si ce n'est pas le cas ne vous inquiéter pas. Dans ce tutoriel, nous allons découvrir ou redécouvrir ensemble le concept de fonction en programmation et plus précisément en Dart.

1. Qu'est ce qu'une fonction?

Une fonction est un bloc de code conçu pour effectuer une tâche particulière. Par exemple, afficher un message de bienvenue ou calculer la surface d'une figure géométrique. Elle est exécutée lorsqu'on l'appelle. La fonction retourne une valeur, (mot clef return), lorsqu'elle ne retourne rien, (mot clef void placé devant le nom de la fonction), on parle de procédure.

Dans Dart, les fonctions sont des objets et ont un type, Cela signifie que les fonctions peuvent être affectées à des variables ou transmises comme arguments à d'autres fonctions.

2. Exemple de création d'une fonction Dart

    String getNom() {
       return 'KELANY';
    }

3. Appeler une fonction dans Dart

Pour appeler une fonction, utilisez le nom de la fonction suivi de parenthèses sans oublier bien sur le point virgule(;) de la fin de l'instruction.
Exemple d'appel de la fonction getNom()

 getNom();

code complet :

/// fichier: 01-fonction-simple.dart  
void main(List<String> args) {
  String nom = getNom();  // 2 - Appeler la fonction et la stockée dans la variable nom.
  print(nom); // Affiche KELANY dans la console dart
}

// 1 - Définir la Fonction 
String getNom() {
  return 'KELANY';
}

4. Les paramètres ou arguments d'une fonction

Les informations peuvent être transmises aux fonctions en tant qu'arguments. Les arguments sont spécifiés après le nom de la fonction, à l'intérieur des parenthèses. Vous pouvez ajouter autant d'arguments que vous le souhaitez, séparez-les simplement par une virgule. Les arguments sont tous typés dans Dart.

L'exemple suivant est une fonction avec un paramètre (prenom). Lorsque la fonction est appelée, nous transmettons un prénom, qui est utilisé à l'intérieur de la fonction pour retourner 'Bonjour le prenom transmis':

  String getPrenom(String prenom) {
       return 'Bonjour $prenom';
  }

code complet :

// fichier : 02-fonction-avec-parametre.dart
 void main(List<String> args) {
    String prenom = getPrenom('Suleiman'); // 2 - Appelle de getPrenom
    print(prenom); // Affiche Bonjour Suleiman dans la console dart
 }

// 1 - Definition de la fonction
  String getPrenom(String prenom) {
    return 'Bonjour $prenom';
  }

5. Fonction avec paramètre optionnel positionnel

Dans Dart, lors de l'appelle d'une fonction, on peut ne pas lui passer un paramètre même si lors de la définition de la fonction ce dernier est bien présent. Cela signifie que le paramètre n'est pas obligatoire et cela permet par exemple à la fonction de réaliser un traitement différent en fonction des besoins. Un paramètre enveloppé par [ ] est un paramètre optionnel de position. Prenons comme exemple le code suivant:

dynamic afficheInfo(String nom, String prenom, [int? age]) {
  if (age != null) {
    return 'Mon nom est $nom, mon prénom est $prenom et j'ai $age ans';
  } else {
    return 'Mon nom est $nom, mon prénom est $prenom et j\'ai pas fournir mon age😀😀!';
  }
}

Quelques explication s'impose alors sur le code:

  • [int? age] : Les paramètres optionnels de position se mettent entre crochet en Dart, le point d'interrogation (?) devant le type int c'est juste pour dire que la variable age peut être nulle. Donc pas besoin de le préciser lors de l’appel de la fonction afficheInfo()

  • dynamic : représente le type de retour de la fonction

  • if (age != null) : Vu que l'age peut être non null, il nous faut vérifier ce cas et renvoyer une réponse précise. On aurait pu vérifier si l'age vaut null de la manière suivante if (age == null).

code complet :

// Fichier : 03-fonction-avec-parametres-optionnels.dart
void main(List<String> args) {
  dynamic personne = afficheInfo('Kelany', 'Suleiman');
  print(personne); //  Mon nom est Kelany, mon prénom est Suleiman et j'ai pas fourni mon age😀😀!
}

dynamic afficheInfo(String nom, String prenom, [int? age]) {
  if (age != null) {
    return 'Mon nom est $nom, mon prénom est $prenom et  j\'ai $age ans';
  } else {
    return 'Mon nom est $nom, mon prénom est $prenom et j\'ai pas fourni mon age😀😀!';
  }
}

6. Fonction avec paramètre facultatifs nommés

A part, les paramètres positionnel facultatifs, Dart prends aussi en charge les paramètre facultatifs nommés. Un paramètre enveloppé par { } est un paramètre facultatif nommé. L'avantage principal de ce paramètre réside dans le fait que lors de l'appel d'une fonction, vous savez a quoi correspond les arguments passer en paramètre.

code complet :

// Fichier : 04-fonction-avec-parametres-nommee.dart
void main(List<String> args) {
  String url = getURLHttp('https://jsonplaceholder.typicode.com/', 'index.html',
      port: 8080);

  String url2 = getURLHttp(
    'https://jsonplaceholder.typicode.com/',
    'index.html',
  );

  print(url); // https://jsonplaceholder.typicode.com/index.html:8080
  print(url2); // https://jsonplaceholder.typicode.com/index.html:80
}

String getURLHttp(String server, String path, {int port = 80}) {
  return '$server$path:$port';
}

Un petit commentaire du code précédent s'impose:

  • Dans l'appel de la fonction getURLHttp, au niveau de la variable url, nous avions spécifier le paramètre nommé port, ici équivalent à 8080.
  • Dans l'appel de la fonction getURLHttp, au niveau de la variable url2, nous n'avions pas préciser le paramètre nommé, la valeur par défaut 80 sera donc utilisée.

7. Les fonctions fléchées ou lambda

Les fonctions fléchées sont identiques aux fonctions classique, a la différence juste que la syntaxe est plus courte. La syntaxe d'une fonction fléchée est la suivante:

 int add(int a, int b) => a + b;

Notez bien que lors de la déclaration des fonctions fléchées les paires d'accolades {} sont remplacées par les chevrons => et le mot clef return n'existe plus. Ses fonctions sont souvent utilisées par exemple dans le cadre des fonctions anonymes ou des fonctions qui ne retournent qu'une seule instruction.

8. Les fonctions anonymes

Depuis le début de ce tutoriel, nous avons manipulé des fonctions qui avaient des noms. Il peut nous arriver en programmation d'avoir à faire à des fonctions qui n'ont pas de nom. Ainsi, une fonction anonyme est, comme son nom l’indique, une fonction qui n'a pas de nom.

Les fonctions anonymes peuvent être utilisées lorsqu’on n’a pas besoin d’appeler notre fonction par son nom, c’est-à-dire lorsque le code de notre fonction n’est appelé qu’à un endroit dans notre programme et n’est pas réutilisé.

// Fichier : 05-fonction-anonyme.dart
void main(List<String> args) {
  var langages = ['DART', 'JAVASCRIPT', 'PHP', 'PYTHON', 'KOTLIN', 'JAVA'];

// Les fonctions anonyme ne pourront etre appelées qu'à un seul endroit
  langages.forEach((element) {
    print('${langages.indexOf(element)}: $element');
  });

}
   /// Voici la sortie en console : 
   /// 0: DART
   /// 1: JAVASCRIPT
   /// 2: PHP
   /// 3: PYTHON
   /// 4: KOTLIN
   /// 5: JAVA

Ici, nous passons une fonction anonyme qui prends un paramètre (element) à la méthode forEach en tant que paramètre.

9. Les fonctions de Callback

Une fonction de Callback ou fonction de rappel en français, est une fonction qu'on passe en argument d'une autre fonction, et qui est ensuite invoquée à l'intérieur de la fonction externe pour terminer une action. Mais une question subsiste, Pourquoi devrons nous faire cela ou dans quel cas cela peut il s'avérer utile? Ce qu'il faut retenir c'est que lorsqu'on passe une fonction en paramètre à une autre, nous n'exécutons pas la fonction dans le paramètre. En d'autre terme, nous ne passons pas la fonction avec la paire de parenthèses () comme lorsque nous exécutons la fonction. Ce qu'il faut noté ici, c'est que la fonction n'est pas immédiatement exécutée. Elle est rappelée plus tard. Les fonctions de Callback, sont la porte d'entrée du traitement de la programmation asynchrone.

// Fichier : 06-fonction-de-callback.dart
void main(List<String> args) {
  entreUtilisateur(disBonjour); // Passage de la fonction disBonjour(Une reference!)
}

void disBonjour(String nom) {
  print('Bonjour $nom');
}

void entreUtilisateur(callback) {
  var name = 'Bertille';
  callback(name);
}
   /// Voici la sortie en console : 
   /// Bonjour Bertille

L'exemple ci-dessus est un rappel synchrone , car la fonction est exécuté immédiatement.

Ce tutoriel, se veux juste une introduction aux fonctions de Callback, dans un autre tutoriel, nous plongerons plus en profondeur du Callback et du traitement de l'asynchrone, notamment avec l'objet Future de Dart.

Nous voici a la fin de se tutoriel, Il a été question des fonctions dans Dart, comment les définir, les appelées et en quoi peuvent elles être utiles dans nos programmes. J’espère vous avoir donné quelques rudiment afin que vous puissiez utiliser les fonctions dans vos programmes. Surtout n’hésiter pas à me laisser vos commentaires.

À bientôt pour d'autres tutoriels!!!!