Содержание
Введение
Шаблоны проектирования в основном используются для того, чтобы наш код работал эффективно и результативно. Это также помогает предотвратить превышение каких-либо ограничений регулятора.
Что такое шаблон дизайна?
Шаблон проектирования описывает повторяющуюся проблему, суть и последствия решения. Он не предоставляет фактических деталей реализации.
Различные типы шаблонов проектирования в 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); } }
0 комментариев