Il pattern Bulkification in Salesforce

I pattern di programmazione sono molto utili perché risolvono problemi generali e aiutano a scrivere codice: 

  • Chiaro
  • Manutenibile
  • Facile da scalare

Utilizzare i pattern di programmazione è essenziale per la buona riuscita di un progetto, ma il loro utilizzo è a discrezione del singolo gruppo o a volte del singolo programmatore.

Tutti i pattern generici di programmazione possono essere utilizzati in Apex e il loro utilizzo è fortemente consigliato in Salesforce. Ne esiste però uno proprio di Apex detto Bulkification che è obbligatorio implementare per evitare di incorrere nei limiti dettati dai governor limits e inficiare così le performance di tutta o parte della Org.

Il pattern di Bulkification consiste nell’evitare di effettuare query o operazioni DML (inserimento, aggiornamento o delete di dati) su singoli record, ma di utilizzare invece liste di record, in modo da lavorare più efficientemente.

Inserire un singolo record o una lista di record nel database conta sempre come una singola transazione. Infatti non conta quanti record inseriamo ma quante volte accediamo al database, quindi anche nel caso di inserimento di 1000 records comunque accederemmo una sola volta al database.

Come utilizzare il pattern di Bulkfication

Il pattern di Bulkification è utilizzato principalmente in due momenti:

  1. Per effettuare inserimenti, modifiche e eliminazioni dei dati utilizzando delle liste di elementi invece di un elemento alla volta.
  2. Per effettuare delle query utilizzando delle liste di ID (o anche utilizzando altri filtri)

Di conseguenza evitare di inserire query o operazioni DML all’interno di cicli for.

Il pattern Bulkification deve essere utilizzato in ogni parte all’interno del codice, ma assume particolare importanza all’interno dei trigger, perchè è quando si effettuano inserimenti o modifiche in modo massivo che è facile superare i limiti imposti dai governor limits.

Esempio pratico del pattern Bulkification

Applicare il pattern di Bulkification è relativamente semplice, bisogna solo imparare a riconoscere quali sono gli errori da evitare e come “bulkifizzare” il codice in modo corretto.

Di seguito ti mostreremo i due principali esempi di Bulkification, inserendo nel primo snippet di codice il codice errato, e nel secondo snippet il codice correttamente editato secondo il pattern di Bulkification.

Bulkification per le operazioni DML

Il tipico errore che si commette scrivendo del codice Apex è quello di inserire un record alla volta all’interno del codice come mostrato di seguito:

for (Account account : accountList){
	Opportunity opp = new Opportunity(name = 'Opp for account '+account.name, 
			closeDate = System.today(), accountID = account.id);
	insert opp;
}

Al posto di inserire i record uno alla volta, utilizza una lista dove aggiungere tutti gli elementi da inserire e poi inserisci la lista fuori dal ciclo for come nello snippet seguente:

List<Opportunity> newOpportunities = new List<Opportunity>();

for (Account account : accountList){
	Opportunity opp = new Opportunity(name = 'Opp for account '+account.name, 
			closeDate = System.today(), accountID = account.id);
	newOpportunities.add(opp);
}

insert opportunities;

Bulkification per le query SOQL

Altro errore che viene tipicamente commesso è quello di inserire delle query all’interno di un for, perchè risulta naturale effettuare delle query il più vicino possibile a dove utilizzeremo poi le informazioni.

Questo però ci porta, come detto in precedenza, a dover aprire e chiudere più volte la connessione con il database.

Ecco di seguito uno snippet di codice errato, che però viene spesso utilizzato:

for(Id accountId : accountIdList) {
    Account account = [SELECT id, name FROM Account WHERE Id = :accountId];
	//logica sul singolo account
}

Invece di effettuare la query sul singolo Account, prova con il seguente:

List<Account> accounts = SELECT id, name FROM Account WHERE Id IN :accountIdList];
for(Account account : accounts) {
	//logica sul singolo account
}

Considerazioni sull’utilizzo del pattern Bulkification

Gli esempi fatti nel paragrafo precedente sono alla base del pattern di Bulkification.

Il più delle volte utilizzare questo pattern comporta il ricorso a un elevato numero di liste e mappe per poter avere tutti i record occorrenti in memoria ed effettuare poi tutte le logiche necessarie.

Se sei all’inizio della tua carriera di programmatore Salesforce sarai portato a pensare che utilizzare un elevato numero di mappe e list non sia efficiente perché significa avere molti riferimenti aperti in memoria. Non lasciarti ingannare. Un’operazione sul database ha sempre un costo maggiore in termini di risorse rispetto a delle liste o mappe istanziate in memoria.

Questo pattern a volte fa sì che vengano introdotte però un numero troppo elevato di mappe e liste. Il nostro consiglio quindi è quello di progettare sempre un minimo il codice che andrai a scrivere e di pensare in anticipo al numero di liste e mappe che ti serviranno e quali, invece, puoi evitare.

Siamo giunti alla fine e speriamo di averti chiarito le idee sul pattern Bulkification. Alla prossima guida!

Lascia un commento

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