
使用方式
关于
在 Salesforce 平台上编写和调试 Apex 代码,构建 Lightning Web 组件,优化 SOQL 查询,实现触发器、批处理作业、平台事件和集成。用于开发 Salesforce 应用、自定义 CRM 工作流、管理 Governor 限制、批量处理。
Salesforce 开发者
核心工作流程
- 分析需求 - 理解业务需求、数据模型、Governor 限制、可扩展性
- 设计方案 - 选择声明式 vs 编程式,规划批量化,设计集成
- 实现 - 编写 Apex 类、LWC 组件、SOQL 查询,遵循最佳实践
- 验证 Governor 限制 - 验证 SOQL/DML 计数、堆大小和 CPU 时间保持在平台限制内后再继续
- 全面测试 - 编写测试类达到 90%+ 覆盖率,测试批量场景(200 条记录批次)
- 部署 - 使用 Salesforce DX、scratch org、CI/CD 进行元数据部署
参考指南
根据上下文加载详细指导:
| 主题 | 参考 | 加载时机 |
|------|------|----------|
| Apex 开发 | references/apex-development.md | 类、触发器、异步模式、批处理 |
| Lightning Web Components | references/lightning-web-components.md | LWC 框架、组件设计、事件、wire 服务 |
| SOQL/SOSL | references/soql-sosl.md | 查询优化、关系、Governor 限制 |
| 集成模式 | references/integration-patterns.md | REST/SOAP API、平台事件、外部服务 |
| 部署与 DevOps | references/deployment-devops.md | Salesforce DX、CI/CD、scratch org、元数据 API |
约束
必须做
- 批量化 Apex 代码 — 循环前收集 ID/记录,循环外查询/DML
- 编写测试类达到最低 90% 代码覆盖率,包括批量场景
- 使用带索引字段的选择性 SOQL 查询;利用关系查询
- 长时间运行的工作使用适当的异步处理(batch、queueable、future)
- 实现正确的错误处理和日志;使用
Database.update(scope, false)实现部分成功 - 使用 Salesforce DX 进行源驱动开发和元数据部署
禁止做
- 在循环内执行 SOQL/DML(Governor 限制违规)
- 在代码中硬编码 ID 或凭证
- 创建无防护的递归触发器
- 跳过字段级安全和共享规则检查
- 使用已弃用的 Salesforce API 或组件
代码模式
批量化触发器(正确模式)
// CORRECT: collect IDs, query once outside the loop
trigger AccountTrigger on Account (before insert, before update) {
AccountTriggerHandler.handleBeforeInsert(Trigger.new);
}
public class AccountTriggerHandler {
public static void handleBeforeInsert(List<Account> newAccounts) {
Set<Id> parentIds = new Set<Id>();
for (Account acc : newAccounts) {
if (acc.ParentId != null) parentIds.add(acc.ParentId);
}
Map<Id, Account> parentMap = new Map<Id, Account>(
[SELECT Id, Name FROM Account WHERE Id IN :parentIds]
);
for (Account acc : newAccounts) {
if (acc.ParentId != null && parentMap.containsKey(acc.ParentId)) {
acc.Description = 'Child of: ' + parentMap.get(acc.ParentId).Name;
}
}
}
}
// INCORRECT: SOQL inside loop — governor limit violation
trigger AccountTrigger on Account (before insert) {
for (Account acc : Trigger.new) {
Account parent = [SELECT Id, Name FROM Account WHERE Id = :acc.ParentId]; // BAD
acc.Description = 'Child of: ' + parent.Name;
}
}
Batch Apex
public class ContactBatchUpdate implements Database.Batchable<SObject> {
public Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator([SELECT Id, Email FROM Contact WHERE Email = null]);
}
public void execute(Database.BatchableContext bc, List<Contact> scope) {
for (Contact c : scope) {
c.Email = 'unknown@example.com';
}
Database.update(scope, false);
}
public void finish(Database.BatchableContext bc) {}
}
// Execute: Database.executeBatch(new ContactBatchUpdate(), 200);
测试类
@IsTest
private class AccountTriggerHandlerTest {
@TestSetup
static void makeData() {
Account parent = new Account(Name = 'Parent Co');
insert parent;
Account child = new Account(Name = 'Child Co', ParentId = parent.Id);
insert child;
}
@IsTest
static void testBulkInsert() {
Account parent = [SELECT Id FROM Account WHERE Name = 'Parent Co' LIMIT 1];
List<Account> children = new List<Account>();
for (Integer i = 0; i < 200; i++) {
children.add(new Account(Name = 'Child ' + i, ParentId = parent.Id));
}
Test.startTest();
insert children;
Test.stopTest();
List<Account> updated = [SELECT Description FROM Account WHERE ParentId = :parent.Id];
System.assert(!updated.isEmpty(), 'Children should have descriptions set');
}
}
输出模板
实现 Salesforce 功能时,提供:
- Apex 类/触发器(批量化)
- LWC 组件(如适用)
- SOQL 查询(优化的)
- 测试类(90%+ 覆盖率)
- 部署说明
知识参考
Salesforce、Apex、LWC、SOQL、SOSL、Governor 限制、Salesforce DX、Platform Events、Batch Apex、Queueable、Future、REST API
兼容工具
Claude CodeCursor
标签
后端开发

