当前位置: 首页 > 编程日记 > 正文

081_Introducing trigger handler class

案例分析:

我们对一个Object写多个独立得Trigger。 但最终这不是最好的做法。

在Salesforce中,只为每个SObject设置一个触发器总是好的

原因:每个独立触发器的执行顺序始终未定义。

因此,如果我们有多个触发器,它可能会导致不可预测的行为。

但是,想一想。 由于触发器没有单独的方法,如果我们将多个逻辑放入一个单独的触发器中,它可能会非常混乱。 现在我们只有两个触发器组合在一起,它已经变得凌乱而且可读性差。 那么现实世界的企业级项目呢?

这是我们想要引入TriggerHandler类的主要原因。

在Salesforce中,最好的做法是使Trigger与实际业务逻辑保持一致,并将逻辑代码放入TriggerHandler类中。

另外TriggerHandler 可以解决 Trigger无法处理的问题:

①with sharing

②@Test

③不能共享逻辑代码

trigger objectTrigger on Object (after delete, after insert, after undelete, after update, before delete, before insert, before update) {objectTriggerHandler handler = new objectHandler();/* Before Insert */if(Trigger.isInsert && Trigger.isBefore){handler.OnBeforeInsert(Trigger.new);}/* After Insert */else if(Trigger.isInsert && Trigger.isAfter){handler.OnAfterInsert(Trigger.new);}/* Before Update */else if(Trigger.isUpdate && Trigger.isBefore){handler.OnBeforeUpdate(Trigger.old, Trigger.new, Trigger.newMap);}/* After Update */else if(Trigger.isUpdate && Trigger.isAfter){handler.OnAfterUpdate(Trigger.old, Trigger.new, Trigger.newMap);}/* Before Delete */else if(Trigger.isDelete && Trigger.isBefore){handler.OnBeforeDelete(Trigger.old, Trigger.oldMap);}/* After Delete */else if(Trigger.isDelete && Trigger.isAfter){handler.OnAfterDelete(Trigger.old, Trigger.oldMap);}/* After Undelete */else if(Trigger.isUnDelete){handler.OnUndelete(Trigger.new);}}

