Salesforce 面试

面试经验

​1. 什么是Apex?

Apex是一种强类型,面向对象(object-oriented)的编程语言,允许开发人员通过将自己的业务逻辑编写到平台中来扩展Salesforce平台。Apex看起来类似于Java,可以通过各种用户启动的事件启动,例如记录更新,按钮单击,对象触发器或外部Web服务请求等。

官方参考链接:

https://trailhead.salesforce.com/en/content/learn/modules/apex_database

2. 您可以直接在生产组织Production中自定义Apex和Visualforce吗?

Apex无法在生产组织中进行自定义,必须通过沙盒环境进行更改和部署并满足测试覆盖率。另一方面,Visualforce可以直接在生产中定制(这不是最佳实践 )

3. Apex触发器可运行的两个选项是什么?

Apex触发器可以在保存记录之前或者之后运行。之前的操作通常用于验证将要插入的信息。之后的触发器操作用于处理其他数据而不是当前数据,如访问系统设置的当前对象的字段值(例如记录)ID 或者LastModifiedDate字段),并影响其他记录的更改。

官方参考链接:

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers.htm

4. Apex何时应该用于Flow或Process Builder?

您应该使用Apex而不是声明性自动化选项有多种原因:

1)Flow和Process Builder操作有时会有一些功能限制,需要用到Apex。例如,从外部系统中提取信息或者与外部系统进行交互。

2) 在处理某些或大型数据集时,由于限制较少,Apex可以比声明性选项更有效。

5. Governor Limits是做什么的?

Salesforce在多multitenant环境中运行,这意味着Salesforce平台上的其他公司共享资源(存储,CPU,内存)。这也意味着必须有一定的限制以确保使用Salesforce体系结构的所有公司遵守某些规则,并且不要让他们的代码或流程独占共享资源。常见的Governor Limits限制的几个例子有如下一些:

1) SOQL查询检索的记录总数 - 50,000

2) 发出的SOQL查询总数(次数) - 100(同步)200(异步)

3) 发布的DML报表总数 - 150

4) 在一次transaction中可以用到的callouts次数(HTTP请求或Web服务调用) - 100

5) Salesforce服务器上的最大CPU运行时间 - 10,000毫秒(同步)60,000毫秒(异步)

官方参考链接:

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_gov_limits.htm

6. 知道如何进行Apex测试吗?

该类问题的常见问法是:Apex测试覆盖范围是什么?部署所需的最低测试覆盖率是多少?

为了确保您的代码符合一定的标准,Apex Code覆盖率显示了您的类和触发器中的代码可执行行数,同时需要成功执行。代码覆盖百分比是覆盖的代码行数除以覆盖代码行数和未覆盖代码行数之和。部署到生产所需的最低测试覆盖率为75%。

官方参考链接:

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_code_coverage_intro.htm

7. Apex 最佳实践例子和我们分享一下?

参见的最佳实践有这些:

  • 整理您的代码

  • 避免FOR循环中的SOQL查询或DML语句

  • 避免使用硬编码ID

官方参考链接:

https://developer.salesforce.com/page/Apex_Code_Best_Practices

8. 如下代码有什么问题?**需要怎么改?**

