AccueilNotre équipeContact

Optimiser vos boucles APEX

Par Etienne Gaudry
Publié dans Développeurs
06 juillet, 2022
1 min de lecture
Optimiser vos boucles APEX

Table des matières

01
❌ La boucle à éviter: Foreach
02
✅ La boucle la plus rapide: For size()
03
✅ La boucle contextuelle: For SOQL
04
🏆 Best practices

La boucle est l’une des structures les plus basiques et les plus puissantes des concepts de programmation. C’est une instruction qui se répète, communément appelée itération. Elle est la principale source de consommation de temps CPU, pouvant générer différents types d’erreurs dans l’exécution de l’application.

Alors comment l’optimiser 🤔?


❌ La boucle à éviter: Foreach

List<Account> accounts = [SELECT Id, Name FROM Account LIMIT 10000];
for (Account account : accounts) {
  account.Name = 'SalesforceBlog';
}

Dans cette boucle, un itérateur interne est créé comme dans le code ci-dessous. Un objet est instancié à chaque tour, ce qui augmente le temps de traitement.

Iterator<Object> iter = source.iterator();
while(iter.hasNext()) {
  Object next = iter.next();
  forLoopBody.yield(next);
}

✅ La boucle la plus rapide: For size()

Afin d’éviter le problème de la boucle Foreach, nous pouvons calculer et stocker la taille de notre liste dans une variable et utiliser celle-ci dans une boucle for simple.

List<Account> accounts = [SELECT Id, Name FROM Account LIMIT 10000];
for(Integer index = 0, size = accounts.size(); index < size; ++index){
  accounts[index].Name = 'SalesforceBlog';
}

✅ La boucle contextuelle: For SOQL

Si vous traitez une grande quantité d’enregistrements, la boucle for SOQL peut être intéréssante pour préserver la HeapSize (mémoire utilisée par les variables, les instances d’objet etc). Elle récupère tous les sObjects en utilisant une segmentation efficace avec des appels aux méthodes query et queryMore de l’API SOAP.

Vous pouvez traiter les enregistrements un par un:

for (Account account : [
  SELECT Id, Name
  FROM Account
  WHERE Name LIKE 'SalesforceBlog%'
]) {
  //Process
}

Ou par lots de 200 sObjects à la fois à l’aide d’une liste:

for (List<Account> accounts: [
  SELECT Id, Name 
  FROM Account 
  WHERE Name LIKE 'SalesforceBlog%'
]) {
  //Process
}

🏆 Best practices

  • Pas de requêtes SOQL ou SOSL à l’intérieur des boucles.
  • Pas d’instructions DML à l’intérieur des boucles.
  • Pas de méthodes Async(@future) à l’intérieur des boucles.
  • Gestion appropriée des exceptions.
  • Considération des limitations dans Salesforce.

Tags

ApexBest Practices
Article précédent
La Quête du Graal : À la Recherche d'un Développeur Salesforce à Lille ou Paris
Article suivant
Conventions de nommage
Etienne Gaudry

Etienne Gaudry

Responsable Technique Salesforce

Articles Similaires

Conventions de nommage
Conventions de nommage
06 juillet, 2022
1 min
© 2023, Tous droits réservés.

Liens rapides

CollaborationÀ proposNous contacter

Réseaux sociaux