【探索Apex开发之】不良的Apex编程习惯
2023年09月12日
文章浏览:378

在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服务失败。


建议:

处理SOQL查询异常

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查询放在循环外就可以了,这里不再赘述。

参考:Error: System.LimitException: Too many SOQL queries: 101

关注 收藏