1
2
3
4
5
6
7
8
9
10
11
12
13
trigger accountTestTrggr on Account (before insert, before update) {
for(Account a: Trigger.new) {
List<Contact> contacts = [select id, salutation, firstname, lastname, email
from Contact where accountId = :a.Id];

for(Contact c: contacts) {
System.debug('Contact Id[' + c.Id + '], FirstName[' + c.firstname + '],
LastName[' + c.lastname +']');
c.Description=c.salutation + ' ' + c.firstName + ' ' + c.lastname;
update c;
}
}
}

主要问题是在for循环中使用了查询或DML语句。一次transaction可以执行最大SOQL查询次数是100,如果这操作放在for循环中时,每次迭代循环都会调用一次数据库操作,这使得很容易达到这些调控器限制。如果一批超过100个帐户记录调用此触发器,则调控器限制将引发运行时异常。

现在修改如下,把update的动作放到For循环外面,如果使用单个帐户记录或最多200个帐户记录调用此触发器,则只执行一个SOQL查询和一个更新语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
trigger accountTestTrggr on Account (before insert, before update) {
List<Account> accountsWithContacts = [select id, name, (select id, salutation, description,
firstname, lastname, email from Contacts)
from Account where Id IN :Trigger.newMap.keySet()];

List<Contact> contactsToUpdate = new List<Contact>{};
for(Account a: accountsWithContacts){
for(Contact c: a.Contacts){
System.debug('Contact Id[' + c.Id + '], FirstName[' + c.firstname + '], LastName[' + c.lastname +']');
c.Description=c.salutation + ' ' + c.firstName + ' ' + c.lastname;
contactsToUpdate.add(c);
}
}
update contactsToUpdate;
}

#9. Apex Email Service是什么?

您可以使用Apex Email Service来处理入站电子邮件的内容,标题和附件。例如,您可以创建一个电子邮件服务,该服务根据邮件中的联系信息自动创建联系人记录。
参考链接:

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_email_inbound_what_is.htm

#10. List, Set, Map在Apex中有什么区别?

List- 列表是按其索引区分的有序元素集合。列表元素可以是任何数据类型:基元类型,集合,对象,sObject,用户定义类型和内置Apex类型。
Set - 集合是不包含任何重复的元素的无序集合。集合元素可以是任何数据类型 - 基元类型,集合,sObject,用户定义类型和内置Apex类型。
Map - 地图是键值对的集合,其中每个唯一键映射到单个值。键和值可以是任何数据类型 - 基元类型,集合,sObject,用户定义类型和内置Apex类型。

参考链接:
https://www.salesforceben.com/30-salesforce-developer-interview-questions-answers/

#11.Custom labels是什么?有什么限制?

Custom Labels是可从 Apex 类或 Visualforce 页访问的自定义文本值。此处的值可以转换为 Salesforce 支持的任何语言。它们的好处是使开发人员能够创建多语言应用程序, 这些应用程序以用户的母语自动显示信息。最多可以为组织创建 5, 000个Custom Labels, 它们的长度最多可以为 1000个字符。

#12. 用Visualforce写一个分页的例子

#13. 如何在JavaScript调用controller的方法?

利用actionfunction。相关参考代码如下:

1
2
3
4
5
6
<script>
function JSmethodCallFromAnyAction()
{
callfromJS();
}
</apex:page>

#14. Get 和Set在Apex有什么用?

简单来说,Get方法用于将值从控制器传递到 VF 页。而Set方法用于将值设置回控制器变量中。

​在实际面试中会遇到不同的面试题目,以下列出了常见的面试题目供大家参考和学习。

#1. Role 和Profile有什么区别?

1) Profiles是可以,也是必须加到用户记录中,而Roles是可以选择性地加入到用户记录中。
2) Profile是可以控制用户CRED权限如(创建,读取,编辑,删除)。 它们还包含用户可以执行的系统权限,例如导出数据。
3) Roles在整个组织内共享记录。 它们以hierarchical方式工作,使用户可以访问在公司组织结构中较低层的人的记录,如你的经理可以查看你的记录。
官方参考链接:
https://help.salesforce.com/articleView?id=admin_userprofiles.htm&type=5

#2. 能否列出三种对象关系?

1)查找关系Lookup:可用于将两个对象链接在一起。它是在两个对象之间创建子父关系(child-parent)的最基本的关系类型。
2)主 - 细节关系 master-detail :也可用于将两个对象链接在一起。主 - 细节关系在父母和孩子之间建立紧密的关系。子记录继承父级的安全性,如果删除父级,则还将删除所有关联的子级记录。主 - 细节关系创建了一些额外的功能,例如汇总汇总字段( roll-up summary),其功能是允许在父项上计算子项的统计数据。
3)多对多关系many-to-many:(也称为联结对象junction)允许您在需要建模多对多关系的两个对象之间创建关系。主要表现为一个子对象具有两个父对象,且是基于主 - 细节关系建立的。

官方参考链接:

https://help.salesforce.com/articleView?id=overview_of_custom_object_relationships.htm&type=5

#3. SOQL是干嘛的?

SOQL代表Salesforce对象查询语言。它与广泛使用的语言SQL(结构化查询语言)非常相似,用于查询数据库。SOQL专为Salesforce数据设计,用于查询Salesforce平台以检索数据。SOQL在Apex和Visualforce中用于返回数据集。注意SQL英文为Structured Query Language。

