Шаблоны проектирования в Salesforce

Введение

Шаблоны проектирования в основном используются для того, чтобы наш код работал эффективно и результативно. Это также помогает предотвратить превышение каких-либо ограничений регулятора.

Что такое шаблон дизайна?

Шаблон проектирования описывает повторяющуюся проблему, суть и последствия решения. Он не предоставляет фактических деталей реализации.

Различные типы шаблонов проектирования в Salesforce

Шаблон Singleton в Salesforce

Это один из творческих шаблонов проектирования, в котором за транзакцию может быть создан один экземпляр класса. Причина в том, что из-за многократного выполнения экземпляра класса в одной транзакции высоки шансы получить Limit Exception. Этот шаблон работает для уменьшения повторного создания экземпляра класса.

Ниже приведены некоторые сценарии:

1. Читатель конфигурации приложения

2. Вспомогательный класс (например, математика)

3. Связь с базой данных

4. Регистратор

Пример:

Проблема с кодом

активировать AccountTrigger для учетной записи (перед вставкой, перед обновлением) { for(Account accRec : Trigger.new){ AccountExampleRecordType aert = new AccountExampleRecordType(); accRec.recordTypeId = aert.Id; } } открытый класс AccountExampleRecordType { открытый идентификатор строки {get; частный набор;} public AccountExampleRecordType(){ Id = Account.sObjectType.getDescribe().getRecordTypeInfosByName() .get('Example').getRecordTypeId(); } }

 

Проблема в приведенном выше коде заключается в том, что если вставить или обновить несколько записей, мы получим проблему ограничения регулятора, поскольку объект «AccountExampleRecordType» создается каждый раз для каждой записи.

Решения: Шаблон Singleton

Ниже представлен класс обработчика AccountExampleRecordType, реализованный с помощью шаблона Singleton.

public class AccountExampleRecordType { // ссылка на класс private static AccountExampleRecordType instance = null; // Идентификатор типа записи public String Id {get; private set;} //Private Constructor инициализирует идентификатор типа записи private AccountExampleRecordType(){ Id = Account.sObjectType.getDescribe().getRecordTypeInfosByName() .get('Example').getRecordTypeId(); } //статический метод, возвращающий экземпляр типа записи public static AccountExampleRecordType getInstance(){ //вариант ленивой загрузки if(instance == null){ instance = new AccountExampleRecordType(); вернуть экземпляр; } } }

 

Декоративный узор в Salesforce

Это часть шаблона структурного проектирования. Он используется для предоставления дополнительных функций sObject с помощью программирования Apex в Salesforce.

Пример:

открытый класс ExpenseClassDecorator { открытый список convertExpenses {набор; get;} //конструктор public ExpenseClassDecorator(){ Список расходов = [SELECT Id, Name, Amount__c FROM Expense__c]; if(expenses.size() > 0){ convertExpenses = new List(); for(Expense__c расход: расходы){ convertExpenses.add(new РасходыConverted(расходы)); } } } } открытый класс ExpensesConverted{ Double DollarToInr = 79.85; Двойной доллар к евро = 0.98 Двойной доллар к швейцарскому франку = 0.97; общедоступная строка, имя_расхода {получить; установить;} общественный двойной expInDollar {получить; установить;} общественный двойной expInInr {получить; установить;} общественный двойной expInEuro {получить; установить;} общественный двойной expInChf {получить; set;} public ExpensesConverted (расход Expense__c) { имя_расхода = расход.Имя; expInDollar = расход.Сумма__c; expInInr = expInDollar * DollarToInr; expInEuro = expInDollar * доллар в евро; expInChf = expInDollar * DollarToChf; } }

 

Страница VisualForce для отображения всех расходов

 

Шаблон iTrigger Factory в Salesforce

Этот шаблон проектирования помогает нормализовать триггер и контролировать поток выполнения. Это значительно упрощает модульное тестирование, устраняя обоснование триггера, и помогает группе людей работать в организации с несколькими триггерами.

Пример:

открытый интерфейс ITriggerPattern { недействительным BeforeInsert (список новых записей); void BeforeUpdate(Map newRec, Map oldRec); void BeforeDelete (сопоставить старые записи); void AfterInsert (сопоставить новые записи); void AfterUpdate (сопоставить новые записи, сопоставить (старые записи)); void AfterDelete (сопоставить старые записи); недействительным AfterUndelete (Map oldRecords); логическое значение отключено(); } открытый класс 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

Он имеет поведенческий шаблон проектирования, который позволяет нам определить семейство алгоритмов, делая их выбираемыми и взаимозаменяемыми во время выполнения.

Пример:

публичный интерфейс paymentGateway{ Boolean pay(Double amt); } public class creditCard реализует paymentGateway{ String name; Строковая картаNumb; строка cvv; Финиковая лань; public Boolean pay(Double amt){ //Интерфейс кредитной карты с использованием Rest API } } public class mQuickPaymentStrategy реализует платежный шлюз{ 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 для уменьшения количества спама. Узнайте, как обрабатываются ваши данные комментариев.