3 errori da non commettere come sviluppatore Apex

Imparare la sintassi di Apex è relativamente semplice, specialmente se si è programmatori e sviluppatori che vengono da un background Java.

Ma sebbene Apex sia un linguaggio di programmazione java-like, vi sono aspetti in cui è molto diverso da Java, ad esempio per quanto riguarda i meccanismi di gestione del codice asincrono e i governor limits imposti dalla piattaforma Salesforce.

Dopo aver imparato le basi della programmazione in Apex è necessario quindi evitare di commettere alcuni comuni errori. In questa guida ci concentreremo in particolare sui 3 errori più frequenti per i nuovi sviluppatori Apex:

  1. Trigger e callout in async
  2. Non fare update prima di una chiamata callout
  3. Creare una mappa da una query

Vediamoli uno ad uno.

Non è possibile effettuare una callout da un trigger

Il primo errore a cui puoi andare incontro è quello di tentare di effettuare una callout da un trigger. Scoprirai che non è possibile chiamare servizi esterni in modo sincrono a partire da un trigger. 

Per poterlo fare è necessario racchiudere il metodo di chiamata callout in un metodo future (se vuoi puoi scoprire di più su cosa sono i future method).

Non è possibile effettuare una operazione DML prima di effettuare una callout

Quando si tenta di effettuare una operazione DML prima di effettuare una callout, l’errore tipico che si ottiene è il seguente: “You have uncommitted work pending. Please commit or rollback before calling out” ed è causato da un codice di questo tipo:

update account;
HttpResponse httpresponse = HttpService.sendRequest(endPoint, jsonRequest, header, 'POST');

Questo errore avviene perché l’update potrebbe non aver effettuato il commit nel database quando viene effettuata la chiamata.

Le possibili soluzioni sono essenzialmente 2:

  1. Se applicabile, spostare l’operazione DML oppure la chiamata al servizio esterno in un metodo future.
  2. Se le due operazioni non sono strettamente correlate, effettuare l’operazione DML subito dopo la chiamata callout.

Creare una mappa a partire da una query

Quando effettuiamo una query, quello che otteniamo è una lista (List) di oggetti. Come possiamo trasformarlo in una mappa?

Qui di solito viene commesso il terzo errore di cui parleremo in questa guida. Quello che ho visto spesso è il seguente codice:

List<Account> accounts = [SELECT Id, Name FROM Account];
Map<Id, Account> accountsMap = new Map<Id, Account>();
for(Account account : accounts){
	accountsMap.put(account.id, account);
}

È possibile riscrivere questo codice come segue:

Map<Id, Account> accountsMap = new Map<Id, Account>([SELECT Id, Name FROM Account]);

Ottenendo lo stesso risultato ma scrivendo un codice più pulito e coinciso.

Attenzione però: questo trucco vale soltanto quando la chiave della coppia <chiave,valore> è l’id Salesforce. Se è necessario utilizzare un’altra chiave, bisogna utilizzare per forza il for per creare una mappa a partire da una lista.

E voi, quali errori o inesattezze avete riscontrato più spesso?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *