一般来说,编写代码是扩展任何软件、产品或平台的必要部分. 但是当涉及到Salesforce项目时,就不一定需要编码了.
这是可能的,因为Salesforce提供了一个全面的工具箱, 包括拖放工具来构建数据库, 使用点击工具编辑的标准用户界面, 以及具有高级自动化功能的工作流引擎.
只使用这些工具, 无需编写一行代码,就可以在Salesforce生态系统中创建高级定制业务解决方案.
这个开箱即用的工具包将适用于一些人, 对其他人来说, 可能需要Salesforce应用程序专家来帮助您完成任务.
这时候就需要编码,这时候你就需要雇佣一名开发人员来帮助你.
与销售团队, 这个开箱即用的工具包将适用于一些人, 而对于其他人来说,可能需要一个专家来帮助你到达终点线.
如果你确实需要一个专家级的Salesforce开发人员, 你应该找一个不仅精通SQL和Salesforce拖放工具的人, 而是一个认证的开发人员,他也知道Apex和SOQL, Salesforce的自定义查询和编程语言. 你也可以找一个有Salesforce闪电经验的人.
大多数人都不知道该问什么问题,这就是为什么我们把这个指南放在一起. 在其中,您将找到我们的顶级Salesforce开发人员面试问题和答案.
问题与答案
问:在Apex中命名可用的集合类型. 讨论它们的局限性和特点.
在Salesforce中,Apex支持三种不同的集合类型:列表、映射和集合.
Lists 元素的有序集合是由它们的索引来区分的吗. 当您希望通过索引来标识一个元素时,应该使用列表. 同样重要的是要注意,列表可以包含重复项.
Maps 是键值对的集合,其中每个唯一的键映射到单个值. 键可以是任何基本数据类型, value可以是一个原语, sObject, 集合类型, 或Apex对象.
Sets 是不包含任何重复元素的无序集合(与列表相反), 如上所述).
您应该使用哪种类型? 这取决于您要完成的任务以及上面描述的每种集合类型的特征.
值得一提的是,从集合中删除项比从列表中删除项更直接. 当从列表中删除一个项时,索引将向左移动.
集合可以容纳的项数没有固有限制, 尽管存在基于堆大小的隐式限制.
由于环境的多租户特性,Salesforce维护了一个 table 所有的限制. Salesforce偶尔会修改这些限制并调整执行能力.
问:讨论Apex中的交易控制限制.
Salesforce是一个多租户环境, 这实际上意味着所有的资源都在用户之间共享. 为了维护系统性能和可用性,平台强制执行流程限制.
所有Salesforce开发人员都必须了解这些限制,因为它们会影响解决方案的设计和编码方式.
以下是与事务控制最相关的限制.
在回滚期间不会回滚静态变量.
设置保存点后插入的对象的ID在回滚后不会被清除.
您设置的每个RollBack或SavePoint都将计入DML语句的调控器限制.
对savepoint的引用不能交叉触发器调用,因为每个触发器调用都是一个新的触发器上下文.
如果您设置了多个保存点, 然后回滚到不是您生成的最后一个SavePoint的保存点, 之后的SavePoint变量无效.
问:同步Apex请求的时间限制是什么? 讨论可以用来避免达到极限的策略.
运行超过5秒的同步Apex请求被认为是长时间运行的. 为了避免达到这个限制,建议使用以下任何一种策略.
调优SOQL和DML操作,确保查询是可选择的.
检查Batch Apex是否是将同步流程转换为异步流程的可能替代方案.
尽量限制对同步web服务的调用.
这些都是Salesforce开发人员在达到极限时需要注意的标准解决方案.
限制是Salesforce开发的核心,每个开发人员都应该了解它们.
当你提到极限时出现错误, 您应该调整代码以进行优化, 或者将您的解决方案分解为多个块,这些块将保持在Salesforce强制限制内.
问:Apex中全局类和公共类的主要区别是什么? 举例说明.
全球类 是可见的 any 应用程序或名称空间,而 公共类 只在内部可见 a specific 应用程序或名称空间.
所有使用 public 访问修饰符只能在您自己的应用程序或名称空间中访问.
公共类MyClass {
//只能在应用程序中访问的方法
}
类使用 global Apex在任何地方都可以访问访问修饰符. 一个示例是允许外部应用程序调用Apex Web服务以在Salesforce中执行操作的类.
全局类MyWebService {
// Apex随处可访问的方法.g.: SOAP API
}
问:解释如何编写一个Apex类,它将考虑当前用户的共享规则. 举例说明.
By default, Apex代码在系统上下文中运行, 具有访问所有对象和字段的对象权限.
如果您需要编写一个类,将考虑当前的用户共享规则, 你需要用 with sharing
keywords.
这个类将在系统上下文中通过访问来执行 all 对象和字段.
MyNoSharingRuleClass {
//这里的代码不会强制执行当前的用户共享规则
}
这个类将执行当前用户的共享规则.
共享类MySharingRuleClass {
//这里的代码将强制执行当前用户共享规则
}
在声明类时 without 这些访问修饰符,是当前使用的共享规则.
By default, 除非共享规则是从调用类获得的,否则类不会强制执行共享规则.
问:解释什么是顶级单元测试. 讨论Apex代码的部署需求. 提供一个示例.
Salesforce CRM平台使用Apex单元测试, 哪些类方法检查一段代码是否正常工作. 注意,单元测试方法不接受参数, 不向数据库提交数据, 不要发邮件.
测试方法必须在带有注释的测试类中定义 @IsTest
.
要部署Apex代码,Salesforce需要满足以下所有条件.
至少75%的Apex代码必须被单元测试覆盖,并且 all 这些测试必须成功完成.
每个触发器都必须有一定的测试覆盖率.
所有类和触发器必须成功编译.
下面是一个测试类基本结构的示例.
@isTest
私有类MyCustomObjectTestClass {
静态测试方法无效runPositiveTestCases() {
//在这里进行阳性测试
System.正验证测试...');
}
runNegativeTestCases() {
//在这里运行你的阴性测试
System.负验证测试...');
}
}
问:说明如何使用SOQL语句访问归档和删除的记录?
在Salesforce中,被删除的记录实际上并没有被删除. 相反,它被移动到回收站.
每个Salesforce用户都可以访问回收站, 它在概念上类似于Windows或macOS中的回收站. 存档也是如此.
Therefore, 如果构建查询的开发人员希望在其结果集中包含已删除和存档的记录, [5]他可以使用 ALL ROWS
SOQL语句中的关键字.
这里有一个例子.
SELECT COUNT() FROM Contact WHERE AccountId = a.Id ALL ROWS
问:解释如何确保流程能够更新记录, 没有其他进程或用户同时更新相同记录的风险.
SOQL支持 FOR UPDATE
keywords.
当包含在SOQL语句中时, 它们保证没有其他进程或用户能够并发地更新记录. 在处理记录的事务完成后,锁被释放.
问:考虑下面的代码片段:
List opportunityList = [SELECT Id, Name, FROM Opportunity WHERE StageName = 'Qualification'];
解释一下,如果有什么问题的话?
中的所有机会 Qualification
stage. 而代码片段是正确的, 我们直接使用字符串字面值, 没有常数或构型.
这种编码实践可能成为问题的根源,因为可能有其他类使用相同的方法.
例如,如果我们假设我们想要从 Qualification
to 等待审核
, 这将需要一定的工作量来执行影响分析并将更改合并到代码中.
使用常量或配置方法可以避免这种情况, 我们的查询是这样的, 假设我们创建了一个常数.
public static final String STAGE_NAME = 'Qualification';
最后的查询将是:
List opportunityList = [SELECT Id, Name, FROM Opportunity WHERE StageName = STAGE_NAME];
问:考虑下面的代码片段:
全局类FutureRecordProcessing
{
@future
public static void processRecords(List myObjectList)
{
//处理记录
}
}
为什么这段代码会产生编译错误?
In Apex, @future
带注释的方法不能将对象作为参数, 因为在你调用方法和它实际执行的时间之间,sObject可能会改变. 在这个特殊的场景中, 应该使用对象id列表来执行查询最新记录的操作.
下面是一个future方法的例子,它正确地从id列表中查询对象:
全局类FutureRecordProcessing
{
@future
public static void processRecords(List recordIds)
{
//查询记录
List myObjects = [SELECT Name FROM MyObject__c WHERE Id IN :recordIds];
//处理记录
}
}
花点时间去找一个顶尖的Salesforce开发人员吧.
The questions we covered in this article should be a piece of cake for any sufficiently experienced Salesforce developer; and therefore, 如何帮助你区分一个想成为Salesforce专家的人, 哪些人主要只使用拖放工具, 来自顶级开发人员, 谁精通SOQL和Apex.
花时间去寻找最好的全职或兼职候选人是非常值得的, 因为它们无疑会对团队的生产力和底线产生重大影响.