在Salesforce开发过程中,编写高效、可维护的Apex代码至关重要。然而,很多开发者常常会犯一些错误或者养成不良的编程习惯。下面就是一些常见的不良Apex编程习惯,以及如何避免它们。
1. 硬编码(Hardcoding)
硬编码(Hardcoding)是在编程中将数据直接嵌入到源代码,而不是通过变量或常量引用它们的做法。这样做的问题是,当这些数据需要更改时,必须直接修改源代码并重新部署应用程序。
使用硬编码的值,如RecordId、RecordType名、Field名或其他配置信息,会导致代码在不同的环境或项目中缺乏灵活性甚至出错。
if(acc.RecordTypeId == '012000000000ABC'){
// do something
}
建议:
使用常量、变量或者代码逻辑来动态获取最新的值。
// 动态获取 RecordTypeId
Map<String, Schema.RecordTypeInfo> rtMapByName = Schema.SObjectType.Account.getRecordTypeInfosByName();
if(rtMapByName.containsKey('My_Custom_Type')) {
Id rtId = rtMapByName.get('My_Custom_Type').getRecordTypeId();
// 使用变量进行 SOQL 查询
List<Account> accounts = [SELECT Id, RecordTypeId FROM Account WHERE RecordTypeId = :rtId];
} else {
// 错误处理,例如输出日志或抛出异常
System.debug('RecordType "My_Custom_Type" not found.');
}
2.缺乏异常处理(Lack of Exception Handling)
在Salesforce的Apex编程中,异常处理是一个经常被忽视但非常重要的部分。未进行适当的异常处理可能导致程序在运行时遇到错误而崩溃,甚至可能影响到用户体验和数据完整性。
在Apex代码中,不使用try/catch语句来捕获和处理潜在的运行时错误会增加程序崩溃的风险。
常见未处理的异常场景:
SOQL查询返回无结果。
DML操作(如insert, update, delete等)失败。
空指针异常。
数组越界。
调用外部Web服务失败。
建议:
try {
Account acc = [SELECT Id, Name FROM Account WHERE Id = :someId LIMIT 1];
} catch (QueryException e) {
System.debug('Query Exception: ' + e.getMessage());
// 可以添加更多的错误处理逻辑,比如记录日志或通知管理员
}
处理DML操作异常
Account newAcc = new Account(Name = 'New Account');
try {
insert newAcc;
} catch (DmlException e) {
System.debug('DML Exception: ' + e.getMessage());
// 可以添加更多的错误处理逻辑,比如回滚事务或通知管理员
}
除了上述常见的QueryException和DmlException之外,Apex还有其他类型的异常,例如NullPointerException, ListException, MathException等。这里不再赘述。
参考:Exception Class and Built-In Exceptions
3.SOQL查询在循环内(SOQL Queries Inside Loops)
这个几乎是每个新手都会犯的错误,尤其是java转职过来的朋友。把SOQL查询放在循环外就可以了,这里不再赘述。