Salesforce 中的设计模式

介绍

设计模式主要用于使我们的代码高效且有效地工作。 它还有助于防止达到任何州长限制。

什么是设计模式?

设计模式描述了一个重复发生的问题、核心以及解决方案的后果。 它不提供实际的实现细节。

Salesforce 中不同类型的设计模式

Salesforce 中的单例模式

它是一种创建设计模式,其中可以为每个事务创建一个类的单个实例。 原因是由于在单个事务中重复执行一个类的实例,很有可能得到限制异常。 这种模式可以减少类的重复实例化。

以下是一些场景:

1. 应用程序配置阅读器

2. 实用类(如数学)

3. 与数据库的连接

4. 记录器

例如:

代码有问题

在帐户上触发 AccountTrigger(插入之前,更新之前){ for(Account accRec : Trigger.new){ AccountExampleRecordType aert = new AccountExampleRecordType(); accRec.recordTypeId = aert.Id; } } 公共类 AccountExampleRecordType { 公共字符串 ID {get; 私有集;} public AccountExampleRecordType(){ Id = Account.sObjectType.getDescribe().getRecordTypeInfosByName() .get('Example').getRecordTypeId(); } }

 

上面代码中的问题是,如果插入或更新多条记录,那么我们将遇到调控器限制问题,因为每次都会为每条记录创建“AccountExampleRecordType”对象。

解决方案: 单例模式

下面是使用单例模式实现的“AccountExampleRecordType”处理程序类。

public class AccountExampleRecordType { //引用类 private static AccountExampleRecordType instance = null; //记录类型Id public String Id {get; private set;} //Private构造函数初始化记录类型的id private AccountExampleRecordType(){ Id = Account.sObjectType.getDescribe().getRecordTypeInfosByName() .get('Example').getRecordTypeId(); } //返回记录类型实例的静态方法 public static AccountExampleRecordType getInstance(){ //延迟加载变种 if(instance == null){ instance = new AccountExampleRecordType(); 返回实例; } } }

 

Salesforce 中的装饰图案

它是结构设计模式的一部分。 它用于使用 Salesforce 中的 Apex 编程为 sObject 提供附加功能。

例如:

公共类 ExpenseClassDecorator { 公共列表转换的费用​​ {set; get;} //构造函数 public ExpenseClassDecorator(){ 列出费用 = [SELECT Id, Name, Amount__c FROM Expense__c]; if(expenses.size() > 0){ convertExpenses = new List(); for(Expense__c 费用:费用){ convertExpenses.add(new ExpensesConverted(expense)); } } } } 公共类 ExpensesConverted{ Double DollarToInr = 79.85; Double DollarToEuro = 0.98 Double DollarToChf = 0.97; 公共字符串费用名称 {get; 集;}公共双expInDollar {get; 设置;}公共双expInInr {get; 设置;}公共双expInEuro {get; 设置;}公共双expInChf {get; 设置;}公共费用转换(费用__c费用){费用名称=费用。名称; expInDollar = 费用.Amount__c; expInInr = expInDollar * DollarToInr; expInEuro = expInDollar * DollarToEuro; expInChf = expInDollar * DollarToChf; } }

 

VisualForce 页面显示所有费用

 

Salesforce 中的 iTrigger 工厂模式

这种设计模式有助于规范化触发器和控制执行流程。 它通过消除触发器原理使单元测试变得更加简单,并帮助一群人在具有多个触发器的组织中工作。

例如:

公共接口 ITriggerPattern{ void BeforeInsert(List newRecords); 无效更新前(映射新记录,映射旧记录); void BeforeDelete(映射 oldRecords); 无效后插入(映射新记录); 无效更新后(地图新记录,地图(旧记录)); 无效后删除(映射旧记录); void AfterUndelete(映射旧记录); 布尔 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); } } }

 

Salesforce 中的策略模式

它有一种行为设计模式,允许我们定义一系列算法,使它们在运行时可选择和可互换。

例如:

public Interface paymentGateway{ Boolean pay(Double amt); } 公共类 creditCard 实现 paymentGateway{ 字符串名称; 字符串 cardNumb; 字符串 cvv; 日期; public Boolean pay(Double amt){ //信用卡接口使用Rest API } } public class mQuickPaymentStrategy implements paymentGateway{ String emailId; public Boolean pay(Double amt){ //Mobikwik 接口使用 Rest API } }

 

Salesforce 中的“每个对象一个触发器”设计模式

Salesforce 强烈建议在每个对象上编写单个触发器,这也是一个很好的做法,因为如果我们在每个对象上编写多个触发器,则可能会发生冲突和错误,因为触发器中没有执行顺序。

我们可以利用上下文变量从帮助类调用不同的方法。

例如:

在帐户上触发 AccountTrigger(插入后,更新后){ if(Trigger.isAfter && Trigger.isInsert){ UpdateCase.caseMethod(Trigger.new); UpdateOpportunity.oppMethod(Trigger.new); } }

 

发表评论

本网站使用Akismet来减少垃圾邮件。 了解您的数据如何处理.