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

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

本篇文章将为学习者介绍在编写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.niftyadmin.cn/n/362450.html

相关文章

淘宝图片搜索接口API封装

本篇博文介绍了对淘宝图片搜索API的二次封装&#xff0c;将URL参数封装成Python函数&#xff0c;直接传入参数即可获取搜索结果&#xff0c;例如淘宝商品标题、价格、销量和URL等。提供了详细的代码示例和接口调用Demo。 taobao.item_search_img-按图搜索淘宝商品&#xff08;拍…

一分钟图情论文:《图书馆评估研究进展综述》

一分钟图情论文&#xff1a;《图书馆评估研究进展综述》 随着公共文化服务体系的不断完善和发展&#xff0c;我们如何判断一家图书馆的服务内容和服务质量水平的高低&#xff1f;如何利用我们设定的指标有效地促进各级、各类型图书馆的服务内容和服务质量不断深化&#xff1f;…

重塑DeFi:深入了解Solaris Network

Solaris Network已经在充满活力的去中心化金融&#xff08;DeFi&#xff09;领域崭露头角&#xff0c;成为一家颠覆性的平台&#xff0c;使用户能够创造和交易合成资产。凭借其致力于多链集成、创新功能和以社区为中心的方法&#xff0c;Solaris Network正在改变DeFi的格局&…

RL Note 1, Basic Concepts in Reinforcement Learning

Basic Concepts in Reinforcement Learning A grid-world example 在该图中&#xff1a; 格子被分为三类&#xff1a;可访问的格子、禁止访问的格子、目标格子角色被称为 agentagent 的任务就是从 start 开始找到一条“正确”的路径到达 targetagent 无法越过边界&#xff0c…

Mybatis之MetaObject

在mybatis中&#xff0c;ResultSetHandler在收集JDBC返回的结果后需要转换成对应的Bean对象&#xff0c;其实映射的原理基本大家都能想到使用的时候java中的反射机制&#xff0c;但是在Mybatis中&#xff0c;提供了一个更加强大的对象&#xff0c;就是MetaObject&#xff0c;使…

一文get关于BSCI的新知识

【一文get关于BSCI的新知识】 Q:amfori是什么? A:作为全球领先的贸易协会&#xff0c;amfori致力于开放和可持续贸易。他们汇集了来自40多个国家的零售商、进口商、品牌和协会&#xff0c;目的是系统地监督和改善世界各地的供应商的工作条件。“amfori BSCI”和“amfori BEPI”…

事件驱动模型IO模型

什么是事件驱动模型&#xff1f; 事件驱动模型是一种计算机编程模型&#xff0c;它通过等待事件的触发&#xff0c;在事件被触发时执行对应的处理函数。这种模型下&#xff0c;程序不再按照严格的顺序执行命令&#xff0c;而是以事件为驱动进行执行。事件驱动模型更适合处理大…

Docker实战1-运行前端Vue项目

本次运行了两个项目&#xff0c;一个是开源的镜像&#xff0c;一个是自己的前端项目镜像 1 在docker中运行 keycloak docker run -p 8080:8080 -e KEYCLOAK_ADMINadmin -e KEYCLOAK_ADMIN_PASSWORDadmin quay.io/keycloak/keycloak:21.1.1 start-dev 这个最简单了&#xff0c…