Patrones de diseño en Salesforce

Introducción

Los patrones de diseño se utilizan principalmente para hacer que nuestro código funcione de manera eficiente y efectiva. También ayuda a evitar alcanzar los límites del regulador.

¿Qué es un patrón de diseño?

El patrón de diseño describe un problema que ocurre repetidamente, el núcleo y las consecuencias de una solución. No proporciona detalles de implementación reales.

Diferentes tipos de patrones de diseño en Salesforce

Patrón Singleton en Salesforce

Es uno de los patrones de diseño creacional en el que se puede crear una sola instancia de una clase por transacción. El motivo se debe a la ejecución repetida de una instancia de una clase en una sola transacción, hay muchas posibilidades de obtener la excepción de límite. Este patrón funciona para reducir la instanciación repetida de una clase.

A continuación se presentan algunos escenarios:

1. Lector de configuración de aplicaciones

2. Clase de utilidad (como matemáticas)

3. Conexión con la base de datos

4. Registrador

Ejemplo:

problema con un codigo

activar AccountTrigger en la cuenta (antes de insertar, antes de actualizar){ for(Account accRec: Trigger.new){ AccountExampleRecordType aert = new AccountExampleRecordType(); accRec.recordTypeId = aert.Id; } } public class AccountExampleRecordType { public String Id {get; conjunto privado;} public AccountExampleRecordType(){ Id = Account.sObjectType.getDescribe().getRecordTypeInfosByName() .get('Ejemplo').getRecordTypeId(); } }

 

El problema en el código anterior es que si se insertan o actualizan varios registros, obtendremos el problema del límite del gobernador ya que el objeto 'AccountExampleRecordType' se crea cada vez para cada registro.

Solución: Patrón Singleton

A continuación se muestra la clase de controlador 'AccountExampleRecordType' implementada con Singleton Pattern.

public class AccountExampleRecordType { //haciendo referencia a la clase private static AccountExampleRecordType instancia = null; //Id. de tipo de registro public String Id {get; conjunto privado;} //Constructor privado inicializa el id del tipo de registro privado AccountExampleRecordType(){ Id = Account.sObjectType.getDescribe().getRecordTypeInfosByName() .get('Example').getRecordTypeId(); } //un método estático que devuelve la instancia del tipo de registro public static AccountExampleRecordType getInstance(){ //Variante de carga lenta if(instance == null){ instancia = new AccountExampleRecordType(); instancia de retorno; } } }

 

Patrón decorativo en Salesforce

Es una parte del patrón de diseño estructural. Se utiliza para proporcionar funcionalidad adicional al sObject mediante la programación de Apex en Salesforce.

Ejemplo:

public class ExpenseClassDecorator { Lista pública convertExpenses{set; get;} //constructor public ExpenseClassDecorator(){ Listar gastos = [SELECT Id, Name, Amount__c FROM Expense__c]; if(gastos.tamaño() > 0){ gastos convertidos = nueva Lista(); for(Expense__c gasto : gastos){ convertExpenses.add(new ExpensesConverted(gasto)); } } } } public class ExpensesConverted{ Double dollarToInr = 79.85; Doble dólarToEuro = 0.98 Doble dólarToChf = 0.97; public String gastoName {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 gasto){ gastoNombre = gasto.Nombre; expInDollar = gasto.Cantidad__c; expInr = expInDollar * dollarToInr; expInEuro = expInDollar * dollarToEuro; expInChf = expInDollar * dollarToChf; } }

 

Página de VisualForce para mostrar todos los gastos

 

Patrón de fábrica de iTrigger en Salesforce

Este patrón de diseño ayuda a normalizar el disparador y controlar el flujo de ejecución. Hace que las pruebas unitarias sean mucho más simples al eliminar la justificación del disparador y ayuda a un grupo de personas a trabajar en una organización con múltiples disparadores.

Ejemplo:

interfaz pública ITriggerPattern{ void BeforeInsert(List newRecords); void BeforeUpdate(Map newRec, Map oldRec); void BeforeDelete(Map oldRecords); void AfterInsert(Asignar nuevos registros); void AfterUpdate(Map newRecords, Map(oldRecords)); void AfterDelete(Map oldRecords); void AfterUndelete(Map oldRecords); Booleano está deshabilitado (); } clase pública TriggerClass{ demo public static void(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); } } }

 

Patrón de estrategia en Salesforce

Tiene un patrón de diseño de comportamiento que nos permite definir una familia de algoritmos haciéndolos seleccionables e intercambiables en tiempo de ejecución.

Ejemplo:

interfaz pública pasarela de pago { pago booleano (cantidad doble); } tarjeta de crédito de clase pública implementa pasarela de pago { String nombre; String número de tarjeta; Cadena cvv; Fecha doe; public Boolean pay(Double amt){ //Interfaz de tarjeta de crédito usando Rest API } } public class mQuickPaymentStrategy implements paymentGateway{ String emailId; pago booleano público (doble cantidad) { // Interfaz Mobikwik usando Rest API } }

 

Patrón de diseño “Un disparador por objeto” en Salesforce

Salesforce recomienda encarecidamente y también es una buena práctica escribir un solo disparador en cada objeto porque si escribimos varios disparadores en cada objeto, pueden producirse conflictos y errores, ya que no hay un orden de ejecución en el disparador.

Podemos hacer uso de las variables de contexto para invocar diferentes métodos de la clase auxiliar.

Ejemplo:

activar AccountTrigger en la cuenta (después de insertar, después de actualizar){ if(Trigger.isAfter && Trigger.isInsert){ UpdateCase.caseMethod(Trigger.new); UpdateOpportunity.oppMethod(Trigger.new); } }

 

Déjame tu comentario

Este sitio usa Akismet para reducir el correo no deseado. Descubra cómo se procesan los datos de sus comentarios.