首页 > 其他分享 >收藏贴!Salesforce开发课程必看的10个Apex最佳实践

收藏贴!Salesforce开发课程必看的10个Apex最佳实践

时间:2022-11-03 15:44:05浏览次数:57  
标签:10 Salesforce 必看 记录 Apex 代码 查询 Trigger 循环

Apex是一种强类型的,面向对象的编程语言,开发人员通过Apex表现业务逻辑来补充Salesforce平台所需的功能。Apex与Java很像,可以通过各种用户启动的事件来触发,例如记录更新,单击按钮,对象触发或外部Web服务请求。

本篇文章总结了10个Apex最佳实践,在你的职业道路上一定能用得上!

01

扩充代码

代码的批量化使代码能够一次有效地处理多条记录。这主要适用于Trigger,一次最多可以运行200条记录。

下图中是一个没有考虑批量化代码的示例。在Trigger中,只处理第一个机会,其他任何机会都保存在同一个Transaction中。根据业务流程,这可能是一个灾难性的错误。

下面是为处理Trigger中的整批记录而设置的相同代码,这意味着在一次Trigger调用中将正确处理200条记录。

我们还可以对代码进行批量化,以帮助提高一段代码的性能,从而减少查询以及其他操作。

与迭代列表相比,使用映射可以通过减少要执行的总代码行数来大大降低代码运行的复杂性和时间量。

02

避免循环中的DML/SOQL查询

如何一次插入/更新多条记录?或根据特定上下文查询记录集?亦或是在for循环中,在这些记录上查询或运行DML?

SOQL和DML是可以在Apex中执行的操作,两者都有与之相关的严格的Governor Limits。因此,将它们固定在一个循环中会导致灾难。

对于DML语句,可以将这些语句移出循环。在循环中将希望对其执行操作的记录添加到一个列表中,然后在列表中执行DML语句。

将SOQL迁移到循环之外可能有点棘手。例如,当插入一个新的联系人时,计算客户的联系人数量。在这种情况下,我们希望遍历所有联系人,获取每个联系人的Id,并将其放入集合中。然后,使用“AccountId IN :accountIds”在集合之外执行查询,并将结果放入一个映射中。最后,再次迭代联系人,并从地图中获取客户。

03

避免Hard-coded IDs

Hard-coded ID在开发时可能运行正常且不会发生意外,但是一旦我们将代码迁移到生产环境中,这些ID将不再引用正确的记录。对于在沙盒中创建然后迁移到生产环境中的记录类型尤其如此。

如果需要使用记录类型,可以通过DeveloperName引用它们,这将在不同环境中保持一致。如果使用的ID需要与特定记录相关,可以将此ID存储到自定义元数据中并在运行时检索该值。

04

每个SObject类型使用一个Trigger

当在单个对象上定义多个Trigger时,当保存记录并调用Trigger时,无法保证Trigger的运行顺序,它是随机的。Trigger中的单个操作通常具有优先级顺序,或者它可能有先决条件(例如,分配Parent Lookup,然后预期将在下一个操作中填充)。

具有随机触发顺序也会在代码中引入随机性,这种随机性将增大调试和开发代码的难度,因为总是有随机性元素并且不能准确地复制场景。

 

05

使用SOQL循环

将查询直接作为可迭代变量放在for循环中,而不是将查询结果分配给变量。这会导致查询执行方式发生一些变化,结果被更有效和透明地分块和处理,从而避免遇到限制。

值得注意的是,执行聚合查询时不适合SOQL for循环,这些查询不支持启用更有效分块的底层机制,如果结果返回超过2000行,则会引发异常。

06

测试多个场景

将Apex代码部署到生产环境中时,Salesforce要求至少有75%的代码覆盖率。

仅为实现代码覆盖率而编写的测试,除了在特定的场景中显示外,它实际上并没有提供任何价值。在编写测试时,应该关注覆盖代码的不同用例,确保覆盖了代码实际运行的场景。

其中一些可能正在测试相同的方法而不生成额外的覆盖行,每个测试方法都在不同的场景下运行代码。例如,这可能涵盖Trigger中的正测试用例和负测试用例。运行测试后,需要验证代码是否确实执行了预期的操作,如果没有,则手动使测试失败。

这种测试能提供更多的价值,并且可以作为管理员添加一些新功能或更改不同代码段时可能出现的问题的早期预警系统。

07

避免嵌套循环

嵌套循环有时无法避免。虽然嵌套循环不会遇到性能问题或Governor Limits,但会影响可维护性和可读性。

在代码块中添加循环,会增加认知复杂性,代码的理解难度增大。添加嵌套循环会增加这种认知复杂性,不同的开发人员很难直观地理解一段代码,需要更多的努力来调试或修改。

08

