一、认识 Apex 编程
本单元学习目标:理解编程语言是什么以及它们为什么重要;了解 Apex 是什么,以及可以用它编写什么。
Apex 是 Salesforce 平台上的编程语言。它专为 Salesforce 平台而设计:托管运行、多租户感知、与数据库深度集成。如果你熟悉 Java 或 C#,Apex 的语法会让你感到亲切;关键区别在于平台特有的部分——调控器限制(governor limits)、内置的 sObject 类型,以及直接的数据库集成。学习 Apex,就是学习如何告诉 Salesforce 到底要做什么、何时做、以及怎么做。
什么是编程语言,为什么它们很重要?
如果你见过或用过代码,那它大概不是一堆 0 和 1。在现代编程中,代码通过一套输入输出系统来处理,这套系统就叫编程语言(coding language)。不同的语言有不同的用途、优势和局限,但所有编程语言的目标是一致的:把编码者「想要做的事」翻译成计算机「实际执行的动作」。
这让程序员之间能够互相沟通,并以可管理、一致且兼容的术语集合来共享非常复杂的代码。语言是构建各类运营与应用的基础工具,它们帮助企业在竞争激烈的市场中取胜,也促进了组织之间的协作。
从个人层面讲,使用编程语言的好处更容易理解:它让用户用逻辑语句(而非二进制的 0 和 1)来告诉程序该做什么。一旦你掌握了这门语言的逻辑,就能用直观的措辞写出其他程序员也容易理解的命令。
什么是 Apex?能用它做什么?
Apex 是 Salesforce 开发者使用的一种编程语言。它是 Salesforce 平台的一部分,你可以通过开发者控制台(Developer Console)访问它。
这门语言有一系列区别于其他编程语言的特性(稍后会详细介绍)。现在最需要记住的是:Apex 让开发者能够访问 Salesforce 的后端能力,从而创建自己的应用程序,并对已经在业务中使用的平台做更多事情。
与 Java 类似,Apex 把程序员期望的易用性与调用 Salesforce API 的能力结合在一起,这让 Apex 成为任意规模应用开发的强大资源。
开发者用 Apex 对数据做更多处理。从自动化响应事件(如按钮点击)和相关记录更新,到从大型数据集生成洞察,Apex 支持广泛的操作用来把业务需求翻译成编码解决方案。换句话说,它让开发者完成超出 Salesforce 产品开箱即用功能的任务。下面是 Apex 能帮你做的几件事:
- 对多个对象执行复杂的并发校验,并实现自定义校验
- 扩展现有工作流的功能
- 创建集成其他系统的 Web 服务
- 为邮件群发、邮件设置等场景构建电子邮件服务
- 应用个性化的事务逻辑(贯穿整个事务、而非仅针对单条记录或对象的逻辑)
- 在记录被修改时做出响应,或根据触发事件修改相关对象的记录
当然,也要记住:代码是工具,不是解决一切问题的灵丹妙药。很多情况下,一个简单的 Flow 或现有应用往往比从零开始写代码更快、更少迭代就能满足需求。关键在于理解你的所有选择——而 Apex 让那些你确实需要写代码的事情能够轻松与业务集成。
二、了解 Apex 的特性与术语
进入第二单元。本节将深入探索 Apex 的关键特性、数据类型(基本类型、集合、sObject、枚举、类),以及逻辑模式(循环、流程控制、DML、查询)。
Apex 的七大核心特性
Apex 专为开发者易用而设计,因此它具备几项关键特性,非常适合在系统中构建业务逻辑。具体来说,Apex 具有以下七大特性:
- 面向对象(Object-Oriented):Apex 的语法与 Java 等流行编程语言类似,让有经验的程序员很容易上手。例如变量声明、循环语法和条件语句在 Apex 中的用法与 Java 完全一致。
- 基于数据(Based in Data):Apex 以数据为中心,设计用于同时执行多个查询和 DML(数据操作语言)语句,通过 sObject 直接访问记录,无需 ORM 层。
- 强类型(Strongly Typed):Apex 是强类型语言,它直接引用对象(如 sObject),任何无效引用(如被删除或用了错误的数据类型)都会快速失败。与其他语言不同,Apex 通常也不区分大小写。
- 运行在多租户环境(Multitenant Environment):Apex 运行在多租户环境中,其运行时引擎旨在避免「失控代码」这类问题(即查询耗时过长)。易于理解的错误消息加上对违反资源限制代码的自动失败机制,让你避免错误独占处理能力。
- 内置集成支持(Integrated Support):INSERT、UPDATE、DELETE 等 DML 操作以及 DML 异常处理在 Apex 中都有内置支持。它还支持内联 SOQL(Salesforce 对象查询语言)和 SOSL(Salesforce 对象搜索语言)查询。
- 自动升级(Automatically Upgraded):Apex 的功能会随 Salesforce 的能力一起升级,无需单独更新 Apex 本身。不过每个数据 Class 都有 API 版本号,且不会在每个版本发布时更新,从而避免每次 Salesforce 出新版本时代码崩溃。
- 易于测试(Easily Testable):内置的单元测试创建与执行支持,配合告知代码覆盖率的测试结果,帮助你打磨项目。生产环境要求至少 75% 的代码覆盖率。
Apex 的数据类型
用 Apex 写代码时,你会用到多种数据类型,包括:
- 基本类型(Primitives):代码中最简单、最常见的数据类型,包括 Integer、Long、Double、Decimal(数字)、String(文本)、Boolean(真假)、Date、Datetime、Time(时间)、ID(Salesforce 记录 ID)和 Blob(二进制数据)。
- 集合(Collections):由 List(有序、允许重复)、Set(无序、元素唯一)和 Map(键值对)组成,可以存储多条记录。
- sObject:Salesforce 记录表示,一种数据库表,存储关于业务的特定信息,例如标准对象 Account、Contact、Opportunity,自定义对象 MyObject__c,以及动态类型的通用 sObject。
- 枚举(Enums):一种抽象数据类型,定义了一组没有数字顺序的命名常量值,例如 System.TriggerOperation(BEFORE_INSERT 等)。
- 类、对象和接口(Classes, Objects and Interfaces):与 Java 一样,你可以在 Apex 中创建类。类是创建对象的模板或蓝图,对象是类的实例。接口则像是一个所有方法都未实现的类——方法签名存在,但每个方法体都是空的。
接口帮助你把方法(或特定代码块)的实现与其声明分离开来,从而可以为不同应用创建同一方法的不同实现。这些不同的数据类型是 Apex 编程的基石,理解如何使用它们,正是你能为自己的用例构建应用的关键。
Apex 的逻辑模式
Apex 的设计让你感到熟悉。如果你用过其他编程语言,多半会在 Apex 的语法中看到相似之处。需要留意的几个重要语法部分:
- 循环语句(Loop Statement):用于遍历列表,或让某段代码执行指定次数。它让你在满足某个条件之前持续运行代码。循环使用
for和while这类逻辑,根据程序员设定的特定条件来运行特定代码。 - 流程控制语句(Flow Control Statement):Apex 使用
if或switch语句做流程控制,让你基于条件停止或开始执行代码。例如可以在记录被更新时运行代码。 - DML 语句与 SQL 查询:查询从 Salesforce 数据库获取数据,通常是查找特定字段或对象(如 Account 对象)中的数据。DML(数据操作语言)语句允许你插入、更新、删除或以其他方式修改记录。
这些语句合在一起,让你充分利用存储在 Salesforce 实例中的数据,并执行让数据保持最新的操作。所有这些逻辑模式在设计上都是批量安全(bulk-safe)的——始终遍历集合,而不要假设只有单条记录。一旦掌握了这些语言逻辑的基础,你就走上了编写功能性代码、拓展 Salesforce 产品能力之路。
三、用 Apex 编写代码
进入最后一个单元。动手编写真正的 Apex 代码:条件语句、循环语句、触发器语法,并测试你的成果。
条件语句与循环语句
现在术语已经掌握,我们来用 Apex 开发一个简单的应用。在这个例子中,你会做三件事:创建条件语句、创建循环、构建触发器的语法。条件语句、循环和触发器是你在几乎每个项目中都会用到的基本构建块。
条件语句(Conditional Statements),顾名思义:根据某个已定义的条件是否为真,建立特定响应的代码。你可以把它想成一张流程图,告诉程序何时运行特定代码。条件语句可以写成 if 和 else 两种形式。
所有条件语句至少需要 if 条件,else 条件是可选的。else 语句总是与最近的 if 语句关联。实践中,条件语句让你精确地根据定义的变量决定程序采取什么动作。例如,用 if 语句可以只在联系人所在公司员工数达到 10000 或更多时运行某段代码;加上 else 语句则可以对规模较小的公司联系人运行另一段代码。通过把多个条件语句串联起来,你可以构建能响应并兼顾各种变量的程序。
循环语句(Looping Statements)与条件语句类似,让你持续执行设定的代码块,重复运行直到(或只要)满足条件。例如,你可以写一个循环语句,在某个值(如会员忠诚状态)保持为真时自动应用折扣码。
循环语句在更复杂的编码中很有用,尤其是当条件可能频繁变化,或需要高效控制某段代码何时执行时。写循环时可以用几种不同的语法:最常见的是 while 循环——只要满足条件就执行定义的代码块;do-while 语法与之非常相似,但它保证代码至少运行一次;最后,你还可以用 for 语句在满足条件时运行代码特定次数,而不是持续运行。在 Apex 中,for-each 是最常见的模式——遍历 Trigger.new、SOQL 结果、列表时,应优先使用 for-each 而非带索引的 for 循环。
触发器语法与动手实践
触发器语法(Trigger Syntax)和条件语句一样,让你在特定事情发生时运行代码。只不过触发器的「条件」是对任意 Salesforce 记录的变更。例如,你可以在记录被创建、更新、转换或删除时运行代码。
触发器语句非常适合确保相关记录被自动更新,或限制、允许对记录的进一步修改。编写触发器只需:trigger 关键字、触发器名称、与触发器关联的 Salesforce 对象,以及激活触发器的事件。触发器会自动在 DML 操作上运行,无需调度、无需手动调用。触发器上下文变量能告诉你正在发生什么:Trigger.new(新记录版本)、Trigger.old(旧记录版本)、Trigger.isBefore/Trigger.isAfter、Trigger.isInsert/Trigger.isUpdate/Trigger.isDelete,以及当前操作的枚举 Trigger.operationType。
动手实践(Try It Out):准备好试试用 Apex 写代码了吗?你可以使用 Code Builder 访问 Apex。在这个练习中,你要用开发者控制台直接写一个从 10 开始倒计时的循环语句:
- 在 Trailhead Playground 中点击 Setup
- 点击 Developer Console 启动开发者环境
- 点击 Debug | Open Execute Anonymous Window 打开 Enter Apex Code 窗口
- 在 Enter Apex Code 窗口中,用代码创建简单的整数计数(起点为数字 10)
- 用
do操作告诉代码采取行动,用count--操作定义动作为「倒计时」 - 用
while条件定义「关闭」循环的条件——只要计数的整数大于 0 就继续 - 点击 Execute 运行代码,正确的话它会从 10 倒计时到 1,并把每个数字记录到调试日志
虽然 Apex 编程会复杂得多,但循环语句这类基本操作是编写功能性应用的基础。现在你已经了解了 Apex 是什么、探索了它独特的特性,也看到了如何在开发者控制台写代码,可以着手第一个编程项目了。









