Modelli di progettazione in Salesforce

Introduzione

I modelli di progettazione vengono utilizzati principalmente per far funzionare il nostro codice in modo efficiente ed efficace. Aiuta anche a prevenire il raggiungimento dei limiti del governatore.

Che cos'è un modello di progettazione?

Design Pattern descrive un problema che si verifica ripetutamente, il nucleo e le conseguenze di una soluzione. Non fornisce dettagli di implementazione effettivi.

Diversi tipi di modelli di progettazione in Salesforce

Pattern singleton in Salesforce

È uno dei modelli di progettazione della creazione in cui è possibile creare una singola istanza di una classe per transazione. Il motivo è dovuto all'esecuzione ripetuta di un'istanza di una classe in una singola transazione, ci sono alte possibilità di ottenere l'eccezione Limit. Questo modello funziona per ridurre le istanze ripetute di una classe.

Di seguito sono riportati alcuni scenari:

1. Lettore di configurazione dell'applicazione

2. Classe di utilità (come la matematica)

3. Collegamento con Database

4. Registratore

Esempio:

Problema con un codice

trigger AccountTrigger sull'account (prima dell'inserimento, prima dell'aggiornamento){ for(Account accRec: Trigger.new){ AccountExampleRecordType aert = new AccountExampleRecordType(); accRec.recordTypeId = aert.Id; } } public class AccountExampleRecordType { public String Id {get; set privato;} public AccountExampleRecordType(){ Id = Account.sObjectType.getDescribe().getRecordTypeInfosByName() .get('Example').getRecordTypeId(); } }

 

Il problema nel codice precedente è che se vengono inseriti o aggiornati più record, avremo il problema del limite del governatore poiché l'oggetto "AccountExampleRecordType" viene creato ogni volta per ogni record.

Soluzione: Modello singolo

Di seguito è riportata la classe del gestore "AccountExampleRecordType" implementata con Singleton Pattern.

public class AccountExampleRecordType { //riferito alla classe private static AccountExampleRecordType instance = null; //ID tipo record public String Id {get; private set;} //Il costruttore privato inizializza l'id del tipo di record private AccountExampleRecordType(){ Id = Account.sObjectType.getDescribe().getRecordTypeInfosByName() .get('Example').getRecordTypeId(); } //un metodo statico che restituisce l'istanza del tipo di record public static AccountExampleRecordType getInstance(){ //Variante di caricamento lento if(instance == null){ instance = new AccountExampleRecordType(); istanza di ritorno; } } }

 

Motivo decorativo in Salesforce

Fa parte del modello di progettazione strutturale. Viene utilizzato per fornire funzionalità aggiuntive a sObject utilizzando la programmazione Apex in Salesforce.

Esempio:

public class ExpenseClassDecorator { public List convertitoExpenses{set; get;} //costruttore public ExpenseClassDecorator(){ Elenca spese = [SELECT Id, Name, Amount__c FROM Expense__c]; if(spese.dimensione() > 0){ spese convertite = new List(); for(Expense__c spese: spese){ convertitoExpenses.add(nuovo ExpensesConverted(spesa)); } } } } public class ExpensesConverted{ Double dollarToInr = 79.85; Double dollarToEuro = 0.98 Double dollarToChf = 0.97; public String nomeSpese {get; set;} public Double expInDollar {get; set;} public Double expInInr {get; set;} public Double expInEuro {get; set;} public Double expInChf {get; set;} public ExpensesConverted(Expense__c spese){ speseNome = spese.Nome; expInDollar = spese.Importo__c; expInr = expInDollar * dollarToInr; expInEuro = expInDollaro * dollaroInEuro; expInChf = expInDollar * dollarToChf; } }

 

Pagina VisualForce per mostrare tutte le spese

 

Modello di fabbrica iTrigger in Salesforce

Questo modello di progettazione aiuta a normalizzare il trigger e controllare il flusso di esecuzione. Rende molto più semplici i test unitari eliminando la logica del trigger e aiuta un gruppo di persone a lavorare in un'organizzazione con più trigger.

Esempio:

interfaccia pubblica ITriggerPattern{ void BeforeInsert(List newRecords); void BeforeUpdate(Mappa newRec, Mappa oldRec); void BeforeDelete(Mappa oldRecords); void AfterInsert(Mappa nuovi record); void AfterUpdate(Mappa newRecords, Map(oldRecords)); void AfterDelete(Mappa oldRecords); void AfterUndelete(Mappa oldRecords); Boolean IsDisabled(); } public class TriggerClass{ public static void demo(ITriggerPattern pattHandler){ if(Trigger.isBefore){ if(Trigger.isInsert) pattHandler.BeforeInsert(trigger.new); if(Trigger.isUpdate) pattHandler.BeforeUpdate(trigger.newMap, trigger.oldMap); if(Trigger.isDelete) pattHandler.BeforeDelete(trigger.oldMap); } if(Trigger.isAfter){ if(Trigger.isInsert) pattHandler.AfterInsert(trigger.newMap); if(Trigger.isUpdate) pattHandler.AfterUpdate(trigger.newMap, trigger.oldMap); if(Trigger.isDelete) pattHandler.AfterDelete(trigger.oldMap); if(Trigger.isUnDelete) pattHandler.AfterDelete(trigger.oldMap); } } }

 

Modello di strategia in Salesforce

Ha un modello di progettazione comportamentale che ci consente di definire una famiglia di algoritmi rendendoli selezionabili e intercambiabili in fase di esecuzione.

Esempio:

public Interface paymentGateway{ Boolean pay(Doppio amt); } creditCard di classe pubblica implementa paymentGateway{ Nome stringa; String cardNumb; stringa cvv; Data daina; public Boolean pay(Double amt){ //Interfaccia della carta di credito che utilizza Rest API } } public class mQuickPaymentStrategy implementa paymentGateway{ String emailId; public Boolean pay(Double amt){ //Interfaccia Mobikwik che utilizza Rest API } }

 

Modello di progettazione "Un trigger per oggetto" in Salesforce

È altamente raccomandato da Salesforce ed è anche una buona pratica scrivere un singolo trigger su ciascun oggetto perché se scriviamo più trigger su ciascun oggetto, possono verificarsi conflitti ed errori poiché non esiste un ordine di esecuzione nel trigger.

Possiamo utilizzare le variabili di contesto per invocare metodi diversi dalla classe helper.

Esempio:

attiva AccountTrigger sull'account (dopo l'inserimento, dopo l'aggiornamento){ if(Trigger.isAfter && Trigger.isInsert){ UpdateCase.caseMethod(Trigger.new); UpdateOpportunity.oppMethod(Trigger.new); } }

 

Lascia un commento

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati dei tuoi commenti.