From baa91e945fd3df5f898d7b21cf5a23113ccf3057 Mon Sep 17 00:00:00 2001 From: Andrey Maksimov Date: Mon, 4 May 2020 16:55:35 +0300 Subject: [PATCH] refactored for the sake of flexibility --- README.md | 23 ++++++++++++++ example/triggers/AccountTrigger.trigger | 2 +- src/classes/TriggerFactory.cls | 42 +------------------------ 3 files changed, 25 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index e37b137..9ea21a2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,26 @@ # tscottdev-trigger-framework I reference this framework from time to time and thought it might be handy to create a repo for [Tony Scott's](https://github.com/tscottdev) 2013 code recipe, [Trigger Pattern for Tidy, Streamlined, Bulkified Triggers](https://developer.secure.force.com/cookbook/recipe/trigger-pattern-for-tidy-streamlined-bulkified-triggers). + +Basic usage: + +```apex +class ObjectHandler implements ITrigger { + public bulkBefore() { + if (Trigger.isDelete) { /* do some bulk stuff before delete: collect additional data, */ } + } + public bulkAfter() {} + public beforeInsert(SObject so) { /* do some ops with individual records (no SOQL or DML recommended! */ } + public beforeUpdate(SObject oldSo, SObject so) {} + public beforeDelete(SObject so) {} + public afterInsert(SObject so) {} + public afterUpdate(SObject oldSo, SObject so) {} + public afterDelete(SObject so) {} + public andFinally() { /* any post processing */ } +} + +trigger ObjectTrigger on SObject (after delete, after insert, after update, before delete, before insert, before update) +{ + TriggerFactory.execute(new ObjectHandler()); +} +``` diff --git a/example/triggers/AccountTrigger.trigger b/example/triggers/AccountTrigger.trigger index 14e01ec..9454d87 100644 --- a/example/triggers/AccountTrigger.trigger +++ b/example/triggers/AccountTrigger.trigger @@ -1,4 +1,4 @@ trigger AccountTrigger on Account (after delete, after insert, after update, before delete, before insert, before update) { - TriggerFactory.createHandler(Account.sObjectType); + TriggerFactory.execute(new AccountHandler()); } diff --git a/src/classes/TriggerFactory.cls b/src/classes/TriggerFactory.cls index 2d58aa8..382d2d3 100644 --- a/src/classes/TriggerFactory.cls +++ b/src/classes/TriggerFactory.cls @@ -5,34 +5,12 @@ */ public with sharing class TriggerFactory { - /** - * Public static method to create and execute a trigger handler - * - * Arguments: Schema.sObjectType soType - Object type to process (SObject.sObjectType) - * - * Throws a TriggerException if no handler has been coded. - */ - public static void createHandler(Schema.sObjectType soType) - { - // Get a handler appropriate to the object being processed - ITrigger handler = getHandler(soType); - - // Make sure we have a handler registered, new handlers must be registered in the getHandler method. - if (handler == null) - { - throw new TriggerException('No Trigger Handler registered for Object Type: ' + soType); - } - - // Execute the handler to fulfil the trigger - execute(handler); - } - /** * private static method to control the execution of the handler * * Arguments: ITrigger handler - A Trigger Handler to execute */ - private static void execute(ITrigger handler) + public static void execute(ITrigger handler) { // Before Trigger if (Trigger.isBefore) @@ -99,22 +77,4 @@ public with sharing class TriggerFactory // Perform any post processing handler.andFinally(); } - - /** - * private static method to get the appropriate handler for the object type. - * Modify this method to add any additional handlers. - * - * Arguments: Schema.sObjectType soType - Object type tolocate (SObject.sObjectType) - * - * Returns: ITrigger - A trigger handler if one exists or null. - */ - private static ITrigger getHandler(Schema.sObjectType soType) - { - if (soType == Account.sObjectType) - { - return new AccountHandler(); - } - - return null; - } }