Designmuster in Salesforce

Einführung

Entwurfsmuster werden hauptsächlich verwendet, damit unser Code effizient und effektiv funktioniert. Es hilft auch zu verhindern, dass Reglergrenzen erreicht werden.

Was ist ein Designmuster?

Design Pattern beschreibt ein immer wieder auftretendes Problem, den Kern und die Konsequenzen einer Lösung. Es enthält keine tatsächlichen Implementierungsdetails.

Verschiedene Arten von Entwurfsmustern in Salesforce

Singleton-Muster in Salesforce

Es ist eines der kreativen Entwurfsmuster, bei dem eine einzelne Instanz einer Klasse pro Transaktion erstellt werden kann. Der Grund dafür ist, dass aufgrund der wiederholten Ausführung einer Instanz einer Klasse in einer einzigen Transaktion hohe Chancen bestehen, die Limit-Ausnahme zu erhalten. Dieses Muster dient dazu, die wiederholte Instanziierung einer Klasse zu reduzieren.

Nachfolgend einige Szenarien:

1. Anwendungskonfigurationsleser

2. Utility-Klasse (wie Mathe)

3. Verbindung mit Datenbank

4. Logger

Beispiel:

Problem mit einem Code

AccountTrigger auf Account auslösen (vor dem Einfügen, vor dem Update){ for(Account accRec : Trigger.new){ AccountExampleRecordType aert = new AccountExampleRecordType(); accRec.recordTypeId = aert.Id; } } öffentliche Klasse AccountExampleRecordType { öffentliche String-ID {get; privater Satz;} public AccountExampleRecordType(){ Id = Account.sObjectType.getDescribe().getRecordTypeInfosByName() .get('Example').getRecordTypeId(); } }

 

Das Problem im obigen Code besteht darin, dass beim Einfügen oder Aktualisieren mehrerer Datensätze das Governor-Limit-Problem auftritt, da das Objekt „AccountExampleRecordType“ jedes Mal für jeden Datensatz erstellt wird.

Lösung: Singleton-Muster

Unten ist die mit Singleton Pattern implementierte Handler-Klasse „AccountExampleRecordType“ dargestellt.

public class AccountExampleRecordType { //Verweis auf die Klasse private static AccountExampleRecordType instance = null; //Datensatztyp-ID public String-ID {get; private set;} //Privater Konstruktor initialisiert die ID des Datensatztyps private AccountExampleRecordType(){ Id = Account.sObjectType.getDescribe().getRecordTypeInfosByName() .get('Example').getRecordTypeId(); } //eine statische Methode, die die Instanz des Datensatztyps zurückgibt public static AccountExampleRecordType getInstance(){ //Lazy Loading-Variante if(instance == null){ instance = new AccountExampleRecordType(); Rückgabeinstanz; } } }

 

Dekoratives Muster in Salesforce

Es ist ein Teil des strukturellen Entwurfsmusters. Es wird verwendet, um dem sObject mithilfe der Apex-Programmierung in Salesforce zusätzliche Funktionen bereitzustellen.

Beispiel:

öffentliche Klasse ExpenseClassDecorator { public List convertedExpenses{set; get;} //constructor public ExpenseClassDecorator(){ Listenausgaben = [SELECT Id, Name, Amount__c FROM Expense__c]; if(expenses.size() > 0) {convertedExpenses = new List(); for(Ausgaben__c Ausgabe: Ausgaben){ konvertierteAusgaben.add(neue AusgabenUmgerechnete(Ausgaben)); } } } } Öffentliche Klasse ExpensesConverted{ Double dollarToInr = 79.85; Doppelter DollarToEuro = 0.98 Doppelter DollarToChf = 0.97; öffentlicher String ausgabenname {get; set;} public Double expInDollar {get; set;} public Double expInInr {get; set;} public Double expInEuro {get; set;} public Double expInChf {get; set;} öffentliche Ausgabenumgerechnet (Ausgaben__c Ausgabe) {Ausgabenname = Ausgabe.Name; expInDollar = kosten.Betrag__c; expInInr = expInDollar * dollarToInr; expInEuro = expInDollar * dollarToEuro; expInChf = expInDollar * dollarToChf; } }

 

VisualForce-Seite zum Anzeigen aller Ausgaben

 

iTrigger-Factory-Muster in Salesforce

Dieses Entwurfsmuster hilft, den Trigger zu normalisieren und den Ausführungsfluss zu steuern. Es macht Unit-Tests viel einfacher, indem es die Trigger-Grundlage eliminiert, und hilft einer Gruppe von Menschen, in einer Organisation mit mehreren Triggern zu arbeiten.

Beispiel:

öffentliche Schnittstelle 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); Boolean IsDisabled(); } öffentliche Klasse TriggerClass { öffentliche statische 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); } } }

 

Strategiemuster in Salesforce

Es verfügt über ein Verhaltensdesignmuster, das es uns ermöglicht, eine Familie von Algorithmen zu definieren, die sie zur Laufzeit auswählbar und austauschbar macht.

Beispiel:

public Interface paymentGateway{ Boolean pay(Double amt); } public class creditCard implementiert paymentGateway{ String name; String cardNumb; Zeichenfolge cvv; Datumshirschkuh; public Boolean pay(Double amt){ //Kreditkartenschnittstelle mit Rest-API } } public class mQuickPaymentStrategy implementiert paymentGateway{ String emailId; public Boolean pay(Double amt){ //Mobikwik-Schnittstelle mit Rest-API } }

 

„Ein Auslöser pro Objekt“-Designmuster in Salesforce

Es wird von Salesforce dringend empfohlen und ist auch eine bewährte Vorgehensweise, einen einzelnen Auslöser für jedes Objekt zu schreiben, denn wenn wir mehrere Auslöser für jedes Objekt schreiben, können Konflikte und Fehler auftreten, da es keine Ausführungsreihenfolge im Auslöser gibt.

Wir können die Kontextvariablen verwenden, um verschiedene Methoden aus der Hilfsklasse aufzurufen.

Beispiel:

AccountTrigger auf Account auslösen (nach dem Einfügen, nach dem Update){ if(Trigger.isAfter && Trigger.isInsert){ UpdateCase.caseMethod(Trigger.new); UpdateOpportunity.oppMethod(Trigger.new); } }

 

Hinterlassen Sie eine Nachricht

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahren Sie, wie Ihre Kommentardaten verarbeitet werden.