Salesforce 开发整理(五)代码开发最佳实践

  在Salesforce项目实施过程中,对项目代码的维护可以说占据极大的精力,无论是因为项目的迭代,还是需求的变更,甚至是项目组成员的变动,都不可避免的需要维护之前的老代码,而事实上,几乎没有任何一个项目的整个周期中,维护人员都是最初的开发人员,所以,合适的编码规范能极大的改善代码的可读性,方便其他开发者,甚至你自己在一段时间之后来阅读,维护你的代码

  首先最重要的是包括对象,字段,进程生成器,工作流,class类,触发器,函数,变量在内的所有API的命名应该是“望文生义”的,也即是说,通过你的API就能推测你的函数功能  

类型

规范

示例

对象API

对象名称单词用下划线连接

WeChat_Account__c

字段API

字段名称单词用下划线连接

WeChat_Account_ID__c

Class

单词连写,首字母大写

OrderItem

Trigger

Trigger名称=对象名+Trigger

AccountTrigger

Handler

Trigger的实现类 = Trigger名+Handler

AccountTriggerHandler

Visualforce页面

页面功能描述

OrderTracking

Vf页面控制类

VF页面的名+Controller

OrderTrackingController

WebService Class

类功能描述+WS

CalculationPriceWS

Batch Class

功能描述+Batch

AutoUpdateAccountStatusBatch

Schedule Class

功能描述+Sch

AutoUpdateAccountStatusSch

测试类

Test_+Class名或Trigger名

Test_OrderItem

常量

全大写,单词与单词之间下划线隔开

PAGE_SIZE

变量

驼峰命名法,尽可能避免单字符

userName

方法名

每个方法前必须加说明包括:参数说明、返回值说明、异常说明。如果方法名实在是太长可以对变量名缩写,但是必须添加相应的说明

checkStatus

上表是一些推荐的命名规范,仅供参考.

  在开发的过称中,需要尽可能的减少if,for循环的嵌套,下面是一个嵌套很深的示例

 1 for(Anyue_CollectionManager_c acm : isReadyKou){
 2     //选择包含指定记录类型的订单
 3     if(list_A.contains(acm.Anyue_Order_r.RecordType.DevelopeName)){
 4         //如果以上映的电影电影数量存在
 5         if(list_ao.size() > 0){
 6             //拼接显示的信息
 7             if(map_ao.containskey(acm.Anyue_Order_c)){
 8                 result += '【'+ acm.Name + '】这里嵌套这么深,在阅读代码的时候看的太难受了';    
 9             }
10         }
11     }
12 }

这段代码可以通过筛选不符合条件的数据,用continue减少if的嵌套层次

 1 for(Anyue_CollectionManager_c acm : isReadyKou){
 2     //剔除不符合记录类型的数据
 3     if(!list_A.contains(acm.Anyue_Order_r.RecordType.DevelopeName)){
 4         continue;
 5     }
 6     //剔除未上映的电影
 7     if(list_ao.size() == 0){
 8         continue;        
 9     }
10     //拼接显示信息
11     if(map_ao.containskey(acm.Anyue_Order_c)){
12         result += '【'+ acm.Name + '】这里就能有效的减少嵌套层级';    
13     }
14 }

同样需要注意的一点是,避免在循环中使用SOQL查询语句以及DML操作。

Salesforce系统限制一次请求不允许超过100个SOQL查询语句,150个DML操作。下面是一个将查询和更新语句放在for循环中的操作

1 trigger ContactTrigger on Contact(after insert){
2     for(Contact c:trigger.new){
3         Account acc = [select id,Name from Account where id=:c.AccountId];
4         acc.Name = c.FirstName;
5         update acc;
6     }
7 }

如果一次执行的数据超过200条,那么就超出了Salesforce的限制,所以我们修改为批量的方法

 1 trigger ContactTrigger on Contact(after insert){
 2     //联系人关联客户id
 3     Set<Id> accIds = new Set<Id>();
 4     for(Contact c : trigger.new){
 5         if(c.AccountId != null){
 6             accIds.add(c.AccountId);
 7         }
 8     }
 9 
10     if(accids.size() > 0){
11         map<Id,Account> accountMap = new map<Id,Account>([select name from Account where id IN:accids]);
12         for(Contact c : trigger.new){
13             if(!accountMap.containskey(c.AccountId)){
14                 continue;
15             }
16             accountMap.get(c.AccountId).Name = c.LastName;
17         }
18     }
19     
20     if(accountMap.size() > 0) update accountMap.values();
21 }

同样的,在使用SOQL语句查询时,需要那些字段就查询那些字段,以提高性能。

最后是代码的注释部分

在类和Trigger的头部添加作者、创建时间、功能描述,如果此类需要修改,那么要记录修改时间,修改人,修改内容简介

/********
    *
    *  作者:Ricardo
    *  创建时间:2018-05-31  
    *  功能描述:
    *         function1() ...
    *         function2() ...
    *  修改人:updatePerson
  * 修改时间:updateTime
* 修改内容:description * ***** public class PrintQuote{
////// code.... }

方法注释应该有适当的说明,位于方法声明之前,包括:说明,参数说明、异常说明、返回值说明和特别说明等

 1 /*******
 2    *
 3    *  描述:单个发送邮件
 4    *  参数:address:邮件地址
 5    *  参数:text:邮件正文
 6    *  返回值:发送结果
 7    *
 8    ****/
 9 public String SendChatter(String address,String text){    
10     //  code....
11 }

针对一些关键的代码逻辑,特殊的变量都应该标记上代码注释,但是需要避免的是写太多无用的代码注释,否则跟不写注释的效果不没有太大的差异

最后是关于在开发中使用RecordTypeId,UserId,记录ID以及角色名称,用户名称等硬码,如果确定有特殊需要,可以使用自定义设置进行配置

开发时适当的遵循编码规范,可以写出简洁,易读,扩展性强,结构好的代码,既有助于自己编码习惯的养成,也能有效降低开发维护的难度,可以说是很有必要的。

以上如有错漏,欢迎指正,如有疑问,欢迎评论区留言探讨

推荐一些Salesforce编码最佳实践的网站

Force.com Apex Code Best Practices

VF页面最佳实践

SOQL(Salesforce Object Query Language)查询

SOOSL(Salesforce Object Search Language)查询

ApexCode最佳实践

Visualforce最佳实践

Force.com集成设计模式与最佳实践

Force.com大数据最佳实践

猜你喜欢

转载自www.cnblogs.com/luqinghua/p/9108950.html
今日推荐