如何避免Salesforce Apex代码中5个常见错误,提升开发技巧?

news2024/11/25 5:02:10

编码是一门需要严谨和谨慎的技术,即使是有经验的开发人员也会犯错。一些最常见的编程错误,可能会导致严重的后果。因此,作为一名开发人员,了解并避免这些错误是非常重要的。

本篇文章将为学习者介绍在编写Apex代码时一定要规避的5个错误。

易错点1

缺乏学习编程语言的能力

学习编码时,通过使用可用资源并进行大量练习,确保了解其所有功能和局限性。在掌握了变量、运算符、if语句、循环、集合和函数之后,需要花费更多时间学习面向对象编程。

例如,最近一位客户问我为什么他们的Apex代码会遇到Apex CPU超时限制错误。检查代码后发现,罪魁祸首是在两个不同的SOQL查询中分别查询后,它将子记录与其父记录进行了匹配。开发人员应该使用带有子记录的单个SOQL查询来获取所有信息。

以下是它的示例:

List<Account> accounts =

[SELECT Id,

Name

FROM Account

// Criteria Here];

List<Contacts> contacts =

[SELECT Id,

Name,

AccountId

FROM Contact]

for (Account acct : accounts) {

for (Contact con : contacts) {

if (con.AccountId == acct.Id) {

// Do stuff

}

}

}

此代码位于Batchable Apex中,因此它已经具有更高的60秒Apex CPU限制。

但是,这段代码效率很低。对于每个客户,它会遍历所有联系人以找到特定于该客户的联系人,然后对其进行处理。假如有500个客户和1,000个联系人,那就是500,000次迭代,这是非常不必要的。

最开始编写的开发人员不知道SOQL查询中的子选择,它允许获取与每个父记录相关的子记录。

更高效的代码如下:

List<Account> accounts =

[SELECT Id,

Name,

(SELECT Id,

Name

FROM Contacts)

FROM Account

// Where Clause Here for Desired Accounts];

for (Account acct : accounts) {

for (Contact acctContact : acct.Contacts) {

// Do something with each account’s contact as needed

}

}

现在,这段代码效率更高,并且只遍历返回的每个客户的联系人。

易错点2

复制粘贴代码

由于需要长期维护,复制粘贴代码是不良的编码习惯。如果重复复制相同的代码进行更改,则必须在所有地方应用该更改。

一种解决方案是使用函数。开发人员可以在整个类或代码库中使用函数,具体取决于其访问级别。

易错点3

编写长函数

当一个函数很长时,比如超过50行代码,不仅会导致代码更难理解,而且容易出现错误。

一种解决方案是编写使用辅助函数的较短函数。主函数使用多个较短的函数,而不是一个长函数,尽量将函数保持在20-30行Apex代码。

易错点4

代码嵌套太深

嵌套太深的代码也更难推理,更容易出错。

public List<Account> getAccountsWithCountry(List<Account> accounts) {

List<Accounts> accountsWithCountry = new List<Account>();

if (accounts != null) {

for (Account acct : accounts) { // First Level Of Nesting

if (String.isNotBlank(acct.BillingCountry)) { // Second Level of Nesting

accountsWithCountry.add(acct); // Third-Level of Nesting

}

}

}

return accountsWithCountry;

}

此代码示例是一个公共函数,它有三层嵌套:

1. “for-each”循环遍历Account。

2. “if”语句。

3. 将Account添加到“accountsWithCountry”的代码。

这段代码并不是最佳的,代码的嵌套级别最好不超过两层。开发人员在编码时可以反向思考。不要只在Account为空时才继续,先检查它是否为空,如果为空就停止。例如:

public List<Account> getAccountsWithCountry(List<Account> accounts) {

List<Accounts> accountsWithCountry = new List<Account>();

if (accounts == null) {

return accountsWithCountry;

}

for (Account acct : accounts) {

if (String.isNotBlank(acct.BillingCountry)) {

accountsWithCountry.add(acct);

}

}

return accountsWithCountry;

}

这段代码可以实现同样的目标,但只有两层嵌套。此外,如果进入for-each循环,Account列表不为空,并且可以安全地遍历它。

易错点5

格式错误

开发人员应该编写格式良好的代码,使代码更容易阅读和理解。格式错误的代码通常没有空格和缩进。

public class MyBadFormatClass {

public String FirstName=''; public Integer Age=0; public String LastName='';

public String getName() { return FirstName + ' ' + LastName; }

}

这个类可以编译,但难以阅读和理解。第二行声明了三个变量,第三行是一个函数。以下是重新格式化后的编码,更易于理解。

public class MyBadFormatClass {

public String FirstName = '';

public Integer Age = 0;

public String LastName = '';

public String getName() {

return FirstName + ' ' + LastName;

}

}

作者:自由侠部落

🔥🔥Salesforce学习资料、高薪岗位、考证攻略,$40考试优惠券

本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接

如果文章的内容对你有帮助,欢迎点赞~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/571394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java核心锁基准测试

测试模型 基于JMH基准测试库 测试代码 package com.lsy.study.benchmark;import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.results.format.ResultFormatType; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.options.Options; import…

《人工智能算法案例大全:基于Python》——实践AI算法,驭智创新之路

导语 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;AI算法成为推动智能化进程的核心要素。而在这个领域中&#xff0c;一本名为《人工智能算法案例大全&#xff1a;基于Python》的书籍引起了广泛关注。本文将深入探讨这本书所呈现的丰富案例&#xff0c;…

Linux——网络套接字2|Tcp服务器编写

本篇博客先看后面的代码,再回来看上面这些内容。 .hpp文件,基本调用 服务器基本框架

Ubuntu下Docker部署Gitlab CI

1. ubuntu gitlab安装步骤 1.1 更新系统软件包列表&#xff1a; sudo apt update1.2 安装必要的依赖项&#xff1a; sudo apt install curl openssh-server ca-certificates tzdata perl1.3 下载并安装 GitLab 包&#xff1a; curl -LO https://packages.gitlab.com/instal…

Springboot2.5.x版本之自动创建(H2/DERBY/HSQL)数据源源码分析-yellowcong

场景&#xff1a;当我们没有配置mysql&#xff0c;postgresql等数据源的时候&#xff0c;pom.xml里面引入了H2/DERBY/HSQL jar包&#xff0c;也没有配置连接&#xff0c;却有数据源创建的情况。 springboot启动的第一步 1.DataSourceAutoConfiguration 配置类启动 2.DataSource…

DolphinScheduler远程启动任务

我本地有JAVA程序&#xff0c;需要调用DolphinScheduler的接口启动任务&#xff0c;动态去调用 1、DolphinScheduler的内容逻辑关系 先明确DolphinScheduler内部任务的逻辑关系 项目 |——工作流 |——任务&#xff08;节点&#xff09; 我起的是工作流&#xff0c;一个任务完…

Transformer仅有自注意力还不够?微软联合巴斯大学提出频域混合注意力SpectFormer

本文介绍一篇来自英国巴斯大学&#xff08;University of Bath&#xff09;与微软合作完成的工作&#xff0c;研究者从频率域角度入手探究视觉Transformer结构中的频域注意力和多头注意力在视觉任务中各自扮演的作用。 论文链接&#xff1a; https://arxiv.org/abs/2304.06446 …

为什么都说测试岗是巨坑,趁早跳出去?10年测试人告诉你千万别上当了...

每次都有人问我软件测试的前景是什么样的&#xff0c;每年也会有人很多人纷纷涌入测试的岗位上&#xff0c;希望自己能够进入阿里、华为等大厂。 但是测试岗位真的那么吃香吗&#xff1f;今天我结合从零基础小白到测试开发的成长经历&#xff0c;来说下这个行业的发展前景&…

vmware安装debian 11.7.0 配置LVM

vmware安装debian 11.7.0 配置LVM 1、下载镜像2、创建并安装debian 11虚拟机2.1、选择 Graphical install2.2、选择安装过程显示语言和系统语言2.3、选择地区2.4、键盘映射2.5、设置主机名-debian2.6、设置网络-直接跳过2.7、设置root密码2.8、创建普通账户2.9、为普通账户设置…

【论文阅读】Modeling of Bitcoin’s Blockchain Delivery Network

文章目录 摘要一、引言二、相关工作A. BTC 网络的测量报告B. 业务概况对 BTC 网络的影响C. 数据分布算法 三、节点连接性、RTT 和块大小A. 建模节点连接B. 建模往返时间 (RTT)C. 建模区块和交易传输时间 四、数据分发和传播五、交易费率和块费率六、分布式网络的排队模型A. 区块…

C++ 中 switch 的性能优化

问题 有这样一段代码&#xff0c;编译器会傻傻地做多次 compare 来找到对应分支吗&#xff1f; #include <stdio.h> #include <stdlib.h> int func(int i) {return (long)(&i) i rand(); }int test(int flag) {int i 0;switch (flag) {case 0:i func(i);…

软件设计师 试题六零基础做题方法分解

接口要实现implements&#xff0c;父类要继承extends 做题技巧&#xff1a;如果在接口下的代码可以不写public 接口后面有个代码&#xff0c;在下面代码中一定有implements对他实现&#xff0c;接口下面是抽象方法也就是函数的实现&#xff0c;具体的实现再类中&#xff0c; 就…

Spring的Bean的生命周期

Spring的Bean的生命周期 Spring的Bean的生命周期 Spring的Bean的生命周期 Spring的Bean的生命周期包括以下阶段&#xff1a; &#xff08;1&#xff09;实例化Instantiation&#xff08;2&#xff09;填充属性Populate properties&#xff08;3&#xff09;处理Aware接口的回调…

华为OD机试真题 Java 实现【查找充电设备组合】【2023Q1 100分】

一、题目描述 某个充电站&#xff0c;可提供n个充电设备&#xff0c;每个充电设备均有对应的输出功率。任意个充电设备组合的输出功率总和&#xff0c;均构成功率集合P的1个元素。功率集合P的最优元素&#xff0c;表示最接近充电站最大输出功率p_max的元素。 二、输入描述 输…

( 链表) 203. 移除链表元素 ——【Leetcode每日一题】

❓203. 移除链表元素 难度&#xff1a;简单 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1…

探秘 | 如何分辨内网和外网?

目录 &#x1f4a1; 什么是外网IP、内网IP&#xff1f; &#x1f4a1; 对于自有路由器上网的用户&#xff0c;可以这样理解外网IP、内网IP &#x1f4a1; 几个大家经常会问的问题 什么是外网IP、内网IP&#xff1f;很多用户都有一个疑惑&#xff0c;如果不使用路由器拨号上网…

一则历史:为什么网络路径前加一个盘符还能正常工作

有一个比较知名的奇异特性&#xff1a;文件系统在解析 UNC(Universal Naming Convention) 路径时&#xff0c;会故意忽略掉最前面添加的盘符字母。 举个例子&#xff0c;假设服务器上有一个共享文件夹&#xff0c;其路径为&#xff1a;\\server\share\directory&#xff0c;如果…

【网络】HTTP

在上面的文章中&#xff0c;我们学习了网络的基础&#xff0c;和网络中一个伟大的标准 OSI 7层模型。通过上篇文章&#xff0c;我们可以知道网络模型最上层为应用层&#xff0c;那么这篇文章就让我们来一起看一下&#xff0c;我们开发过程中绕不开的一个非常著名的应用层协议&a…

FANUC机器人CC-Link总线通信相关配置的具体方法和步骤详解

FANUC机器人CC-Link总线通信相关配置的具体方法和步骤详解 1. 基本说明 2. 采用CC-Link通信的前提条件 机器人需要安装软件:CC-link Interface(Slave) A05B-*-J786 机器人需要安装硬件通信板卡:CC-Link Remote Device Station PCB A05B- * -J110 通信板卡的安装步骤:

第八章 模块

内容框架 8.1 模块介绍 引入模块 import 模块名 通过一句话&#xff0c;计算机就在指定的位置找到了模块文件&#xff0c;并准备好该文件拥有之后会用到的函数和属性。 引入模块本质上就是在一个python文件中引入另一个python文件 引入模块在文档中还可以设置别名&#xff1a;…