命名约定

如果开发团队中的每个成员都遵循命名约定,好处显而易见。因此需要在项目开始之前就确定好命名约定,这在开发、维护和协作的过程中,将大大提高团队工作效率。

09

避免Trigger中的业务逻辑

在编写Trigger时,如果将逻辑直接放在Trigger中,测试和维护就会变得非常困难。相反,应该使用Trigger来调用专门设计用于处理逻辑的类,然后轻松地测试、维护和重用这些类。通常将这些类称为 TriggerHandlers。这些TriggerHandler类接受来自Trigger的输入,最终调用保存编写的业务逻辑的特定类。

一个常见的陷阱是将所有逻辑和功能直接放入TriggerHandler或TriggerHelper类中,这会导致代码无法维护。单独的功能应该被分解成单独的类,由TriggerHandler调用。

对于具有比较简单Trigger的对象(例如仅调用单个操作),省略处理程序类并直接从Trigger内调用Trigger操作是有意义的。但是,在编写操作时应考虑到处理程序,并且应在Trigger的复杂性增加时立即迁移到处理程序。

10

避免将JSON返回到Lightning组件

当为Lightning组件编写@AuraEnable方法时,经常需要返回更复杂的数据结构,例如记录、自定义数据类型。

一种简单的方法是将这些对象序列化为JSON,然后在组件的JavaScript中反序列化它们。

这种方法实际上是一种反模式,可能会导致组件性能不佳。相反,应该直接返回这些对象,让平台处理剩下的事情。

将返回的数据转换为JSON会导致消耗大量内存并花费CPU周期将其转换为长的字符串。如果有一组相当复杂的处理正在进行,或者有大量记录要返回,这可能会遇到Governor Limits,或者组件性能变差。

当直接返回结果时,序列化为JSON由平台处理,超出了Governor Limits。结果也会自动转换回对象供组件使用,而无需执行更多JSON.parse() 操作。


标签:10,Salesforce,必看,记录,Apex,代码,查询,Trigger,循环
From: https://www.cnblogs.com/ziyouxia/p/16854678.html

相关文章

  • 安装Mariadb-10.6.10 需要升级CMake 3.0 以上版本
    下载wgethttps://cmake.org/files/v3.22/cmake-3.22.6.tar.gz安装tarzxvfcmake-3.22.6.tar.gzcdcmake-3.22.6./bootstrapgmakegmakeinstall注意安装完后......
  • Python实验报告——第10章 文件及目录操作
    实验报告【实验目的】 1.掌握Python自带的函数进行基本文件操作。2.掌握Python内置的os模块及其子模块os.path进行目录相关的操作。【实验条件】1.PC机或者远程编......
  • 1049 数列的片段和
    题目:1049数列的片段和 给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列{0.1,0.2,0.3,0.4},我们有(0.1)(0.1,0.2)(0.1,0.2,0.3)......
  • 10.内置函数
    截止到python3.9,一共有60多个内置函数,本篇对常用的函数进行分类罗列一下,对于文档请查看https://docs.python.org/zh-cn/3.9/library/functions.html1.数学运算abs(x):......
  • Codeforces Round #610 (Div. 2) C
    C.PetyaandExamhttps://codeforces.com/contest/1282/problem/C考虑贪心先对于时间排序然后贪心我们可以不考那我们可以在此之前离开然后在离开之前这段时间多做......
  • 推荐10本大数据领域必读的经典好书(火速收藏)
        写博客也已经快一年了,从去年的1024到现在金秋10月已纷至沓来。回顾这一年所发布的原创文章,基本都是与大数据主流或者周边的技术为主。本篇博客,就为大家介绍几篇......
  • 机器学习100天( 100-Days-Of-ML-Code )中文版
    机器学习AI算法工程 公众号: datayx完整版下载地址获取:关注微信公众号datayx 然后回复 100  即可获取。数据预处理|第1天数据预处理实现简单线性回归|第2天简单......
  • 免费服务器分享20221103
    今天再次安装了免费服务器,来和大家分享一下。三丰云是一个提供免费云服务器的服务商,包括"免费虚拟主机"、“免费云服务器”。挺良心的,只不过需要大家发圈,但是功能实在......
  • Android10 dex2oat实践
    最近看到一篇博客:Android性能优化之Android10+dex2oat实践,对这个优化很感兴趣,打算研究研究能否接入到项目中。不过该博客只讲述了思路,没有给完整源码。本项目参考该博......
  • JVM 常见线上问题 → CPU 100%、内存泄露 问题排查
    开心一刻明明是个小bug,但就是死活修不好,我特么心态崩了......前言Windows后文中用到了两个工具:​​ProcessorExplorer​​​、​​MAT​​,它们是什么,有什么用,怎么用,本......