Wzorce projektowe w Salesforce

Wprowadzenie

Wzorce projektowe służą głównie do sprawnego i efektywnego działania naszego kodu. Pomaga również zapobiegać przekroczeniu limitów gubernatora.

Co to jest wzorzec projektowy?

Wzorzec projektowy opisuje powtarzający się problem, istotę i konsekwencje rozwiązania. Nie zawiera rzeczywistych szczegółów implementacji.

Różne rodzaje wzorców projektowych w Salesforce

Wzór Singleton w Salesforce

Jest to jeden z twórczych wzorców projektowych, w którym można utworzyć pojedynczą instancję klasy na transakcję. Powodem jest wielokrotne wykonanie instancji klasy w pojedynczej transakcji, są duże szanse na uzyskanie Wyjątku Limitu. Ten wzorzec działa w celu zmniejszenia liczby powtarzających się wystąpień klasy.

Poniżej przedstawiamy kilka scenariuszy:

1. Czytnik konfiguracji aplikacji

2. Klasa użyteczności (jak matematyka)

3. Połączenie z bazą danych

4. Rejestrator

Przykład:

Problem z kodem

wyzwalać AccountTrigger na koncie (przed wstawieniem, przed aktualizacją){ for(Account accRec : Trigger.new){ AccountExampleRecordType aert = new AccountExampleRecordType(); accRec.recordTypeId = aert.Id; } } public class AccountExampleRecordType { public String Id {get; private set;} public AccountExampleRecordType(){ Id = Account.sObjectType.getDescribe().getRecordTypeInfosByName() .get('Przykład').getRecordTypeId(); } }

 

Problem w powyższym kodzie polega na tym, że jeśli zostanie wstawionych lub zaktualizowanych wiele rekordów, otrzymamy problem z limitem zarządcy, ponieważ obiekt 'AccountExampleRecordType' jest tworzony za każdym razem dla każdego rekordu.

Rozwiązanie: Jednotonowy wzór

Poniżej znajduje się klasa obsługi 'AccountExampleRecordType' zaimplementowana ze wzorcem Singleton.

public class AccountExampleRecordType { //odwołanie do klasy private static AccountExampleRecordType instance = null; //Identyfikator typu rekordu public String Id {get; private set;} //Private Constructor inicjuje identyfikator typu rekordu private AccountExampleRecordType(){ Id = Account.sObjectType.getDescribe().getRecordTypeInfosByName() .get('Przykład').getRecordTypeId(); } //metoda statyczna zwracająca instancję typu rekordu public static AccountExampleRecordType getInstance(){ //Wariant ładowania z opóźnieniem if(instance == null){ instance = new AccountExampleRecordType(); zwracać instancję; } } }

 

Wzór dekoracyjny w Salesforce

Jest to część wzorca projektowego Structural. Służy do zapewnienia dodatkowej funkcjonalności sObject za pomocą programowania Apex w Salesforce.

Przykład:

public class ExpenseClassDecorator { public List przekonwertowaneWydatki{zestaw; get;} //constructor public ExpenseClassDecorator(){ Lista wydatków = [SELECT Id, Nazwa, Kwota__c FROM Wydatek__c]; if(wydatki.rozmiar() > 0){ przeliczoneWydatki = new List(); for(Wydatki__c koszt : wydatki){ przeliczoneWydatki.add(nowePrzeliczone wydatki(wydatki)); } } } } public class ExpensesConverted{ Double dollarToInr = 79.85; Podwójny dolarToEuro = 0.98 Podwójny dolarToChf = 0.97; public String nazwa kosztu {get; set;} public Podwójne expInDollar {get; set;} public Double expInInr {get; set;} public Podwójne expInEuro {get; set;} public Podwójne expInChf {get; set;} public ExpensesConverted(Expense__c cost){ costName = cost.Name; expInDollar = koszt.Kwota__c; expInInr = expInDollar * dollarToInr; expInEuro = expInDollar * dollarToEuro; expInChf = expInDollar * dollarToChf; } }

 

VisualForce Page, aby pokazać wszystkie wydatki

 

Wzorzec fabryki iTrigger w Salesforce

Ten wzorzec projektowy pomaga znormalizować wyzwalacz i kontrolować przepływ wykonywania. Znacznie upraszcza testowanie jednostkowe, eliminując przyczynę wyzwalania i pomaga grupie osób pracować w organizacji z wieloma wyzwalaczami.

Przykład:

interfejs publiczny 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); Wartość logiczna 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) patHandler.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) patHandler.AfterDelete(trigger.oldMap); if(Trigger.isUnDelete) patHandler.AfterDelete(trigger.oldMap); } } }

 

Wzorzec strategii w Salesforce

Ma behawioralny wzorzec projektowy, który pozwala nam zdefiniować rodzinę algorytmów, dzięki czemu można je wybierać i wymieniać w czasie wykonywania.

Przykład:

public Interface PaymentGateway{ Boolean pay (podwójna kwota); } public class creditCard implementuje PaymentGateway{ String name; Karta ciągNumb; cvv ciąg; Data łania; public Boolean pay(Double amt){ //Interfejs karty kredytowej z wykorzystaniem Rest API } } public class mQuickPaymentStrategy implementuje paymentGateway{ String emailId; public Boolean pay(Double amt){ //Interfejs Mobikwik przy użyciu Rest API } }

 

Wzorzec projektowy „Jeden wyzwalacz na obiekt” w Salesforce

Salesforce zdecydowanie zaleca, a także dobrą praktyką napisanie pojedynczego wyzwalacza dla każdego obiektu, ponieważ jeśli zapiszemy wiele wyzwalaczy dla każdego obiektu, mogą wystąpić konflikty i błędy, ponieważ w wyzwalaczu nie ma kolejności wykonywania.

Możemy wykorzystać zmienne kontekstowe do wywołania różnych metod z klasy pomocniczej.

Przykład:

wyzwolić AccountTrigger na koncie (po wstawieniu, po aktualizacji){ if(Trigger.isAfter && Trigger.isInsert){ UpdateCase.caseMethod(Trigger.new); UpdateOpportunity.oppMethod(Trigger.new); } }

 

Zostaw komentarz

Ta strona używa Akismet do redukcji spamu. Dowiedz się, jak przetwarzane są dane komentarza.