官方参考链接:

https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql.htm

#4. Salesforce.com 和 Force.com有什么区别?

Salesforce.com是SaaS(软件即服务)产品,而Force.com是PaaS产品(平台即服务)。Salesforce.com提供一系列预先打包的解决方案,例如专为特定目的而设计的销售Sales Cloud和服务云 & Service Cloud。而Force.com允许您构建自己的应用程序。Salesforce.com建立在Force.com平台上。

#5.从沙盒环节部署到生产环境可以使用哪些选项?

有多种方法可以从Sandbox 部署到Production。主要方法是使用名为Change Sets的Salesforce功能。这些允许您打包组件,然后将它们部署到另一个Salesforce组织。还有其他各种方法,包括ANT MIgration Tool,SFDX, Unmanaged包,metaforce, DreamFactory等。

官方参考链接:
https://help.salesforce.com/articleView?id=deploy_overview.htm&type=5

#6. 听说过bucket字段吗?知道是干什么的吗?

可以在Salesforce报告中使用存储桶字段将字段值组合在一起。这些字段不是在Salesforce平台上创建的,只存在于报表本身中。
官方参考链接:
https://help.salesforce.com/articleView?id=reports_bucketing_overview.htm&type=5

#7. 解释Workflow和Process Builder之间的区别?

Workflow和Process Builder是自动化工具,可用于扩展Salesforce平台功能。两者都是通过点击页面实现创建Workflow和PB,并具有各种功能和特性来自动化业务流程。

Workflow - 一种自动化工具,可以评估参数,并启动自动化功能。这些功能可以包括字段更新,发送电子邮件,创建任务或发送出站邮件。

Process Builder - 流程构建器是一种更新的自动化工具,具有更广泛的功能。这些包括创建记录,更新子记录,发布到聊天,启动Flow等。简单来说,流程构建器可以评估多个条件,并根据满足的条件触发不同的自动化。
官方参考链接:

https://help.salesforce.com/articleView?id=process_overview.htm&type=5

#8. Sharing Rules一般是怎么使用的?

Sharing Rules的设置是用于拓展现有的共享设置。并根据定义的标准授予用户对一组记录的访问权限。可以基于记录的所有者或字段值分享给不同的profile,role或公共组。
官方参考链接:

https://help.salesforce.com/articleView?id=security_about_sharing_rules.htm&type=5

#9. 解释汇总字段的使用以及可以使用的地方

汇总字段可用于根据父记录子记录计算信息。虽然公式字段可以计算单个记录中的信息,但汇总汇总字段可以计算一组子记录中的数据。
例如,汇总字段可用于计算帐户上所有close won机会的总价值。汇总字段只能用于主 - 详细信息关系。

#10.记录类型Record Type和页面布局之间有什么关系Page Layouts

页面布局用于定义向用户显示哪些字段,部分和相关列表。页面布局控制对象记录页面上按钮,字段,s控件,Visualforce,自定义链接和相关列表的布局和组织。它们还有助于确定哪些字段是可见的,只读的和必需的。使用页面布局为用户自定义记录页面的内容。

可以参考官方参考链接:
https://help.salesforce.com/articleView?id=customize_layout.htm&type=0

记录类型Record Type可以通过定义不同的业务流程来扩展它。管理员可以创建不同的记录类型Record Type,以区分销售交易类别,为每个交易提供不同的选项列表值。

可以参考官方参考链接:
https://help.salesforce.com/articleView?id=customize_recordtype.htm&type=0

页面布局可以用于控制在记录上向用户显示哪些数据。如上所述,管理员可以更改页面中的任何元素,删除字段,部分,链接和自定义Visualforce代码等一系列模块。您可以将页面布局应用于不同的用户组(销售,支持,财务,管理),仅显示与该组用户相关的数据。而且,管理员还可以将页面布局应用于记录类型。

使用页面布局时需要注意的一件重要事项是,每个记录类型Record Type所对应的页面布局只能应用一个组用户的Profile。例如,如果您在帐户上有一种记录类型Record Type,则每个Profile只能应用一种页面布局。