Modèles de conception dans Salesforce

Introduction

Les modèles de conception sont principalement utilisés pour que notre code fonctionne de manière efficace et efficiente. Cela permet également d'éviter d'atteindre les limites du gouverneur.

Qu'est-ce qu'un modèle de conception ?

Design Pattern décrit un problème qui se produit à plusieurs reprises, le cœur et les conséquences d'une solution. Il ne fournit pas de détails de mise en œuvre réels.

Différents types de modèles de conception dans Salesforce

Modèle de singleton dans Salesforce

C'est l'un des modèles de conception créationnels dans lesquels une seule instance d'une classe peut être créée par transaction. La raison est due à l'exécution répétée d'une instance d'une classe dans une seule transaction, il y a de fortes chances d'obtenir l'exception de limite. Ce modèle fonctionne pour réduire l'instanciation répétée d'une classe.

Voici quelques scénarios :

1. Lecteur de configuration d'application

2. Classe utilitaire (comme Math)

3. Connexion avec la base de données

4. Enregistreur

Mise en situation :

Problème avec un code

trigger AccountTrigger on Account (before insert, before update){ for(Account accRec : Trigger.new){ AccountExampleRecordType aert = new AccountExampleRecordType(); accRec.recordTypeId = aert.Id ; } } public class AccountExampleRecordType { public String Id {get; ensemble privé ;} public AccountExampleRecordType(){ Id = Account.sObjectType.getDescribe().getRecordTypeInfosByName() .get('Example').getRecordTypeId(); } }

 

Le problème dans le code ci-dessus est que si plusieurs enregistrements sont insérés ou mis à jour, nous aurons le problème de limite du gouverneur car l'objet 'AccountExampleRecordType' est créé à chaque fois pour chaque enregistrement.

Solution: Motif singleton

Vous trouverez ci-dessous la classe de gestionnaire 'AccountExampleRecordType' implémentée avec Singleton Pattern.

public class AccountExampleRecordType { // référence à la classe private static AccountExampleRecordType instance = null; //Identifiant du type d'enregistrement public String Id {get ; ensemble privé ;} // Le constructeur privé initialise l'identifiant du type d'enregistrement private AccountExampleRecordType(){ Id = Account.sObjectType.getDescribe().getRecordTypeInfosByName() .get('Example').getRecordTypeId(); } //une méthode statique renvoyant l'instance du type d'enregistrement public static AccountExampleRecordType getInstance(){ //variante de chargement différé if(instance == null){ instance = new AccountExampleRecordType(); instance de retour ; } } }

 

Motif décoratif dans Salesforce

Il fait partie du modèle de conception structurelle. Il est utilisé pour fournir des fonctionnalités supplémentaires au sObject à l'aide de la programmation Apex dans Salesforce.

Mise en situation :

public class ExpenseClassDecorator { public List convertExpenses{set; get;} //constructor public ExpenseClassDecorator(){ Liste des dépenses = [SELECT Id, Name, Amount__c FROM Expense__c]; if(expenses.size() > 0){ convertiExpenses = new List(); for(Expense__c depense : depenses){ convertExpenses.add(new ExpensesConverted(expense)); } } } } public class ExpensesConverted{ Double dollarToInr = 79.85; Double dollarToEuro = 0.98 Double dollarToChf = 0.97 ; public String depenseName {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 depense){ depenseName = depense.Nom; expInDollar = dépense.Montant__c ; expInr = expInDollar * dollarToInr ; expInEuro = expInDollar * dollarVersEuro ; expInChf = expInDollar * dollarVersChf ; } }

 

Page VisualForce pour afficher toutes les dépenses

 

Modèle d'usine iTrigger dans Salesforce

Ce modèle de conception permet de normaliser le déclencheur et de contrôler le flux d'exécution. Cela rend les tests unitaires beaucoup plus simples en éliminant la justification des déclencheurs et aide un groupe de personnes à travailler dans une organisation avec plusieurs déclencheurs.

Mise en situation :

interface publique ITriggerPattern{ void BeforeInsert(List newRecords); void BeforeUpdate(Map newRec, Map oldRec); void BeforeDelete(Map oldRecords); void AfterInsert(Map newRecords); void AfterUpdate(Map newRecords, Map(oldRecords)); void AfterDelete(Map oldRecords); void AfterUndelete(Map 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); } } }

 

Modèle de stratégie dans Salesforce

Il a un modèle de conception comportementale qui nous permet de définir une famille d'algorithmes les rendant sélectionnables et interchangeables au moment de l'exécution.

Mise en situation :

public Interface paymentGateway{ Boolean pay(Double amt); } public class creditCard implémente paymentGateway{ String name; Chaîne cardNumb ; cvv de chaîne ; Date biche ; public Boolean pay(Double amt){ //Interface de carte de crédit utilisant l'API Rest } } public class mQuickPaymentStrategy implements paymentGateway{ String emailId; public Boolean pay(Double amt){ //Interface Mobikwik utilisant l'API Rest } }

 

Modèle de conception « Un déclencheur par objet » dans Salesforce

Il est fortement recommandé par Salesforce et également une bonne pratique d'écrire un seul déclencheur sur chaque objet car si nous écrivons plusieurs déclencheurs sur chaque objet, des conflits et des erreurs peuvent se produire car il n'y a pas d'ordre d'exécution dans le déclencheur.

Nous pouvons utiliser les variables de contexte pour invoquer différentes méthodes de la classe d'assistance.

Mise en situation :

trigger AccountTrigger on Account (after insert, after update){ if(Trigger.isAfter && Trigger.isInsert){ UpdateCase.caseMethod(Trigger.new); UpdateOpportunity.oppMethod(Trigger.new); } }

 

Laissez un commentaire

Ce site utilise Akismet pour réduire les spams. Découvrez comment sont traitées les données de vos commentaires..