通常,编写代码是扩展任何软件,产品或平台的重要组成部分。但是,涉及Salesforce项目时,不一定需要编码。
这是可能的,因为Salesforce提供了一个全面的工具箱,包括拖放工具,用于构建数据库,标准用户界面(UIS)以编辑与点击工具,以及具有高级自动化功能的工作流引擎。
通过粘贴到这些工具,可以在Salesforce生态系统内创建高级和定制的业务解决方案,而无需写一行代码。
这种开箱即用的工具包将为某些人员工作,而对于其他工具,可能需要一个Salesforce应用程序专家来让您到终点线。
这是当编码发挥作用时,当您必须雇用开发人员来帮助您时。

通过Salesforce,这个开箱即用的工具包将为某些人工作,而对于其他人可能需要专家来让您到终点线。
如果您确实需要专家级Salesforce开发人员,您应该寻求一个不仅能用SQL和Salesforce的拖放工具流利的人,而是一个经过认证的开发人员,也知道Apex和Soql,Salesforce的自定义查询和编程语言。您也可以在Salesforce Lightning中寻找有经验的人。
大多数人不会知道要问的正确问题,这就是我们将本指南放在一起的原因。在其中,您会发现我们的顶级Salesforce开发者面试问题和答案。
问题和解答
问:将Apex中的可用集合类型命名。讨论他们的极限和特征。
在Salesforce中,APEX支持三种不同的集合类型:列表,映射和集。
清单 订购由他们的指数区分的元素集合。应使用其索引识别元素时使用列表。值得注意的是,列表可以包含重复项。
地图 是键值对的集合,其中每个唯一键映射到单个值。密钥可以是任何原始数据类型,并且值可以是一个原始的,sobject,collection类型或apex对象。
套 是不包含任何重复项的无序元素集合(与上述列表相比)。
您应该使用哪种类型?这取决于您尝试实现的内容和上述每个收集类型的特征。
它也值得一提的是,从集合中删除项目比从列表中删除项目更直接。从列表中删除项目时,索引将左转。
虽然基于堆大小存在隐式限制,但集合可以保持的项目数量没有固有的限制。
由于环境的多租户性质,Salesforce保持了一个 桌子 全部限制。 Salesforce偶尔会修改这些限制并调整执行功能。
问:讨论Apex中的交易控制限制。
销售队伍是一个多租户环境,基本上意味着所有资源都在其用户之间共享。为了维护系统性能和可用性,该平台强制执行流程限制。
所有Salesforce开发人员必须知道这些限制,因为它们会影响解决方案的设计方式和编码。
这是交易控制的最相关的局限性。
- 回滚期间不会恢复静态变量。
- 在回滚后未清除设置保存点后的SOBJECT上的ID。
- 您设置的每个回滚或保存点,都针对DML语句的调速器限制计数。
- 对保存点的引用不能跨触发调用,因为每个触发器调用是一个新的触发上下文。
- 如果设置了多个保存点,则重新回滚不是您生成的最后一个保存点的保存点,稍后的保存点变量变为无效。
问:同步APEX请求的时间限制是多少?讨论可用于避免击中极限的策略。
运行超过五秒钟的同步APEX请求被认为是长时间运行的。为避免达到此限制,建议使用以下任何策略。
- 调整SOQL和DML操作,确保查询是选择性的。
- 检查批处理Apex是否是将同步进程转换为异步进程的可能选择。
- 尝试限制对同步Web服务的调用。
这些是标准解决方案Salesforce开发人员知道在达到限制时要注意。
限制是Salesforce开发的核心,并且每个开发人员都应该了解它们。
当您收到提到限制的错误时,您应该调整代码以优化,或将您的解决方案置于销售范围内的块中。
问:Apex中全球和公共类之间的主要区别是什么?用例子解释。
全球课程 可见 任何 应用程序或命名空间,同时 公共课程 只能在内心看到 一个特定的 应用程序或命名空间。
所有课程使用 民众 访问修饰符将仅在您自己的应用程序或命名空间中访问。
民众 class MyClass {
// Methods accessible only within your application
}
使用课程 全球的 Access修饰符可通过AppEx访问。一个例子是允许外部应用程序调用Apex Web服务以在Salesforce中执行操作的类。
全球的 class MyWebService {
// Methods accessible by Apex everywhere, e.g.: the SOAP API
}
问:解释如何编写Apex类,该类将考虑当前用户的共享规则。用例子解释。
默认情况下,APEX代码在系统上下文中运行,可以访问所有对象和字段对象权限。
If you need to write a class that will take the current user sharing rules into consideration, you need to declare it with the with sharing
keywords.
此类将在系统上下文中的访问权限中执行,可以访问 全部 objects and fields.
民众 without sharing class MyNoSharingRuleClass {
// Code here will NOT enforce the current user sharing rules
}
此类将强制执行当前用户的共享规则。
民众 with sharing class MySharingRuleClass {
// Code here WILL enforce the current user sharing rules
}
宣布课程时 没有 这些访问修饰符,使用当前共享规则。
默认情况下,除了从调用类中获取共享规则,该类将无法强制执行共享规则。
问:解释Apex单元测试是什么。讨论APEX代码的部署要求。提供一个例子。
销售队伍 CRM平台使用Apex单元测试,这是检查一段代码是否正常工作的类方法。请注意,单元测试方法不占用,不会向数据库提交数据,并发送电子邮件。
Test methods must be defined in test classes that are annotated with @IsTest
.
要部署APEX代码,Salesforce要求满足以下所有标准。
- 单元测试至少有75%的APEX代码,以及 全部 这些测试必须成功完成。
- 每个触发器都必须有一些测试覆盖范围。
- 所有类和触发器必须成功编译。
这是测试类的基本结构的示例。
@isTest
private class MyCustomObjectTestClass {
static testMethod void runPositiveTestCases() {
// Run your positive tests here
System.debug('Positive validation test...');
}
static testMethod void runNegativeTestCases() {
// Run your negative tests here
System.debug('Negative validation test...');
}
}
问:解释如何使用SOQL语句访问存档和已删除的记录?
在Salesforce中,实际上不会删除删除的记录。相反,它被移动到回收站。
每个Salesforce用户都可以访问回收站,这在概念上类似于Windows或MacOS中的回收站。归档也是如此。
Therefore, if a developer building a query wants to include the deleted and archived records in its result set, [s]he can use the ALL ROWS
keywords in the SOQL statement.
这是一个例子。
SELECT COUNT() FROM Contact WHERE AccountId = a.Id ALL ROWS
问:解释如何保证进程可以更新记录,而无需其他进程或用户同时更新相同的记录。
SOQL supports the FOR UPDATE
keywords.
当包含在SOQL语句中时,保证没有其他进程或用户可以同时更新记录。交易处理完成记录后,锁定锁定。
问:考虑以下代码片段:
List<Opportunity> opportunityList = [SELECT Id, Name, StageName FROM Opportunity WHERE StageName = 'Qualification'];
解释什么,如果有的话,它是错误的吗?
The preceding code fetches all the opportunities in the Qualification
stage. While the code snippet is correct, we are using the string literal directly, without a constant or a configuration.
这种编码实践可能成为问题的源泉,因为可能存在相同方法的其他类。
For example, if we assume that we want to change the stage name from Qualification
to Pending Review
, this would take a certain amount of work to perform an impact analysis and incorporate the changes in the code.
这种情况可以通过常量或配置方法避免,我们的查询将如此看,假设我们创建了一个常量。
民众 static final String STAGE_NAME = 'Qualification';
最终查询将是:
List<Opportunity> opportunityList = [SELECT Id, Name, StageName FROM Opportunity WHERE StageName = STAGE_NAME];
问:考虑以下代码片段:
全球的 class FutureRecordProcessing
{
@future
public static void processRecords(List<MyObject__c> myObjectList)
{
// Process records
}
}
为什么此代码生成编译错误?
In Apex, @future
annotated methods cannot get sObjects as arguments, because the sObject might change between the time you call the method and the time it actually executes. In this particular scenario, a list of sObjects IDs should be used instead to perform a query for the most up-to-date records.
以下是未来方法从ID列表正确查询对象的示例:
全球的 class FutureRecordProcessing
{
@future
public static void processRecords(List<ID> recordIds)
{
// Query records
List<MyObject__c> myObjects = [SELECT Name FROM MyObject__c WHERE Id IN :recordIds];
// Process records
}
}
花点时间找到顶级Salesforce开发人员。
我们本文所涵盖的问题应该是任何有足够经验丰富的Salesforce开发人员的蛋糕;因此,应该帮助您区分Wannabe Salesforce专家,该专家主要使用拖放工具,从顶级开发人员流利地播放SOQL和Apex。
花点时间找到最好的全职或兼职候选人,这是值得努力的努力,因为他们无疑会对你的团队的生产力和底线产生重大影响。