public with sharing class ObjectTriggerHandler {private boolean m_isExecuting = false;public ObjectTriggerHandler(boolean isExecuting){m_isExecuting = isExecuting;}public void OnBeforeInsert(Object[] newObjects){// EXECUTE BEFORE INSERT LOGIC}public void OnAfterInsert(Object[] newObjects){// EXECUTE AFTER INSERT LOGIC}public void OnBeforeUpdate(Object[] oldObjects, Object[] updatedObjects, MapObjectMap){// BEFORE UPDATE LOGIC}public void OnAfterUpdate(Object[] oldObjects, Object[] updatedObjects, MapObjectMap){// AFTER UPDATE LOGIC}public void OnBeforeDelete(Object[] ObjectsToDelete, MapObjectMap){// BEFORE DELETE LOGIC}public void OnAfterDelete(Object[] deletedObjects, MapObjectMap){// AFTER DELETE LOGIC}public void OnUndelete(Object[] restoredObjects){// AFTER UNDELETE LOGIC}public boolean IsTriggerContext{get{ return m_isExecuting;}}
}

实际上,我们稍后会使这个TriggerHandler方法更加严格。 但现在这是一个比前一个更好的版本。

为什么? 首先,它将业务逻辑与触发器本身分开。

所以从现在开始,如果我们想在现有的触发器中添加更多的逻辑,我们可以简单地在现有的类中添加一个新方法 - 而不是添加一个新的触发器,或者直接在我们的触发器代码中添加一些代码,这最终会使它成为现实。

非常难以理解。其次,它将数据初始化过程,数据过程和最终DML过程分开。 这种分离不是强制性的,但它有助于集中代码。

转载于:https://www.cnblogs.com/bandariFang/p/10455458.html

相关文章:

python-opencv 定位识别读表

import cv2 import numpy as np import math import matplotlib.pyplot as plt """ 函数的格式为:kmeans(data, K, bestLabels, criteria, attempts, flags) (1)data: 分类数据,最好是np.float32的数据&#xff0c…

使用 Vue 2.0 实现服务端渲染的 HackerNews

Vue 2.0 支持服务端渲染 (SSR),并且是流式的,可以做组件级的缓存,这使得极速渲染成为可能。同时, 和 2.0 也都能够配合 SSR 提供同构路由和客户端 state hydration。vue-hackernews-2.0 是 Vue 作者在GitHub上面放的 Vue 2.0 的一…

【HDU】Flipper 3328 (stack + 模拟 + 英语阅读)

http://acm.hdu.edu.cn/showproblem.php?pid3328 stack模拟,做完这一题最大的感想就是学好英语真的很重要,看题看了半天,还理解错了,这一题,出现L的话,就把最左边的牌翻转,然后放到它旁边的那…

最新阿里Java技术面试题,看这一文就够了!

金三银四跳槽季即将到来,作为 Java 开发者你开始刷面试题了吗?别急,小编整理了阿里技术面试题,看这一文就够了!阿里面试题目目录1:技术一面(基础面试题目)2:技术二面(技术深度、技术…

OpenCV 【七】————边缘提取算子(图像边缘提取)——canny算法的原理及实现

canny边缘检测实现(C、opencv) 1.作用: 图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波。我们知道微分运算是求信号的变化率,具有加强高频分量的作用。在空域运算中来说&#x…

【Python】序列解包 and * 和 ** 的区别

可以使用序列解包功能对多个变量进行赋值。 序列解包也可以用于列表和字典,但对字典使用时,默认是对字典的“键”进行操作; 如果需要对“键:值”进行操作,需要使用字典items()方法; 如果需要对字典的“值…

JavaScript学习笔记—— 4. 变量、作用域和内存问题

ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值,其中基本类型值是简单的数据段,而引用类型值指的是那些可能由多个值构成的对象;对于5种基本类型数据:undefined, null,boo…

ApacheCN 学习资源汇总 2019.3

【主页】 apachecn.org 【Github】ApacheCN 暂时下线: 社区 暂时下线: cwiki 知识库 自媒体平台 微博:ApacheCN知乎:ApacheCNCSDN简书OSChina博客园We are ApacheCN Open Source Organization, not ASF! We are fans of AI, and have no relationship w…

python数据结构与算法:二叉树及三种遍历方式(先序遍历/中序遍历/后序遍历)

树的实现采用queue的形式: 树的三种遍历方式(广度优先白能力法):先序遍历(根左右),中序遍历(左根右)以及后序遍历(左右根) ###################…

【HDU】3635 Dragon Balls (带权并查集 一)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid3635 【问题描述】 有标号为1到n的n个龙珠,分别放在对应标号为1到n的n个城市里。 下面有两种操作: T A B表示把A龙珠所在城市的所有龙珠都转移到B龙珠所在的城市中 Q A 表示查询A,需…

php源码安全加密之PHP混淆算法.

php源码安全加密的前世今生,本想发在教程区中.不知道怎么发,就写在这里面吧.PHP加密,解密是一直的话题,本人菜鸟,今天就简单向大家介绍一下并说说其中原理.提供一些加密的混淆算法.一\PHP的加密总体上来说分以下2种:1\扩展组件类加密,代表有:zend\ionCube\SG\php_screw\bcompil…

Element 2.6.0 发布,基于 Vue 2.0 的桌面端组件库

开发四年只会写业务代码,分布式高并发都不会还做程序员? Element 2.6.0 发布了,Element 是一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库,提供了配套设计资源,帮助你的网站快速成型。由饿了么公…

【Python】随机函数

import random 1、random.random() 2、random.uniform(a,b) 3、random.randint(a,b) 4、random.randrange([start],stop[, step]) 5、random.choice(sequence) 6、random.shuffle(x[, random]) 7、random.sample(sequence,k) import random 1、random.random() 返回随…

IOS/Android模拟器运行APP调试方法

真机不是那么好获取的,模拟器用起来更方便 ios 安装ios-sim 安装 ios-sim,获取 APP 完整的product的文件包。 $ npm i -g ios-sim 启动app # ios-sim launch *.app - -devicetypeid 本地模拟器支持机型类型 id $ ios-sim launch **/BaiduBoxApp.app --d…

python数据结构与算法:单向链表

单链表:python实现及其对应的 增删查检 操作 ##################### P4.1-P4.8 单向链表 ########################### #coding:utf-8 class Node(object):def __init__(self,elem):self.elem elemself.next Noneclass SinglelinkList(object):""&quo…

Vue性能优化:如何实现延迟加载和代码拆分?

移动优先方法已经成为一种标准,但不确定的网络条件导致应用程序快速加载变得越来越困难。在本系列文章中,我将深入探讨我们在Storefront应用程序中所使用的Vue性能优化技术,你们也可以在自己的Vue应用程序中使用它们来实现快速加载。 Webpack…

GitHub怎样fork别人代码到自己仓库并进行贡献

在过程中可能遇到这个问题:https://www.cnblogs.com/q1104460935/p/8275833.html 这个博客应该可以解决 比如说现在有一个很牛逼的项目,我们进入项目地址, 想将这个项目复制到自己的github仓库,然后你还想将 仓库中的代码拉取到…

python数据结构与算法:单向循环列表

单向循环列表:python实现,及其对应的 增删查检 操作 ##################### P4.9-P4.12 循环链表 ########################### #coding:utf-8 class Node(object):def __init__(self,elem):self.elem elemself.next None class SinglecycleList(ob…

http权威指南-http连接管理

2019独角兽企业重金招聘Python工程师标准>>> HTTP连接管理 浏览器解析URL流程: 浏览器解析出域名;浏览器查询这个主机名的IP地址;浏览器获得端口号;浏览器发起到主机名IP地址端口的80连接;浏览器向服务器发…

在macos上基于python2.7安装PyQt5

在macos上基于python2.7安装PyQt5 在python3上面安装PyQt5是十分简单的,可是,在python2.7上安装这个东西,着实让人折腾了一把。要总结一下,年纪大了,记性不好。 首先要安装最新版的Qt和python2,命令如下&am…

python数据结构与算法:二分查找

二分查找&#xff1a;python 实现def binary_seaech(alist,item):"""二分查找 递归实现"""n len(alist)if n > 0:mid n // 2if alist[mid] item:return Trueelif item < alist[mid]:return binary_seaech(alist[:mid],item)else:retur…

使用maven镜像

综述 用maven做项目&#xff0c;最郁闷的莫过于某些依赖库下载不了。被墙了&#xff0c;你懂的。使用maven镜像仓库及其重要&#xff0c;特别是国内的镜像&#xff0c;可以有效缓解被墙疼痛。 常用的镜像 国外镜像 ibiblio.org <mirror> <id>ibiblio</id> &…

Jupyter Notebook 快捷键(基本)

Jupyter Notebook 快捷键 Jupyter Notebook 有两种键盘输入模式。编辑模式&#xff0c;允许你往单元中键入代码或文本&#xff1b;这时的单元框线是绿色的。命令模式&#xff0c;键盘输入运行程序命令&#xff1b;这时的单元框线是灰色。 命令模式 (按键 Esc 开启) Enter : …

关于二叉树的几个必须掌握的实现

The best way to end your fear is to face it yourself. 结束恐惧的最佳办法就是自己面对。本分分享了二叉搜索树的几种实现&#xff0c;由简入繁。说句题外话&#xff0c;马上又是金三银四的季节了&#xff0c;无论跳不跳槽&#xff0c;增加自己的知识储备总是没错的。从代码…

python数据结构与算法:队列与双端队列

双端队列&#xff1a; #################队列#################### #coding:utf-8 """ Deque() 创建一个空的双端队列 add_front(item) 从队头加入一个item元素 add_rear(item) 从队尾加入一个item元素 remove_front() 从队头删除一个item元素 remove_rear() 从…

view5.3登录桌面提示当前可用桌面资源不足

问题描述&#xff1a;用户反馈有个桌面经常提示当前可用桌面资源不足&#xff0c;开始的时候反复重启还可以使用&#xff0c;今天发现彻底无法登录了。解决方法&#xff1a;首先登录到view administrator管理平台查看该桌面发现状态是可用&#xff0c;说明桌面正常&#xff0c;…

【HDU】4706 Children's Day(模拟)

http://acm.hdu.edu.cn/showproblem.php?pid4706 该题没有输入&#xff0c;直接输出不同形状大小的N&#xff0c;在输出不同形状N的时候是要用到26个字母&#xff0c;并且是循环输出 #include <iostream>using namespace std;char map[60][60]; char a[] "abcdef…

详解原生AJAX请求demo(兼容IE5/6)

function createXHR(){ // 检测原生XHR对象是否存在if ( window.XMLHpptRequest ){// 如果存在就返回新实例return new XMLHpptRequest();} else { // 如果不存在就检测ActiveX对象// 兼容IE5/6return new ActiveXObject(Microsoft.XMLHttp);} }// 在所有的浏览器中创建XHR对象…

【POJ】3268 Silver Cow Party (将有向图的边反转)

问题链接&#xff1a;http://poj.org/problem?id3268 【问题描述】 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1…N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000) unidirectio…

项目管理深入理解08--成本管理

成本管理一章非常的重要&#xff0c;尤其是对于程序员来说&#xff0c;这方面非常的薄弱&#xff0c;但这部分知识无论是在项目管理中还是日常生活中都灰常重要&#xff0c;不然很难成为一个财务自由的程序员。此外&#xff0c;由于财务方面知识点比较多&#xff0c;特增加经济…